JIS X0213:2004フォントを使えるようにする
とりあえず、UCS-2の範囲のみ正しく表示できるようにしてみました。
この画面例は、Windows XP上のSqueak内で、IPAフォント(JIS X0213:2004)とMS明朝(JISX0208)を設定したMorphに同じ文字列を(違った字形で)表示した例です。
Windows Vistaは標準でJIS X0213:2004フォントだけが載っています。試してませんが、この対応により標準のTrueTypeフォントを使えるはずです。
!TTCFontReader methodsFor: 'as yet unclassified' stamp: 'KR 10/24/2007 21:30'! decodeCmapFmtTable: entry | cmapFmt length cmap firstCode entryCount segCount segments offset code | cmapFmt _ entry nextUShort. ((cmapFmt = 0) or: [cmapFmt = 4] or: [cmapFmt = 6]) ifTrue: [ length _ entry nextUShort. entry skip: 2. "skip version"] ifFalse: [ entry skip: 2. "reserved" length _ entry nextULong. entry skip: 4. "language" ]. cmapFmt = 0 ifTrue: "byte encoded table" (既存コードと同じなので中略) cmapFmt = 4 ifTrue: "segment mapping to deltavalues" (既存コードと同じなので中略) cmapFmt = 6 ifTrue: "trimmed table" (既存コードと同じなので中略) cmapFmt = 12 ifTrue: "segmented coverage" [|groupCount groups | groupCount _ entry nextULong. groups _ Array new: groupCount. groups _ (1 to: groupCount) collect: [:e | Array new: 3]. 1 to: groupCount do: [:i | (groups at: i) at: 1 put: entry nextULong. "StartCharCode" (groups at: i) at: 2 put: entry nextULong. "endCharCode" (groups at: i) at: 3 put: entry nextULong. "startGlyphID" ]. cmap _ Array new: 65536 withAll: 0. groups do: [:group | offset _ 0. (group first) to: (group second) do: [:i | code _ group last + offset. i < 65536 ifTrue: [ cmap at: i + 1 put: (code \\ 16r10000). ]. offset _ offset + 1. ] ]. ^cmap. ]. ^ nil! !