2008-06-15

Re: canvas で文字を表示してみる

ポスト @ 11:38:21 | canvas, mozilla

Firefox 3 から canvas 要素で文字を描けるようになりました。で、その例を色々みてみると、描画内容を初期化するために canvas 要素の widthheight プロパティを弄っている例が多いです。しかし ctx.clearRect() で十分です。

ただし ctx.clearRect() ctx.translate() 等の変形の影響を受けるので、 ctx.save() ctx.restore() をお忘れなく (あるいは ctx.setTransform(1, 0, 0, 1, 0, 0))。

ということで、higeorange さんの例を勝手に弄ってみます。higeorange さんのコードを以下に示します。

var canvas = $('cnvs');
    canvas.width = 300;
    canvas.height = 100;
var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, 300, 100);
    ctx.translate(10, 50);
    ctx.fillStyle = "Red";
    ctx.mozTextStyle = "30pt sans-serf";
    ctx.mozDrawText(txt);

ctx.clearRect() を使っておられるわけですが、たとえば以下のように書けます。

var canvas = $('cnvs');
var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, 300, 100);
    ctx.save(); // コンテクストの状態を保存
    ctx.translate(10, 50);
    ctx.fillStyle = "Red";
    ctx.mozTextStyle = "30pt sans-serf";
    ctx.mozDrawText(txt);
    ctx.restore(); // コンテクストの状態を save() した時の状態に復帰

あるいは以下のようにも書けます。

var canvas = $('cnvs');
var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, 300, 100);
    ctx.translate(10, 50);
    ctx.fillStyle = "Red";
    ctx.mozTextStyle = "30pt sans-serf";
    ctx.mozDrawText(txt);
    ctx.setTransform(1, 0, 0, 1, 0, 0); // 変形行列を単位行列に

蛇足 1

Firefox 3 でのテキスト API は独自のものですが、mozilla-central では既に HTML 5 草案の API に対応しています。

蛇足 2

canvas 要素の widthheight を設定すると、Gecko は描画対象 (gfxASurface) と描画コンテクスト (gfxContext) を一度破棄してから再度作成・初期化します。

一方、 ctx.clearRect() は描かれている領域の一部をクリアするだけで、 surface を破棄したり再作成したりということはありません。