borderの太さが一定しないというバグ。
dbaronがcomputed valueの段階で丸めるべきだと言ってたが、CSS2.1仕様とは食い違うのでそれはマズイと言ったら、珍しく私の方が正しかった。というわけで、内部的にはちょっと面倒な形になってしまっている。
実際の修正内容はCSSのborderの情報を格納している構造体をちょちょいといじっただけなのだが、問題が問題なので結構てこずった。今まではspecified value(ただし、長さは内部処理用のtwipsに変換されている)とcomputed valueの二種類を内部で持っていたが、実際にはレンダリング用のactual valueが必要なわけだ(actual valueでレイアウトもやってしまおうというのがdbaronの案)。で、actual valueを新規に保持してしまうと、メモリ使用量が上がってしまうので、どうするか悩んだのだが、調べてみると、計算無しにspecified valueとactual valueからcomputed valueが導き出せるようなので、computed valueを保存していたところにactual valueを保存することにした。これでメモリ消費を抑えることができた。しかし、actual valueをspecified valueに変換する際にtwipsから物理ピクセルへの変換情報が必要なので、それをキャッシュするために4バイト使ってしまった(増えてしまった)。だが、今のところこれは仕方がないだろう。悩んだものの、良い解決策は思いつかなかった。
で、実際にどういうことをやるようにしたかと言うと、まず、specified valueがゼロの場合は、actual valueもゼロに、それ以外の場合は最低でも1物理ピクセルを確保するようにした。また、specified valueが物理ピクセルに対して端数がある場合、近い方の物理ピクセルに丸めるようにしている。
つまり、actual valueがゼロならゼロ、それ以外ならspecified valueがcomputed valueになるわけである。
これでIEとは互換がとれたが、Operaは何故かゼロに丸めてしまう。単純な四捨五入だけやっているということなのだろうか。だが、この処理はWebデザイナの意図をくみ取れていないと思う。borderが非ゼロなら、デザイナは線を引こうとしたのだから、表現可能な最低限の太さで表示させるべきだと私は思う。
更に、dbaronの調査によると、safariは切り捨て、KonquerorはIEと同じらしい。うーむ。まだ揉めてるのかな?
また、同じような仕様のoutlineに関しても同様の処理を入れている。今まではborderとoutlineの間に隙間ができることがあったが、この修正でそれも解消している。(アンチエイリアシングの問題で微妙な隙間ができることはまだあるが。) ただ、元からoutlineの内部処理はborderと若干異なっているのでソースを読む方は注意して欲しい。