13日に書いた,
Okularの注釈(インラインテキスト)で日本語文字が表示できない件について探っている。
原因はPopplerの方にあるのだろうと思われる。
GfxFont::makeFontの中でGfx8BitFontでなくGfxCIDFontが呼び出されるためには,
getFontTypeでfontCIDType0が帰らなくてはいけないのだが,
そのためにはfontDictにいろいろ設定がなされていなくてはいけない。
Annot.ccのcreateAnnotDrawFont内でfontDictを作っているが,
これにはBaseFont,Subtype,Encodingしか設定されていない。
しかしGfxFont::getFontTypeでfontCIDType0が返るためには,
最低でもDescendantFontsを設定する必要がある
以上のことで日本語文字は表示されるようになったが,
英字の表示がおかしい。
文字幅が日本語文字と同じになっている様子。
Annot::layoutTextから呼んでいるGfxFont::getNextChar(から継承しているGfxCIDFont::getNextChar)
がGfxCIDFont::widthsを参照しているのだが,
これの設定はGfxCIDFontコンストラクタに渡されるfontDictから情報を得ている。
結局fontDictに戻ってくるわけだ。
フォントを指定すればfontDictが得られるような仕組みくらいないとおかしいんだけど,
それがまだ見つけられない。
そもそもこんなことになっているのは,
AnnotFreeText::generateFreeTextAppearanceでGfxFont::makeFontを呼び出すことになっていて,
そのときのfontDictはfontDictionaryから取り出されたもので,
そのfontDictionaryはfontResoucesから取り出されたもので,
そのfontResourcesはresDictから,
そのresDictはresourceObjから,
そのresouceObjはformからそれぞれ取り出されているのだけど,
肝心のformがdocから取り出されたCatalogにあるはずなのに,それが見つからないのだ。
コメントに「そんなときはてきとーにHelveticaにしとく」と書いてある通りになっていて,
第一段落で書いたのはそのHelveticaを無理やり変更したという話。
そんなわけでCatalogのコードを読む。
Catalog::getFormではacroFormから生成されたFormが返されるので,
acroFormについて調べることにする。
Catalogコンストラクタの中で,
acroFormはcatDictから取り出されており,
catDictはxrefから取り出されている。
あれ,acroFormがNullだ…詰んだ。