chromium/third_party/blink/web_tests/transforms/svg-vs-css.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title>Matrix testing</title>
  <style type="text/css" media="screen">
    div {
      -webkit-box-sizing: border-box;
    }
    
    .column {
      margin: 10px;
      display: inline-block;
      vertical-align: top;
    }
    .container {
      position: relative;
      height: 200px;
      width: 200px;
      margin: 10px;
      background-color: silver;
      border: 1px solid black;
    }
    
    .box {
      position: absolute;
      top: 0;
      left: 0;
      height: 60px;
      width: 60px;
      border: 1px dotted black;
      -webkit-transform-origin: top left; /* to match SVG */
    }
    
    .final {
      border: 1px solid blue;
    }
  </style>
  
  <script type="text/javascript" charset="utf-8">
    
    function doTest()
    {
      doCSS();
      doSVG();
    }
    
    function doCSS()
    {
      var matrixDiv = document.getElementById('matrixed');
      
      var firstMatrix = new WebKitCSSMatrix(document.getElementById('box1').style.transform);
      var secondMatrix = new WebKitCSSMatrix(document.getElementById('box2').style.transform);
      var thirdMatrix = new WebKitCSSMatrix(document.getElementById('box3').style.transform);
      
      var finalMatrix = firstMatrix.multiply(secondMatrix);
      finalMatrix = finalMatrix.multiply(thirdMatrix);

      // "Flipped" behavior
      // var finalMatrix = thirdMatrix.multiply(secondMatrix);
      // finalMatrix = finalMatrix.multiply(firstMatrix);

      matrixDiv.style.transform = finalMatrix;
    }

    function doSVG()
    {
      var matrixDiv = document.getElementById('matrix-svg');

      var svgroot = document.getElementsByTagName('svg')[0];
      
      var firstMatrix = svgroot.createSVGMatrix();
      firstMatrix = firstMatrix.translate(75, 25);
      var secondMatrix = svgroot.createSVGMatrix();
      secondMatrix = secondMatrix.scale(2);
      var thirdMatrix = svgroot.createSVGMatrix();
      thirdMatrix = thirdMatrix.rotate(45);

      var finalMatrix = firstMatrix.multiply(secondMatrix);
      finalMatrix = finalMatrix.multiply(thirdMatrix);

      var matrixString = "matrix(" + finalMatrix.a + " " + finalMatrix.b + 
      " " + finalMatrix.c + " " + finalMatrix.d + " " + finalMatrix.e + " " 
               + finalMatrix.f + ")";
      matrixDiv.setAttribute("transform", matrixString);
    }

    window.addEventListener('load', doTest, false)
  </script>
</head>

<body>

  <div class="column">
    <h2>SVG nested</h2>
    <div class="container">
      <svg xmlns="http://www.w3.org/2000/svg" version="1.1"  
          viewBox="0 0 200 200" style="width:200px; height:200px;">
          <g id="group1" x="0" y="0" width="60" height="60" transform="translate(75, 25)">
            <rect x="0" y="0" width="60" height="60" stroke="black" stroke-width="1px" stroke-dasharray="1 1" fill="none" />
            <g id="group2" x="0" y="0" width="60" height="60" transform="scale(2)" >
              <rect x="0" y="0" width="60" height="60" stroke="black" stroke-dasharray="1 1" stroke-width="1px" fill="none" />
              <rect id="group3" x="0" y="0" width="60" height="60" stroke="blue" fill="none" transform="rotate(45)" />
            </g>
          </g>
      </svg>
    </div>

    <h2>CSS nested</h2>
    <div class="container">
      <div id="box1" class="box" style="transform: translate(75px, 25px)">
        <div id="box2" class="box" style="transform: scale(2)">
          <div id="box3" class="final box" style="transform: rotate(45deg)">
          </div>
        </div>
      </div>
    </div>
  </div>

  <div class="column">
    <h2>SVG compound</h2>
    <div class="container">
      <svg xmlns="http://www.w3.org/2000/svg" version="1.1"  
          viewBox="0 0 200 200" style="width:200px; height:200px;">
          <rect x="0" y="0" width="60" height="60" stroke="blue" fill="none" transform="translate(75, 25) scale(2) rotate(45)">
          </rect>
      </svg>
    </div>

    <h2>CSS compound</h2>
    <div class="container">
      <div class="final box" style="transform: translate(75px, 25px) scale(2) rotate(45deg)">
      </div>
    </div>
  </div>

  <div class="column">
    <h2>SVG Matrix</h2>
    <div class="container">
      <svg xmlns="http://www.w3.org/2000/svg" version="1.1"  
          viewBox="0 0 200 200" style="width:200px; height:200px;">
          <rect id="matrix-svg" x="0" y="0" width="60" height="60" stroke="blue" fill="none">
          </rect>
      </svg>
    </div>
    
    <h2>CSSMatrix</h2>
    <div class="container">
      <div id="matrixed" class="final box">
      </div>
    </div>
  </div>
</body>
</html>