CMGlyphDrawing
なにをどうやってどう使えばいいのか?
縦書き属性はつけられるのか?
つけられるとしたらどこか?
具体的にどうやってつけるか?
目的:再実装 CGFontGetGlyphsForUnichars(CGFontRef, unichar[], CGGlyph[], size_t)
なぜ?:iPhone上で使うことを許されていない。これでアプリ作るとアップルにリジェクトされる。
なぜ必要?:UIString drawing はスレッドセーフではない、PDF drawing はフォントを埋め込まないなのでUIString drawingは不可能
どんな動作?:フォントのcmap tableを取ってきて
right segmentを見つける(platform0と3、format4と12を見るつけることができる)
全てのサブシーケンスのためのplatform+formatをピック
キャッシュセレクション
それぞれのユニキャラは、選択されたcmapセグメントの中のキャラクタを調べる(4か12)
どれくらいうまく動作?:
これは試験ソース含んでいる。我々の関数とアップルによって、全ての65536ユニキャラがテストされた。
一般的な試験で、すべてに置いて完璧な結果が出た。
現在の例外フォント
+AppleGothic、キャラ55424からとそれ以上で、約300キャラミスマッチ
+STHeitiTC-Light と STHeitiTC-Medium で1キャラミスマッチ
なぜうまくいかない?:私は知らない
改善の余地:
+キャッシュを良くする
+サーチを高速にする
+もっとフォーマットを追加する
+マイナーな現状を対処する
他の読み物
アップルデベロッパーTTRefMan
cocos2d-iphoneのFontLabel、StringDrawing
dlfcn#ダイナミックローディング用ヘッダファイル
data.get_uint16_with_byte_index(index)# dataの中から、指定indexから16bit取り出す
data.get_uint32_with_byte_index(index)# dataの中から、指定indexから32bit取り出す
data.get_uint16(index)# dataの中から、指定indexの16bitを取り出す
class CMap4
def initialize()
@length
@language
@seg_count
@seg_countx2
@search_range
@entry_selector
@range_shift
@end_code
@start_code
@id_delta
@id_range_offset
@glyph_index_array
end
end
CMapCache = {}
cg_font.get_CMap_for_font
cmap.get_glyph_index_for_unichar(uc)
font_table.create(segment_offset)
cmap.release
def [[CGFont]].get_glyphs_for_unichars(unichars, glyphs, num_glyphs)
cmap = cg_font.get_cmap_for_font
unichars.each_with_index{|unichar, index|
glyphs[index] = cmap.get_glyph_index_for_unichar(unichar)
}
end
def CGFont.get_cmap_for_font
if CMapCache.empty? then
end
# full_name = self.copy_full_name
return cmap unless (cmap = CMapCache[full_name]).empty?
font_table = cg_font.copy_table_for_tag('cmap')
if !font_table.nil? or !font_table.empty? then
version, subtable_count = 0, 0
version, subtable_count =
font_table.get_uint16_with_byte_index(0), font_table.get_uint16_with_byte_index(2)
segment_offset, platform_id = 0, 0
end
end
最終更新:2010年06月21日 19:32