// 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.

#ifndef DOMMatrixReadOnly_h
#define DOMMatrixReadOnly_h

#include "bindings/core/v8/ExceptionState.h"
#include "bindings/core/v8/ScriptWrappable.h"
#include "core/dom/DOMTypedArray.h"
#include "platform/heap/Handle.h"
#include "platform/transforms/TransformationMatrix.h"
#include <memory>

namespace blink {

class DOMMatrix;

class DOMMatrixReadOnly : public GarbageCollectedFinalized<DOMMatrixReadOnly>, public ScriptWrappable {
    DEFINE_WRAPPERTYPEINFO();
public:
    static DOMMatrixReadOnly* create(Vector<double>, ExceptionState&);
    static DOMMatrixReadOnly* fromFloat32Array(DOMFloat32Array*, ExceptionState&);
    static DOMMatrixReadOnly* fromFloat64Array(DOMFloat64Array*, ExceptionState&);

    virtual ~DOMMatrixReadOnly();

    double a() const { return m_matrix->m11(); }
    double b() const { return m_matrix->m12(); }
    double c() const { return m_matrix->m21(); }
    double d() const { return m_matrix->m22(); }
    double e() const { return m_matrix->m41(); }
    double f() const { return m_matrix->m42(); }

    double m11() const { return m_matrix->m11(); }
    double m12() const { return m_matrix->m12(); }
    double m13() const { return m_matrix->m13(); }
    double m14() const { return m_matrix->m14(); }
    double m21() const { return m_matrix->m21(); }
    double m22() const { return m_matrix->m22(); }
    double m23() const { return m_matrix->m23(); }
    double m24() const { return m_matrix->m24(); }
    double m31() const { return m_matrix->m31(); }
    double m32() const { return m_matrix->m32(); }
    double m33() const { return m_matrix->m33(); }
    double m34() const { return m_matrix->m34(); }
    double m41() const { return m_matrix->m41(); }
    double m42() const { return m_matrix->m42(); }
    double m43() const { return m_matrix->m43(); }
    double m44() const { return m_matrix->m44(); }

    bool is2D() const;
    bool isIdentity() const;

    DOMMatrix* multiply(DOMMatrix*);
    DOMMatrix* translate(double tx, double ty, double tz = 0);
    DOMMatrix* scale(double scale, double ox = 0, double oy = 0);
    DOMMatrix* scale3d(double scale, double ox = 0, double oy = 0, double oz = 0);
    DOMMatrix* scaleNonUniform(double sx, double sy = 1, double sz = 1,
        double ox = 0, double oy = 0, double oz = 0);
    DOMMatrix* skewX(double sx);
    DOMMatrix* skewY(double sy);
    DOMMatrix* flipX();
    DOMMatrix* flipY();
    DOMMatrix* inverse();

    DOMFloat32Array* toFloat32Array() const;
    DOMFloat64Array* toFloat64Array() const;

    const String toString() const;

    const TransformationMatrix& matrix() const { return *m_matrix; }

    DEFINE_INLINE_TRACE() { }

protected:
    DOMMatrixReadOnly() {}

    template <typename T>
    DOMMatrixReadOnly(T sequence, int size)
    {
        if (size == 6) {
            m_matrix = TransformationMatrix::create(
                sequence[0], sequence[1], sequence[2], sequence[3],
                sequence[4], sequence[5]);
            m_is2D = true;
        } else if (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();
        }
    }

    // TransformationMatrix needs to be 16-byte aligned. PartitionAlloc
    // supports 16-byte alignment but Oilpan doesn't. So we use an std::unique_ptr
    // to allocate TransformationMatrix on PartitionAlloc.
    // TODO(oilpan): Oilpan should support 16-byte aligned allocations.
    std::unique_ptr<TransformationMatrix> m_matrix;
    bool m_is2D;
};

} // namespace blink

#endif
