この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2008年4月)

2008年4月19日

Bug-org 426616 Acid2 chin is 1px too tall in FF3b5
初回投稿日時: 2008年04月19日02時36分13秒
最終更新日時: 2008年04月19日02時36分46秒
カテゴリ: Mozilla Core バグ修正
SNS: (list)

Acid2の顎の部分が1px高くなったというバグです。Bug 6069のregressionで、下線のために必要なスペースが、ベースラインの下に1pxの空間を空けた後、更に1px下に下線を引くため、最低でもdescentが2px確保されてしまう、というのがバグの原因でした。

問題のフォントではfont-size: 2px;の時にWindowsではascentが2px、descentが0pxという結果になり、ascent 2pxと下線のための2pxで合計4pxの高さが確保されていたため、顎がのびてしまった訳です。(なぜ2pxじゃなく、1pxしか延びなかったのかはよく分かりませんが、あの複雑なテストをこの繁忙期に見ている余裕はありません……)

そこで、下線位置がdescentスペースよりも下側になってしまう場合、次のような処理を行うようにしました。

  1. ascentが1px未満の場合、上線、取消線、下線全ての描画を諦め、太さを0pxに設定
  2. それ以外の場合で、下線位置がおかしい一部のフォントではない場合で、なおかつ下線がdescentのスペースに描画しきれない場合
    1. 下線の太さがmaxDescentよりも大きい場合、下線の太さをmaxDescentの高さに設定
    2. 下線の位置をmaxDescentの下端からサイズ分上の位置に設定(つまり、下線の下端がmaxDescentの下端と一致するように設定)
  3. 取消線の上端がmaxAscentに納まりきらない場合
    1. 取消線の太さがmaxAscentよりも大きい場合、取消線の太さをmaxAscentの高さに設定
    2. 取消線の中央がmaxAscentの中央になるように設定
  4. 上線の太さがmaxAscentより大きい場合、上線の太さをmaxAscentと同じに設定、なお、上線と下線の太さは常に同じ(同じ変数)で、上線の上端は常にmaxAscentの上端です。

なお、MS PGothic等の下線位置に補正が必要なフォントは下線位置を再補正しないため、このバグと同じ理由でAcid2をクリアできません。しかし、これは今のところ修正予定はありません。ユーザにとってはAcid2のクリアよりも、これらのフォントでも読みやすいレンダリングが高速に行われることが重要だからです(今のGeckoの設計では、パフォーマンスを犠牲にしないと修正できないかもしれません。しかし、もし、上記のようなややこしい補正処理をこれらのフォントでも、普段のレンダリングを壊さずにできるコードが書くことができれば、パフォーマンスを犠牲にしなくてもできますが、残念ながら今の私にはそれを考える時間的余裕はありません)。

関連するかもしれないエントリ

bug-org 426616を含むエントリ