| Index: third_party/WebKit/WebCore/platform/graphics/transforms/TransformationMatrix.h
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/platform/graphics/transforms/TransformationMatrix.h (revision 9391)
|
| +++ third_party/WebKit/WebCore/platform/graphics/transforms/TransformationMatrix.h (working copy)
|
| @@ -1,140 +1,310 @@
|
| -/*
|
| - * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
|
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
| - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
| - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
| - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#ifndef TransformationMatrix_h
|
| -#define TransformationMatrix_h
|
| -
|
| -#if PLATFORM(CG)
|
| -#include <CoreGraphics/CGAffineTransform.h>
|
| -typedef CGAffineTransform PlatformTransformationMatrix;
|
| -#elif PLATFORM(QT)
|
| -#include <QMatrix>
|
| -typedef QMatrix PlatformTransformationMatrix;
|
| -#elif PLATFORM(CAIRO)
|
| -#include <cairo.h>
|
| -typedef cairo_matrix_t PlatformTransformationMatrix;
|
| -#elif PLATFORM(SKIA)
|
| -#include "SkMatrix.h"
|
| -typedef SkMatrix PlatformTransformationMatrix;
|
| -#elif PLATFORM(WX) && USE(WXGC)
|
| -#include <wx/defs.h>
|
| -#include <wx/graphics.h>
|
| -typedef wxGraphicsMatrix PlatformTransformationMatrix;
|
| -#endif
|
| -
|
| -namespace WebCore {
|
| -
|
| -class IntPoint;
|
| -class IntRect;
|
| -class FloatPoint;
|
| -class FloatRect;
|
| -class FloatQuad;
|
| -
|
| -class TransformationMatrix {
|
| -public:
|
| - TransformationMatrix();
|
| - TransformationMatrix(double a, double b, double c, double d, double e, double f);
|
| -#if !PLATFORM(WX) || USE(WXGC)
|
| - TransformationMatrix(const PlatformTransformationMatrix&);
|
| -#endif
|
| -
|
| - void setMatrix(double a, double b, double c, double d, double e, double f);
|
| - void map(double x, double y, double *x2, double *y2) const;
|
| -
|
| - // Rounds the mapped point to the nearest integer value.
|
| - IntPoint mapPoint(const IntPoint&) const;
|
| -
|
| - FloatPoint mapPoint(const FloatPoint&) const;
|
| -
|
| - // Rounds the resulting mapped rectangle out. This is helpful for bounding
|
| - // box computations but may not be what is wanted in other contexts.
|
| - IntRect mapRect(const IntRect&) const;
|
| -
|
| - FloatRect mapRect(const FloatRect&) const;
|
| -
|
| - FloatQuad mapQuad(const FloatQuad&) const;
|
| -
|
| - bool isIdentity() const;
|
| -
|
| - double a() const;
|
| - void setA(double a);
|
| -
|
| - double b() const;
|
| - void setB(double b);
|
| -
|
| - double c() const;
|
| - void setC(double c);
|
| -
|
| - double d() const;
|
| - void setD(double d);
|
| -
|
| - double e() const;
|
| - void setE(double e);
|
| -
|
| - double f() const;
|
| - void setF(double f);
|
| -
|
| - void reset();
|
| -
|
| - TransformationMatrix& multiply(const TransformationMatrix&);
|
| - TransformationMatrix& scale(double);
|
| - TransformationMatrix& scale(double sx, double sy);
|
| - TransformationMatrix& scaleNonUniform(double sx, double sy);
|
| - TransformationMatrix& rotate(double d);
|
| - TransformationMatrix& rotateFromVector(double x, double y);
|
| - TransformationMatrix& translate(double tx, double ty);
|
| - TransformationMatrix& shear(double sx, double sy);
|
| - TransformationMatrix& flipX();
|
| - TransformationMatrix& flipY();
|
| - TransformationMatrix& skew(double angleX, double angleY);
|
| - TransformationMatrix& skewX(double angle);
|
| - TransformationMatrix& skewY(double angle);
|
| -
|
| - double det() const;
|
| - bool isInvertible() const;
|
| - TransformationMatrix inverse() const;
|
| -
|
| - void blend(const TransformationMatrix& from, double progress);
|
| -
|
| -#if !PLATFORM(WX) || USE(WXGC)
|
| - operator PlatformTransformationMatrix() const;
|
| -#endif
|
| -
|
| - bool operator==(const TransformationMatrix&) const;
|
| - bool operator!=(const TransformationMatrix& other) const { return !(*this == other); }
|
| - TransformationMatrix& operator*=(const TransformationMatrix&);
|
| - TransformationMatrix operator*(const TransformationMatrix&);
|
| -
|
| -private:
|
| -#if !PLATFORM(WX) || USE(WXGC)
|
| - PlatformTransformationMatrix m_transform;
|
| -#endif
|
| -};
|
| -
|
| -TransformationMatrix makeMapBetweenRects(const FloatRect& source, const FloatRect& dest);
|
| -
|
| -} // namespace WebCore
|
| -
|
| -#endif // TransformationMatrix_h
|
| +/*
|
| + * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved.
|
| + *
|
| + * Redistribution and use in source and binary forms, with or without
|
| + * modification, are permitted provided that the following conditions
|
| + * are met:
|
| + * 1. Redistributions of source code must retain the above copyright
|
| + * notice, this list of conditions and the following disclaimer.
|
| + * 2. Redistributions in binary form must reproduce the above copyright
|
| + * notice, this list of conditions and the following disclaimer in the
|
| + * documentation and/or other materials provided with the distribution.
|
| + *
|
| + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
|
| + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
| + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
| + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
| + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| + */
|
| +
|
| +#ifndef TransformationMatrix_h
|
| +#define TransformationMatrix_h
|
| +
|
| +#if PLATFORM(CG)
|
| +#include <CoreGraphics/CGAffineTransform.h>
|
| +#elif PLATFORM(CAIRO)
|
| +#include <cairo.h>
|
| +#elif PLATFORM(QT)
|
| +#include <QMatrix>
|
| +#elif PLATFORM(SKIA)
|
| +#include <SkMatrix.h>
|
| +#endif
|
| +
|
| +#include <string.h> //for memcpy
|
| +
|
| +namespace WebCore {
|
| +
|
| +class IntPoint;
|
| +class IntRect;
|
| +class FloatPoint;
|
| +class FloatPoint3D;
|
| +class FloatRect;
|
| +class FloatQuad;
|
| +
|
| +class TransformationMatrix {
|
| +public:
|
| + typedef double Matrix4[4][4];
|
| +
|
| + TransformationMatrix() { makeIdentity(); }
|
| + TransformationMatrix(const TransformationMatrix& t) { *this = t; }
|
| + TransformationMatrix(double a, double b, double c, double d, double e, double f) { setMatrix(a, b, c, d, e, f); }
|
| + TransformationMatrix(double m11, double m12, double m13, double m14,
|
| + double m21, double m22, double m23, double m24,
|
| + double m31, double m32, double m33, double m34,
|
| + double m41, double m42, double m43, double m44)
|
| + {
|
| + setMatrix(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44);
|
| + }
|
| +
|
| + void setMatrix(double a, double b, double c, double d, double e, double f)
|
| + {
|
| + m_matrix[0][0] = a; m_matrix[0][1] = b; m_matrix[0][2] = 0; m_matrix[0][3] = 0;
|
| + m_matrix[1][0] = c; m_matrix[1][1] = d; m_matrix[1][2] = 0; m_matrix[1][3] = 0;
|
| + m_matrix[2][0] = 0; m_matrix[2][1] = 0; m_matrix[2][2] = 1; m_matrix[2][3] = 0;
|
| + m_matrix[3][0] = e; m_matrix[3][1] = f; m_matrix[3][2] = 0; m_matrix[3][3] = 1;
|
| + }
|
| +
|
| + void setMatrix(double m11, double m12, double m13, double m14,
|
| + double m21, double m22, double m23, double m24,
|
| + double m31, double m32, double m33, double m34,
|
| + double m41, double m42, double m43, double m44)
|
| + {
|
| + m_matrix[0][0] = m11; m_matrix[0][1] = m12; m_matrix[0][2] = m13; m_matrix[0][3] = m14;
|
| + m_matrix[1][0] = m21; m_matrix[1][1] = m22; m_matrix[1][2] = m23; m_matrix[1][3] = m24;
|
| + m_matrix[2][0] = m31; m_matrix[2][1] = m32; m_matrix[2][2] = m33; m_matrix[2][3] = m34;
|
| + m_matrix[3][0] = m41; m_matrix[3][1] = m42; m_matrix[3][2] = m43; m_matrix[3][3] = m44;
|
| + }
|
| +
|
| + TransformationMatrix& operator =(const TransformationMatrix &t)
|
| + {
|
| + setMatrix(t.m_matrix);
|
| + return *this;
|
| + }
|
| +
|
| + TransformationMatrix& makeIdentity()
|
| + {
|
| + setMatrix(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
|
| + return *this;
|
| + }
|
| +
|
| + bool isIdentity() const
|
| + {
|
| + return m_matrix[0][0] == 1 && m_matrix[0][1] == 0 && m_matrix[0][2] == 0 && m_matrix[0][3] == 0 &&
|
| + m_matrix[1][0] == 0 && m_matrix[1][1] == 1 && m_matrix[1][2] == 0 && m_matrix[1][3] == 0 &&
|
| + m_matrix[2][0] == 0 && m_matrix[2][1] == 0 && m_matrix[2][2] == 1 && m_matrix[2][3] == 0 &&
|
| + m_matrix[3][0] == 0 && m_matrix[3][1] == 0 && m_matrix[3][2] == 0 && m_matrix[3][3] == 1;
|
| + }
|
| +
|
| + // This form preserves the double math from input to output
|
| + void map(double x, double y, double& x2, double& y2) const { multVecMatrix(x, y, x2, y2); }
|
| +
|
| + // Map a 3D point through the transform, returning a 3D point.
|
| + FloatPoint3D mapPoint(const FloatPoint3D&) const;
|
| +
|
| + // Map a 2D point through the transform, returning a 2D point.
|
| + // Note that this ignores the z component, effectively projecting the point into the z=0 plane.
|
| + FloatPoint mapPoint(const FloatPoint&) const;
|
| +
|
| + // Like the version above, except that it rounds the mapped point to the nearest integer value.
|
| + IntPoint mapPoint(const IntPoint&) const;
|
| +
|
| + // If the matrix has 3D components, the z component of the result is
|
| + // dropped, effectively projecting the rect into the z=0 plane
|
| + FloatRect mapRect(const FloatRect&) const;
|
| +
|
| + // Rounds the resulting mapped rectangle out. This is helpful for bounding
|
| + // box computations but may not be what is wanted in other contexts.
|
| + IntRect mapRect(const IntRect&) const;
|
| +
|
| + // If the matrix has 3D components, the z component of the result is
|
| + // dropped, effectively projecting the quad into the z=0 plane
|
| + FloatQuad mapQuad(const FloatQuad&) const;
|
| +
|
| + // Map a point on the z=0 plane into a point on
|
| + // the plane with with the transform applied, by extending
|
| + // a ray perpendicular to the source plane and computing
|
| + // the local x,y position of the point where that ray intersects
|
| + // with the destination plane.
|
| + FloatPoint projectPoint(const FloatPoint&) const;
|
| +
|
| + double m11() const { return m_matrix[0][0]; }
|
| + void setM11(double f) { m_matrix[0][0] = f; }
|
| + double m12() const { return m_matrix[0][1]; }
|
| + void setM12(double f) { m_matrix[0][1] = f; }
|
| + double m13() const { return m_matrix[0][2]; }
|
| + void setM13(double f) { m_matrix[0][2] = f; }
|
| + double m14() const { return m_matrix[0][3]; }
|
| + void setM14(double f) { m_matrix[0][3] = f; }
|
| + double m21() const { return m_matrix[1][0]; }
|
| + void setM21(double f) { m_matrix[1][0] = f; }
|
| + double m22() const { return m_matrix[1][1]; }
|
| + void setM22(double f) { m_matrix[1][1] = f; }
|
| + double m23() const { return m_matrix[1][2]; }
|
| + void setM23(double f) { m_matrix[1][2] = f; }
|
| + double m24() const { return m_matrix[1][3]; }
|
| + void setM24(double f) { m_matrix[1][3] = f; }
|
| + double m31() const { return m_matrix[2][0]; }
|
| + void setM31(double f) { m_matrix[2][0] = f; }
|
| + double m32() const { return m_matrix[2][1]; }
|
| + void setM32(double f) { m_matrix[2][1] = f; }
|
| + double m33() const { return m_matrix[2][2]; }
|
| + void setM33(double f) { m_matrix[2][2] = f; }
|
| + double m34() const { return m_matrix[2][3]; }
|
| + void setM34(double f) { m_matrix[2][3] = f; }
|
| + double m41() const { return m_matrix[3][0]; }
|
| + void setM41(double f) { m_matrix[3][0] = f; }
|
| + double m42() const { return m_matrix[3][1]; }
|
| + void setM42(double f) { m_matrix[3][1] = f; }
|
| + double m43() const { return m_matrix[3][2]; }
|
| + void setM43(double f) { m_matrix[3][2] = f; }
|
| + double m44() const { return m_matrix[3][3]; }
|
| + void setM44(double f) { m_matrix[3][3] = f; }
|
| +
|
| + double a() const { return m_matrix[0][0]; }
|
| + void setA(double a) { m_matrix[0][0] = a; }
|
| +
|
| + double b() const { return m_matrix[0][1]; }
|
| + void setB(double b) { m_matrix[0][1] = b; }
|
| +
|
| + double c() const { return m_matrix[1][0]; }
|
| + void setC(double c) { m_matrix[1][0] = c; }
|
| +
|
| + double d() const { return m_matrix[1][1]; }
|
| + void setD(double d) { m_matrix[1][1] = d; }
|
| +
|
| + double e() const { return m_matrix[3][0]; }
|
| + void setE(double e) { m_matrix[3][0] = e; }
|
| +
|
| + double f() const { return m_matrix[3][1]; }
|
| + void setF(double f) { m_matrix[3][1] = f; }
|
| +
|
| + // this = this * mat
|
| + TransformationMatrix& multiply(const TransformationMatrix& t) { return *this *= t; }
|
| +
|
| + // this = mat * this
|
| + TransformationMatrix& multLeft(const TransformationMatrix& mat);
|
| +
|
| + TransformationMatrix& scale(double);
|
| + TransformationMatrix& scaleNonUniform(double sx, double sy);
|
| + TransformationMatrix& scale3d(double sx, double sy, double sz);
|
| +
|
| + TransformationMatrix& rotate(double d) { return rotate3d(0, 0, d); }
|
| + TransformationMatrix& rotateFromVector(double x, double y);
|
| + TransformationMatrix& rotate3d(double rx, double ry, double rz);
|
| +
|
| + // The vector (x,y,z) is normalized if it's not already. A vector of
|
| + // (0,0,0) uses a vector of (0,0,1).
|
| + TransformationMatrix& rotate3d(double x, double y, double z, double angle);
|
| +
|
| + TransformationMatrix& translate(double tx, double ty);
|
| + TransformationMatrix& translate3d(double tx, double ty, double tz);
|
| +
|
| + TransformationMatrix& flipX();
|
| + TransformationMatrix& flipY();
|
| + TransformationMatrix& skew(double angleX, double angleY);
|
| + TransformationMatrix& skewX(double angle) { return skew(angle, 0); }
|
| + TransformationMatrix& skewY(double angle) { return skew(0, angle); }
|
| +
|
| + TransformationMatrix& applyPerspective(double p);
|
| + bool hasPerspective() const { return m_matrix[2][3] != 0.0f; }
|
| +
|
| + bool isInvertible() const;
|
| +
|
| + // This method returns the identity matrix if it is not invertible.
|
| + // Use isInvertible() before calling this if you need to know.
|
| + TransformationMatrix inverse() const;
|
| +
|
| + // decompose the matrix into its component parts
|
| + typedef struct {
|
| + double scaleX, scaleY, scaleZ;
|
| + double skewXY, skewXZ, skewYZ;
|
| + double quaternionX, quaternionY, quaternionZ, quaternionW;
|
| + double translateX, translateY, translateZ;
|
| + double perspectiveX, perspectiveY, perspectiveZ, perspectiveW;
|
| + } DecomposedType;
|
| +
|
| + bool decompose(DecomposedType& decomp) const;
|
| + void recompose(const DecomposedType& decomp);
|
| +
|
| + void blend(const TransformationMatrix& from, double progress);
|
| +
|
| + bool isAffine() const
|
| + {
|
| + return (m13() == 0 && m14() == 0 && m23() == 0 && m24() == 0 &&
|
| + m31() == 0 && m32() == 0 && m33() == 1 && m34() == 0 && m43() == 0 && m44() == 1);
|
| + }
|
| +
|
| + bool operator==(const TransformationMatrix& m2) const
|
| + {
|
| + return (m_matrix[0][0] == m2.m_matrix[0][0] &&
|
| + m_matrix[0][1] == m2.m_matrix[0][1] &&
|
| + m_matrix[0][2] == m2.m_matrix[0][2] &&
|
| + m_matrix[0][3] == m2.m_matrix[0][3] &&
|
| + m_matrix[1][0] == m2.m_matrix[1][0] &&
|
| + m_matrix[1][1] == m2.m_matrix[1][1] &&
|
| + m_matrix[1][2] == m2.m_matrix[1][2] &&
|
| + m_matrix[1][3] == m2.m_matrix[1][3] &&
|
| + m_matrix[2][0] == m2.m_matrix[2][0] &&
|
| + m_matrix[2][1] == m2.m_matrix[2][1] &&
|
| + m_matrix[2][2] == m2.m_matrix[2][2] &&
|
| + m_matrix[2][3] == m2.m_matrix[2][3] &&
|
| + m_matrix[3][0] == m2.m_matrix[3][0] &&
|
| + m_matrix[3][1] == m2.m_matrix[3][1] &&
|
| + m_matrix[3][2] == m2.m_matrix[3][2] &&
|
| + m_matrix[3][3] == m2.m_matrix[3][3]);
|
| + }
|
| +
|
| + bool operator!=(const TransformationMatrix& other) const { return !(*this == other); }
|
| +
|
| + // *this = *this * t (i.e., a multRight)
|
| + TransformationMatrix& operator*=(const TransformationMatrix& t)
|
| + {
|
| + *this = *this * t;
|
| + return *this;
|
| + }
|
| +
|
| + // result = *this * t (i.e., a multRight)
|
| + TransformationMatrix operator*(const TransformationMatrix& t)
|
| + {
|
| + TransformationMatrix result = t;
|
| + result.multLeft(*this);
|
| + return result;
|
| + }
|
| +
|
| +#if PLATFORM(CG)
|
| + operator CGAffineTransform() const;
|
| +#elif PLATFORM(CAIRO)
|
| + operator cairo_matrix_t() const;
|
| +#elif PLATFORM(QT)
|
| + operator QMatrix() const;
|
| +#elif PLATFORM(SKIA)
|
| + operator SkMatrix() const;
|
| +#endif
|
| +
|
| +private:
|
| + TransformationMatrix makeMapBetweenRects(const FloatRect& source, const FloatRect& dest);
|
| +
|
| + // multiply passed 2D point by matrix (assume z=0)
|
| + void multVecMatrix(double x, double y, double& dstX, double& dstY) const;
|
| +
|
| + // multiply passed 3D point by matrix
|
| + void multVecMatrix(double x, double y, double z, double& dstX, double& dstY, double& dstZ) const;
|
| +
|
| + void setMatrix(const Matrix4 m)
|
| + {
|
| + if (m && m != m_matrix)
|
| + memcpy(m_matrix, m, sizeof(Matrix4));
|
| + }
|
| +
|
| + Matrix4 m_matrix;
|
| +};
|
| +
|
| +} // namespace WebCore
|
| +
|
| +#endif // TransformationMatrix_h
|
|
|