chromium/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.globalCompositeOperation.html

<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
<link rel="match" href="2d.layer.globalCompositeOperation-expected.html">
<title>Canvas test: 2d.layer.globalCompositeOperation</title>
<h1 style="font-size: 20px;">2d.layer.globalCompositeOperation</h1>
<p class="desc">Checks that layers work with all globalCompositeOperation values.</p>

<div style="display: grid; grid-gap: 4px;
            grid-template-columns: repeat(7, max-content);
            font-size: 13px; text-align: center;">
<span>
  <div>source-over</div>
  <canvas id="canvas0" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'source-over';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas0");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>source-in</div>
  <canvas id="canvas1" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'source-in';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas1");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>source-atop</div>
  <canvas id="canvas2" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'source-atop';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas2");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>destination-over</div>
  <canvas id="canvas3" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'destination-over';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas3");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>destination-in</div>
  <canvas id="canvas4" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'destination-in';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas4");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>destination-out</div>
  <canvas id="canvas5" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'destination-out';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas5");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>destination-atop</div>
  <canvas id="canvas6" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'destination-atop';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas6");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>lighter</div>
  <canvas id="canvas7" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'lighter';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas7");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>copy</div>
  <canvas id="canvas8" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'copy';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas8");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>xor</div>
  <canvas id="canvas9" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'xor';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas9");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>multiply</div>
  <canvas id="canvas10" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'multiply';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas10");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>screen</div>
  <canvas id="canvas11" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'screen';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas11");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>overlay</div>
  <canvas id="canvas12" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'overlay';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas12");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>darken</div>
  <canvas id="canvas13" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'darken';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas13");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>lighten</div>
  <canvas id="canvas14" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'lighten';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas14");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>color-dodge</div>
  <canvas id="canvas15" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'color-dodge';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas15");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>color-burn</div>
  <canvas id="canvas16" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'color-burn';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas16");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>hard-light</div>
  <canvas id="canvas17" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'hard-light';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas17");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>soft-light</div>
  <canvas id="canvas18" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'soft-light';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas18");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>difference</div>
  <canvas id="canvas19" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'difference';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas19");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>exclusion</div>
  <canvas id="canvas20" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'exclusion';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas20");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>hue</div>
  <canvas id="canvas21" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'hue';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas21");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>saturation</div>
  <canvas id="canvas22" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'saturation';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas22");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>color</div>
  <canvas id="canvas23" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'color';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas23");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

<span>
  <div>luminosity</div>
  <canvas id="canvas24" width="90" height="90" style="outline: 1px solid">
    <p class="fallback">FAIL (fallback content)</p>
  </canvas>
  <script type="module">
    const canvas = new OffscreenCanvas(90, 90);
    const ctx = canvas.getContext('2d');

    ctx.translate(50, 50);
    ctx.scale(2, 2);
    ctx.rotate(Math.PI);
    ctx.translate(-25, -25);

    ctx.fillStyle = 'rgba(0, 0, 255, 0.8)';
    ctx.fillRect(15, 15, 25, 25);

    ctx.globalAlpha = 0.75;
    ctx.globalCompositeOperation = 'luminosity';
    ctx.shadowOffsetX = 7;
    ctx.shadowOffsetY = 7;
    ctx.shadowColor = 'rgba(255, 165, 0, 0.5)';

    ctx.beginLayer();

    ctx.fillStyle = 'rgba(204, 0, 0, 1)';
    ctx.fillRect(10, 25, 25, 20);
    ctx.fillStyle = 'rgba(0, 204, 0, 1)';
    ctx.fillRect(25, 10, 20, 25);

    ctx.endLayer();

    const outputCanvas = document.getElementById("canvas24");
    const outputCtx = outputCanvas.getContext('2d');
    outputCtx.drawImage(canvas, 0, 0);
  </script>
</span>

</div>