しばらく前に同じものを探していたので、この質問に出くわしました。つまり、HTML キャンバス内で「evenodd」塗りつぶしルールを使用します。
少し調査し、メーリング リストとパッチを調べた結果、最近のバージョンの Firefox と Chrome の両方でこれがサポートされていることがわかりましたが、それぞれのブラウザ固有の方法が異なります。
Firefox では、mozFillRule 属性を使用するだけです。例:
//
// Firefox Example
//
// canv has the HTML canvas element
var ctx = canv.getContext("2d");
ctx.fillStyle = "#ff0000";
ctx.mozFillRule = 'evenodd';
ctx.beginPath();
ctx.moveTo(100, 10);
ctx.lineTo(40, 180);
ctx.lineTo(190, 60);
ctx.lineTo(10,60);
ctx.lineTo(160,180);
ctx.closePath();
ctx.fill();
Chrome では、文字列evenoddをパラメーターとしてfill
メソッドに渡すことでこれを行います。例:
//
// Chrome Example
//
// canv has the HTML canvas element
var ctx = canv.getContext("2d");
ctx.fillStyle = "#ff0000";
ctx.beginPath();
ctx.moveTo(100, 10);
ctx.lineTo(40, 180);
ctx.lineTo(190, 60);
ctx.lineTo(10,60);
ctx.lineTo(160,180);
ctx.closePath();
ctx.fill('evenodd');
これらは私が調査した 2 つのブラウザーなので、他のブラウザーでの状態についてはわかりません。うまくいけば、そう遠くない将来に、現在HTML 標準fillRule
の一部となっている属性を介してこの機能を使用できるようになるでしょう。