Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / platform / transforms / RotateTransformOperation.h
1 /*
2  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2000 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
6  * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #ifndef RotateTransformOperation_h
26 #define RotateTransformOperation_h
27
28 #include "platform/transforms/TransformOperation.h"
29
30 namespace blink {
31
32 class PLATFORM_EXPORT RotateTransformOperation : public TransformOperation {
33 public:
34     static PassRefPtr<RotateTransformOperation> create(double angle, OperationType type)
35     {
36         return adoptRef(new RotateTransformOperation(0, 0, 1, angle, type));
37     }
38
39     static PassRefPtr<RotateTransformOperation> create(double x, double y, double z, double angle, OperationType type)
40     {
41         return adoptRef(new RotateTransformOperation(x, y, z, angle, type));
42     }
43
44     double x() const { return m_x; }
45     double y() const { return m_y; }
46     double z() const { return m_z; }
47     double angle() const { return m_angle; }
48
49     FloatPoint3D axis() const;
50     static bool shareSameAxis(const RotateTransformOperation* fromRotation, const RotateTransformOperation* toRotation, FloatPoint3D* axis, double* fromAngle, double* toAngle);
51
52     virtual bool canBlendWith(const TransformOperation& other) const;
53     virtual OperationType type() const OVERRIDE { return m_type; }
54
55 private:
56     virtual bool isIdentity() const OVERRIDE { return !m_angle; }
57
58     virtual bool operator==(const TransformOperation& o) const OVERRIDE
59     {
60         if (!isSameType(o))
61             return false;
62         const RotateTransformOperation* r = static_cast<const RotateTransformOperation*>(&o);
63         return m_x == r->m_x && m_y == r->m_y && m_z == r->m_z && m_angle == r->m_angle;
64     }
65
66     virtual void apply(TransformationMatrix& transform, const FloatSize& /*borderBoxSize*/) const OVERRIDE
67     {
68         transform.rotate3d(m_x, m_y, m_z, m_angle);
69     }
70
71     virtual PassRefPtr<TransformOperation> blend(const TransformOperation* from, double progress, bool blendToIdentity = false) OVERRIDE;
72
73     RotateTransformOperation(double x, double y, double z, double angle, OperationType type)
74         : m_x(x)
75         , m_y(y)
76         , m_z(z)
77         , m_angle(angle)
78         , m_type(type)
79     {
80         ASSERT(type == RotateX || type == RotateY || type == RotateZ || type == Rotate3D);
81     }
82
83     double m_x;
84     double m_y;
85     double m_z;
86     double m_angle;
87     OperationType m_type;
88 };
89
90 } // namespace blink
91
92 #endif // RotateTransformOperation_h