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

<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
<html class="reftest-wait">
<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>
<script>pending_tests = 25;</script>

<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 id="myWorker0" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker0').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas0');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker1" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker1').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas1');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker2" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker2').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas2');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker3" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker3').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas3');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker4" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker4').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas4');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker5" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker5').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas5');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker6" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker6').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas6');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker7" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker7').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas7');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker8" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker8').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas8');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker9" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker9').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas9');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker10" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker10').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas10');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker11" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker11').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas11');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker12" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker12').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas12');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker13" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker13').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas13');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker14" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker14').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas14');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker15" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker15').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas15');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker16" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker16').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas16');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker17" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker17').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas17');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker18" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker18').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas18');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker19" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker19').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas19');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker20" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker20').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas20');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker21" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker21').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas21');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker22" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker22').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas22');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker23" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker23').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas23');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </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 id="myWorker24" type="text/worker">
    self.onmessage = function(e) {
      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 bitmap = canvas.transferToImageBitmap();
      self.postMessage(bitmap, bitmap);
    };
  </script>
  <script type="module">
    const blob = new Blob([document.getElementById('myWorker24').textContent]);
    const worker = new Worker(URL.createObjectURL(blob));
    worker.addEventListener('message', msg => {
      const outputCanvas = document.getElementById('canvas24');
      const outputCtx = outputCanvas.getContext('2d');
      outputCtx.drawImage(msg.data, 0, 0);
      if (--pending_tests == 0) {
        document.documentElement.classList.remove('reftest-wait');
      }
    });
    worker.postMessage(null);
  </script>
</span>

</div>
</html>