blob: ba245e06ec9435509b87815813cc36ae05cae49d [file] [log] [blame]
// Copyright 2016 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/css/cssom/CSSMatrixComponent.h"
#include "core/css/CSSPrimitiveValue.h"
#include "core/css/cssom/CSSMatrixComponentOptions.h"
#include "core/geometry/DOMMatrix.h"
#include "platform/wtf/MathExtras.h"
namespace blink {
namespace {
DOMMatrix* To2DMatrix(DOMMatrixReadOnly* matrix) {
DOMMatrix* twoDimensionalMatrix = DOMMatrix::Create();
twoDimensionalMatrix->setA(matrix->m11());
twoDimensionalMatrix->setB(matrix->m12());
twoDimensionalMatrix->setC(matrix->m21());
twoDimensionalMatrix->setD(matrix->m22());
twoDimensionalMatrix->setE(matrix->m41());
twoDimensionalMatrix->setF(matrix->m42());
return twoDimensionalMatrix;
}
} // namespace
CSSMatrixComponent* CSSMatrixComponent::Create(
DOMMatrixReadOnly* matrix,
const CSSMatrixComponentOptions& options) {
return new CSSMatrixComponent(matrix, options.is2D() || matrix->is2D());
}
const DOMMatrix* CSSMatrixComponent::AsMatrix() const {
if (is2D() && !matrix_->is2D())
return To2DMatrix(matrix_);
return matrix_.Get();
}
CSSFunctionValue* CSSMatrixComponent::ToCSSValue() const {
CSSFunctionValue* result =
CSSFunctionValue::Create(is2D() ? CSSValueMatrix : CSSValueMatrix3d);
if (is2D()) {
double values[6] = {matrix_->a(), matrix_->b(), matrix_->c(),
matrix_->d(), matrix_->e(), matrix_->f()};
for (double value : values) {
result->Append(*CSSPrimitiveValue::Create(
value, CSSPrimitiveValue::UnitType::kNumber));
}
} else {
double values[16] = {
matrix_->m11(), matrix_->m12(), matrix_->m13(), matrix_->m14(),
matrix_->m21(), matrix_->m22(), matrix_->m23(), matrix_->m24(),
matrix_->m31(), matrix_->m32(), matrix_->m33(), matrix_->m34(),
matrix_->m41(), matrix_->m42(), matrix_->m43(), matrix_->m44()};
for (double value : values) {
result->Append(*CSSPrimitiveValue::Create(
value, CSSPrimitiveValue::UnitType::kNumber));
}
}
return result;
}
} // namespace blink