Firefox 3 のフルページズーム使用時はスクリーン上でのピクセル量とCSS上でのピクセル量は一致しない

Firefox 3 Alpha に搭載されたフルページズーム(テキストと画像をともに拡大/縮小する機能)を使った場合、CSS レイアウトの座標上での「1ピクセル」という単位は、必ずしも画面上での1ピクセルに一致しないことになる。例えばフルページズーム機能でページを2倍に拡大した状態だと、CSSでの1pxのborderがスクリーン上では2pxとして表示される(下図参照)。

左:Firefox 2.0.0.5 で「文字サイズ」を約2倍に拡大した表示例
右:Firefox 3.0a8pre でフルページズームを使って2倍に拡大した表示例
Full Zoom

問題が生じるケース

All-in-One Gestures のマウストレイル(マウスジェスチャの軌跡描画機能)は、マウスポインタの移動に応じてスクリーン上の座標 (event.screenX, event.screenX) が変化したピクセル量分だけの点をページ上に配置することによって線を描画するという仕様である。
フルページズームでページを2倍に拡大した状態だと、スクリーン上の座標で4px移動しても、実際のCSSの座標上では2px分という計算になるが、現時点の AiOG のマウストレイルの実装はこれを考慮していない。したがって、 AiOG を無理やり Firefox 3 上で使用すると、スクリーン上の座標で4px移動したときもCSSの座標上で4px分の点を配置するため、実際のスクリーン上では8pxとして表示されてしまう。なおかつ、線の太さが2倍になる、軌跡の位置がマウスポインタから大きくずれるといった問題点が生じる。

結論

フルページズーム機能搭載に伴い、スクリーン上でのピクセル量とCSS上でのピクセル量が一致するという前提はもはや崩れ去った。両者の整合性を取るためには、 nsIMarkupDocumentViewer::fullZoom 値を常に意識する必要がある。例えば現在フォーカスしているブラウザの fullZoom 値は、以下のようにして取得可能である。

gBrowser.mCurrentBrowser.markupDocumentViewer.fullZoom

TOP

TOP