1c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// found in the LICENSE file.
4c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "config.h"
6c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/DOMMatrix.h"
7c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
8c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
9c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
10c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)DOMMatrix* DOMMatrix::create()
11c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return new DOMMatrix(TransformationMatrix());
13c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
14c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
15c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)DOMMatrix* DOMMatrix::create(DOMMatrixReadOnly* other)
16c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
179e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return new DOMMatrix(other->matrix(), other->is2D());
189e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
209e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)DOMMatrix::DOMMatrix(const TransformationMatrix& matrix, bool is2D)
219e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
229e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_matrix = matrix;
23c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_is2D = is2D;
24c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
25c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
26c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void DOMMatrix::setIs2D(bool value)
27c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (m_is2D)
29c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_is2D = value;
30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciDOMMatrix* DOMMatrix::multiplySelf(DOMMatrix* other)
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!other->is2D())
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_is2D = false;
367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_matrix = m_matrix * other->matrix();
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return this;
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciDOMMatrix* DOMMatrix::preMultiplySelf(DOMMatrix* other)
437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!other->is2D())
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_is2D = false;
467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_matrix = other->matrix() * m_matrix;
487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return this;
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
529e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)DOMMatrix* DOMMatrix::translateSelf(double tx, double ty, double tz)
539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
549e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (!tx && !ty && !tz)
559e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return this;
569e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (tz)
589e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_is2D = false;
599e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
609e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (m_is2D)
619e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_matrix.translate(tx, ty);
629e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    else
639e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_matrix.translate3d(tx, ty, tz);
649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
659e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return this;
669e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
679e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
689e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)DOMMatrix* DOMMatrix::scaleSelf(double scale, double ox, double oy)
699e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
709e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return scaleNonUniformSelf(scale, scale, 1, ox, oy);
719e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
729e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
739e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)DOMMatrix* DOMMatrix::scale3dSelf(double scale, double ox, double oy, double oz)
749e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
759e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return scaleNonUniformSelf(scale, scale, scale, ox, oy, oz);
769e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
779e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)DOMMatrix* DOMMatrix::scaleNonUniformSelf(double sx, double sy, double sz,
799e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    double ox, double oy, double oz)
809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
819e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (sz != 1 || oz)
829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_is2D = false;
839e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
849e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (sx == 1 && sy == 1 && sz == 1)
859e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return this;
869e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    bool hasTranslation = (ox || oy || oz);
889e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
899e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (hasTranslation)
909e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        translateSelf(ox, oy, oz);
919e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
929e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (m_is2D)
939e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_matrix.scaleNonUniform(sx, sy);
949e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    else
959e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_matrix.scale3d(sx, sy, sz);
969e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
979e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (hasTranslation)
989e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        translateSelf(-ox, -oy, -oz);
999e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
1009e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return this;
1019e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
1029e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
104