Better Firefox for Mac

April 3rd, 2006

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 使うようになると本当にはやくなるんでしょうか。