Opera で HTML5::Canvas の fillText() をサポートできないかな

今日も HTML5::Canvas ネタです。

Opera は、Text API(fillText, strokeText) や Shadow API をいつまでも実装してくれないので、Canvasクロスブラウザで使う上でのネックになっています。最新の Opera10α でも サポートされていません。
Firefox2.x や Firefox3.0 でも Text API が使えません。


「ブーブー言うだけなら豚でもできる。でも俺たちは技術者だぜ?」ってなワケで、できるだけ近い形になるよう実装してみました。



やってることは単純で

  • CanvasRenderingContext2D.prototype.fillText を上書する
    • Canvas 要素の真上に div 要素を配置し、div.innerText = "テキスト" で描画。
  • CanvasRenderingContext2D.prototype.clearRect もフックして fillTextの内容を消す

スケーリングもサポートする予定ですが、マトリクス変換(斜めに回転とか)やパターンフィルやグラデーションフィルはサポートできません。
テキストを上に描画するだけです。

追記

以下のブラウザで、HTML5::Canvas Text API の擬似的なレンダリングをサポートするように機能を追加しました。

  • Firefox2.0系
  • Firefox3.0系
  • Opera9.2系
  • Opera9.5系
  • Opera9.6系
  • Opera10.0系

また、Opera9.5x 以降なら、text-shadow を表現可能になりました。

制限事項等は以下になります。

  • scale, rotate, translate, transform, setTransform の効果は無効です。
  • globalAlpha は有効です。
  • globalCompositeOperation の効果は無効です。
  • fillText() は機能します。
  • strokeText() は fillText() と同じ結果になります。
  • measureText() は { width: 0, height: 0 } の Hash オブジェクトを返します。 TextMetrics Objectを返します。
  • fillStyle, strokeStyle には 色文字列("#ffffff" や "rgba(,,,)") が指定できます。グラデーションやパターンは指定できません(無効です)。
  • shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor は Opera9.5x 以降で有効です。Firefox2.0, Firefox3.0 では無効です。
  • font は有効です。
  • textAlign は無効です。"start"(デフォルト値, 左寄せ) が指定されたものとしてレンダリングします。は有効です。
  • textBaseline は無効です。"top" が指定されたものとしてレンダリングします。


今回の機能拡張により、IE6+, Safari3+, Google Chrome, Firefox2+, Opera9.2x+ といったメジャーブラウザで、基本的な Text API が利用可能になります。


反省会

  • かっこいいこと言って期待させといて、またなんちゃって実装かよ!
  • 実装できそうな機能は、あらかた実装し終えたので、そろそろメジャーリリース(ver 1.0) する頃合かもね