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! !