Safari はいい加減アレなので Firefox にしようかと思った。Mac の Firefox は Windows に比べるとまだまだなので CVS head をベースにいろいろ手を加えてみる。
MLTE patch
まず、Bug 121540 - Use ATSUI for text rendering on Mac OS X から山下さんの MLTE adaptation v7.5 をあてて nsMacFonts.h, nsMacFonts.cpp をコピー。ここから、いろいろ quick hack を足していきます。
Bold
Gecko は strong が font-weight: 401 らしいので (なんで?)、nsMacFontFamily::TypefaceForStyle の先頭で
if (aWeight == 401) {
aWeight = 700;
}
さらに「ATSUI 経由でレンダリングされるのはヒラギノだけで、ヒラギノには太字がある」というひどい決め付けから、nsATSUIToolkit::CreateATSUStyle で
Boolean isBold = false;
これで W6 をさらに計算で太字にする、という状況をさけられる。
Thebes だとちゃんと bold を持っているかみるように Bug 325165 - implement thebes@mac text/font support でなってるみたいなので、そのうち backport されるはず。
Leading
このままだと、ヒラギノ部分の descent がやたら高くなる (ねこめしにっき(2004年11月前半)) ので、ちょっと修正。
Bug 109176 - Japanese hiragino text slided up within big button/drop-menu/... にあるように、ヒラギノが他のフォントと違うのは leading の値で、ATSUI が leading を考慮して rendering した後に、さらに Gecko が行間をつけちゃうので、やたら高くなるっぽい。
そういうわけで、nsATSUIToolkit::GetTextDimensionsForATSUStyle と nsATSUIToolkit::GetBoundingMetrics の ATSUCreateTextLayoutWithTextPtr の後に、
ATSUAttributeTag tags[] = { kATSULineLayoutOptionsTag };
ByteCount sizes[] = { sizeof(ATSLineLayoutOptions) };
ATSLineLayoutOptions options = kATSLineIgnoreFontLeading;
ATSUAttributeValuePtr values[] = { &options };
err = ::ATSUSetLayoutControls(theLayout, 1, tags, sizes, values);
if (noErr != err) {
NS_WARNING("ATSUSetLayoutControls failed");
return NS_ERROR_FAILURE;
}
なんてのを足して ATSUI に leading を無視させる。
これだけだと "」" の水平線部分とかが underline にかぶっちゃうので、nsFontMetricsMac::GetUnderline で
aOffset = -NSToCoordRound(2 * dev2app);
する。ただ、これをやると欧文の underline が Safari より 1pixel 下がっちゃう。
More
ここまででフォントの rendering は Safari とほとんど同じレベルになる。
form が質素すぎるのは、[FX] Pu7o: 02-18 (1.8.0.x/OSX Unibin) - Native Aqua Widgets! - MozillaZine Forums の --enable-default-toolkit=mac で Cocoa widget というのを試してみたけど、まだ微妙な出来。
スクロールが遅いのは……やっぱり Thebes 待ちかなー。Thebes が Cairo 経由 で Quartz 使うようになると本当にはやくなるんでしょうか。