chromium/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.non-invertible-matrix.with-render-states-and-filter.html

<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
<link rel="match" href="2d.layer.non-invertible-matrix.with-render-states-and-filter-expected.html">
<title>Canvas test: 2d.layer.non-invertible-matrix.with-render-states-and-filter</title>
<h1>2d.layer.non-invertible-matrix.with-render-states-and-filter</h1>
<p class="desc">Test drawing layers when the transform is not invertible.</p>
<canvas id="canvas" width="200" height="200">
  <p class="fallback">FAIL (fallback content)</p>
</canvas>
<script>
  const canvas = document.getElementById("canvas");
  const ctx = canvas.getContext('2d');

  ctx.fillStyle = 'blue';
  ctx.fillRect(30, 30, 50, 50);

  // Anything below will be non-rasterizable.
  ctx.scale(1, 0);

  ctx.globalAlpha = 0.8;
  ctx.globalCompositeOperation = 'multiply';
  ctx.shadowOffsetX = 0;
  ctx.shadowOffsetY = 20;
  ctx.shadowColor = 'rgba(255, 165, 0, 0.6)';

  // Open the layer with a non-invertible matrix. The whole layer will be
  // non-rasterizable.
  ctx.beginLayer({filter:
                  {name: 'dropShadow', dx: 10, dy: 0, stdDeviation: 0,
                  floodColor: 'rgba(128, 128, 255, 0.7)'}});

  // Because the transform is global, the matrix is still non-invertible.
  ctx.fillStyle = 'rgba(225, 0, 0, 1)';
  ctx.fillRect(40, 70, 50, 50);

  // Set a valid matrix in the middle of the layer. This makes the global
  // matrix invertible again, but because because the layer was opened with a
  // non-invertible matrix, the whole layer remains non-rasterizable.
  ctx.setTransform(1, 0, 0, 1, 0, 0);

  ctx.fillStyle = 'green';
  ctx.fillRect(70, 40, 50, 50);

  ctx.endLayer();
</script>