アットウィキロゴ

CMGlyphDrawing

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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。