Home | History | Annotate | Download | only in dom
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "config.h"
      6 #include "core/dom/DOMMatrix.h"
      7 
      8 namespace blink {
      9 
     10 DOMMatrix* DOMMatrix::create()
     11 {
     12     return new DOMMatrix(TransformationMatrix());
     13 }
     14 
     15 DOMMatrix* DOMMatrix::create(DOMMatrixReadOnly* other)
     16 {
     17     return new DOMMatrix(other->matrix(), other->is2D());
     18 }
     19 
     20 DOMMatrix::DOMMatrix(const TransformationMatrix& matrix, bool is2D)
     21 {
     22     m_matrix = matrix;
     23     m_is2D = is2D;
     24 }
     25 
     26 void DOMMatrix::setIs2D(bool value)
     27 {
     28     if (m_is2D)
     29         m_is2D = value;
     30 }
     31 
     32 DOMMatrix* DOMMatrix::multiplySelf(DOMMatrix* other)
     33 {
     34     if (!other->is2D())
     35         m_is2D = false;
     36 
     37     m_matrix = m_matrix * other->matrix();
     38 
     39     return this;
     40 }
     41 
     42 DOMMatrix* DOMMatrix::preMultiplySelf(DOMMatrix* other)
     43 {
     44     if (!other->is2D())
     45         m_is2D = false;
     46 
     47     m_matrix = other->matrix() * m_matrix;
     48 
     49     return this;
     50 }
     51 
     52 DOMMatrix* DOMMatrix::translateSelf(double tx, double ty, double tz)
     53 {
     54     if (!tx && !ty && !tz)
     55         return this;
     56 
     57     if (tz)
     58         m_is2D = false;
     59 
     60     if (m_is2D)
     61         m_matrix.translate(tx, ty);
     62     else
     63         m_matrix.translate3d(tx, ty, tz);
     64 
     65     return this;
     66 }
     67 
     68 DOMMatrix* DOMMatrix::scaleSelf(double scale, double ox, double oy)
     69 {
     70     return scaleNonUniformSelf(scale, scale, 1, ox, oy);
     71 }
     72 
     73 DOMMatrix* DOMMatrix::scale3dSelf(double scale, double ox, double oy, double oz)
     74 {
     75     return scaleNonUniformSelf(scale, scale, scale, ox, oy, oz);
     76 }
     77 
     78 DOMMatrix* DOMMatrix::scaleNonUniformSelf(double sx, double sy, double sz,
     79     double ox, double oy, double oz)
     80 {
     81     if (sz != 1 || oz)
     82         m_is2D = false;
     83 
     84     if (sx == 1 && sy == 1 && sz == 1)
     85         return this;
     86 
     87     bool hasTranslation = (ox || oy || oz);
     88 
     89     if (hasTranslation)
     90         translateSelf(ox, oy, oz);
     91 
     92     if (m_is2D)
     93         m_matrix.scaleNonUniform(sx, sy);
     94     else
     95         m_matrix.scale3d(sx, sy, sz);
     96 
     97     if (hasTranslation)
     98         translateSelf(-ox, -oy, -oz);
     99 
    100     return this;
    101 }
    102 
    103 } // namespace blink
    104