blob: 71d42584226141209d15dabcfcef3a2af1693179 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/dom/DOMMatrix.h"
namespace blink {
DOMMatrixReadOnly* DOMMatrixReadOnly::create(Vector<double> sequence, ExceptionState& exceptionState)
{
if (sequence.size() != 6 && sequence.size() != 16) {
exceptionState.throwTypeError("An invalid number sequence is specified. The sequence must contain 6 elements for 2D matrix and 16 elements for 3D matrix.");
return nullptr;
}
return new DOMMatrixReadOnly(sequence);
}
DOMMatrixReadOnly::DOMMatrixReadOnly(Vector<double> sequence)
{
if (sequence.size() == 6) {
m_matrix = TransformationMatrix::create(
sequence[0], sequence[1], sequence[2], sequence[3],
sequence[4], sequence[5]);
m_is2D = true;
} else if (sequence.size() == 16) {
m_matrix = TransformationMatrix::create(
sequence[0], sequence[1], sequence[2], sequence[3],
sequence[4], sequence[5], sequence[6], sequence[7],
sequence[8], sequence[9], sequence[10], sequence[11],
sequence[12], sequence[13], sequence[14], sequence[15]);
m_is2D = false;
} else {
NOTREACHED();
}
}
DOMMatrixReadOnly::~DOMMatrixReadOnly()
{
}
bool DOMMatrixReadOnly::is2D() const
{
return m_is2D;
}
bool DOMMatrixReadOnly::isIdentity() const
{
return m_matrix->isIdentity();
}
DOMMatrix* DOMMatrixReadOnly::multiply(DOMMatrix* other)
{
return DOMMatrix::create(this)->multiplySelf(other);
}
DOMMatrix* DOMMatrixReadOnly::translate(double tx, double ty, double tz)
{
return DOMMatrix::create(this)->translateSelf(tx, ty, tz);
}
DOMMatrix* DOMMatrixReadOnly::scale(double scale, double ox, double oy)
{
return DOMMatrix::create(this)->scaleSelf(scale, ox, oy);
}
DOMMatrix* DOMMatrixReadOnly::scale3d(double scale, double ox, double oy, double oz)
{
return DOMMatrix::create(this)->scale3dSelf(scale, ox, oy, oz);
}
DOMMatrix* DOMMatrixReadOnly::scaleNonUniform(double sx, double sy, double sz,
double ox, double oy, double oz)
{
return DOMMatrix::create(this)->scaleNonUniformSelf(sx, sy, sz, ox, oy, oz);
}
DOMMatrix* DOMMatrixReadOnly::flipX()
{
DOMMatrix* flipX = DOMMatrix::create(this);
flipX->setM11(-this->m11());
flipX->setM12(-this->m12());
flipX->setM13(-this->m13());
flipX->setM14(-this->m14());
return flipX;
}
DOMMatrix* DOMMatrixReadOnly::flipY()
{
DOMMatrix* flipY = DOMMatrix::create(this);
flipY->setM21(-this->m21());
flipY->setM22(-this->m22());
flipY->setM23(-this->m23());
flipY->setM24(-this->m24());
return flipY;
}
DOMFloat32Array* DOMMatrixReadOnly::toFloat32Array() const
{
float array[] = {
static_cast<float>(m_matrix->m11()), static_cast<float>(m_matrix->m12()), static_cast<float>(m_matrix->m13()), static_cast<float>(m_matrix->m14()),
static_cast<float>(m_matrix->m21()), static_cast<float>(m_matrix->m22()), static_cast<float>(m_matrix->m23()), static_cast<float>(m_matrix->m24()),
static_cast<float>(m_matrix->m31()), static_cast<float>(m_matrix->m32()), static_cast<float>(m_matrix->m33()), static_cast<float>(m_matrix->m34()),
static_cast<float>(m_matrix->m41()), static_cast<float>(m_matrix->m42()), static_cast<float>(m_matrix->m43()), static_cast<float>(m_matrix->m44())
};
return DOMFloat32Array::create(array, 16);
}
DOMFloat64Array* DOMMatrixReadOnly::toFloat64Array() const
{
double array[] = {
m_matrix->m11(), m_matrix->m12(), m_matrix->m13(), m_matrix->m14(),
m_matrix->m21(), m_matrix->m22(), m_matrix->m23(), m_matrix->m24(),
m_matrix->m31(), m_matrix->m32(), m_matrix->m33(), m_matrix->m34(),
m_matrix->m41(), m_matrix->m42(), m_matrix->m43(), m_matrix->m44()
};
return DOMFloat64Array::create(array, 16);
}
} // namespace blink