らんだむな記憶

blogというものを体験してみようか!的なー

GlyphsTracePlugin

GitHub - schriftgestalt/GlyphsTracePlugin が手元の環境 (Big Sur + Glyphs 2.6.6 (1352)) でうまく動作しない。Trace Image Filter Does not work - Scripting - Glyphs Forum の現象の 1 つなのかもしれない。ので調べた。

https://github.com/schriftgestalt/GlyphsTracePlugin/blob/a2bfd1a579916d6ed5b74315aecb0259a6cdd875/TraceImage/TraceImage.m#L123 の箇所の Result"(\n)\n" になっているのが原因だったんだけど、何が起こっているのか追跡するために、potrace のプロセスに Xcode でアタッチすることにした。Plugin を Debug ビルドしておいて、見たい箇所にブレークポイントを置いて、

f:id:derwind:20211203213558p:plain

のように、[Debug] -> [Attach to Process by PID or Name...] で potrace を指定して待機しておくと、Plugin が potrace を起動したタイミングで Xcode がアタッチしてくれる。https://github.com/schriftgestalt/GlyphsTracePlugin/blob/a2bfd1a579916d6ed5b74315aecb0259a6cdd875/potrace-1.13/src/backend_Glyphs.c#L195write_paths が何も書き出してくれないのでダメだということが分かった。これは第 2 引数の plistNULL であることで起こっていた。

もっと追いかけると、https://github.com/schriftgestalt/GlyphsTracePlugin/blob/a2bfd1a579916d6ed5b74315aecb0259a6cdd875/potrace-1.13/src/decompose.c#L436 でずっと NULL が返っていそうで、found に至っていないようだった。find the next set pixel in a row <= y ができなかったということになる。Xcode 上では画像の幅と高さとして正しいものが見えていたのだが、potrace 用に内部で画像フォーマットを変換?した際に真っ白な画像にでもなっているのだろうか・・・。

ポインタの先からどういう画像か割り出すのが大変すぎるし、その画像?みたいなのは多分 Plugin の本体側でよろしくやっているものであろうが、そこは Xcode で踏み込めないので一旦断念・・・。Xcode の力強さは凄いけど、Plugin のデバッグはつらすぎた・・・。

ここまでのまとめ

  • write_paths が何も書き出してくれない。

もうちょっと頑張ってみる。https://github.com/schriftgestalt/GlyphsTracePlugin/blob/a2bfd1a579916d6ed5b74315aecb0259a6cdd875/TraceImage/TraceImage.m#L110potrace 用の .bmp を作成しているので、TempSaveString の内容を確認して毎回その辺に .bmp が作成されるはずという当たりをつける。で、見てみたのだけど、やはり真っ白な画像になっていた。https://github.com/schriftgestalt/GlyphsTracePlugin/blob/a2bfd1a579916d6ed5b74315aecb0259a6cdd875/TraceImage/TraceImage.m#L105-L114 辺りの処理?何で?

ここまでのまとめ

  • 真っ白な .bmp ができていて potraceピクセルを見つけられない。

なお、Glyphs を cutting edge version の Version 2.6.7 (1357) にしてみても特に変化はなさそうだった。

Objective-C の binding を使って Python でマクロパネルから実行してみる。

layer = Glyphs.font.selectedLayers[0]
image = layer.backgroundImage
bitmap = image.image.flatImageRep()
bmp_data = bitmap.representationUsingType_properties_(1, None)
bmp_data.writeToFile_atomically_('/Users/xxx/yyy/test.bmp', False)

あれ?見事に白いぞ・・・。なんてこった・・・。

jpg_data = bitmap.representationUsingType_properties_(3, None)
jpg_data.writeToFile_atomically_('/Users/xxx/yyy/test.jpg', False)

など、.tiff, .jpg, .png ならいける・・・。

ここまでのまとめ

  • 期待する内容で Windows BMP が保存されていなかった・・・。