1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CC_ANIMATION_TRANSFORM_OPERATION_H_
6#define CC_ANIMATION_TRANSFORM_OPERATION_H_
7
8#include "ui/gfx/transform.h"
9
10namespace gfx {
11class BoxF;
12}
13
14namespace cc {
15
16struct TransformOperation {
17  enum Type {
18    TransformOperationTranslate,
19    TransformOperationRotate,
20    TransformOperationScale,
21    TransformOperationSkew,
22    TransformOperationPerspective,
23    TransformOperationMatrix,
24    TransformOperationIdentity
25  };
26
27  TransformOperation()
28      : type(TransformOperationIdentity) {
29  }
30
31  Type type;
32  gfx::Transform matrix;
33
34  union {
35    SkMScalar perspective_depth;
36
37    struct {
38      SkMScalar x, y;
39    } skew;
40
41    struct {
42      SkMScalar x, y, z;
43    } scale;
44
45    struct {
46      SkMScalar x, y, z;
47    } translate;
48
49    struct {
50      struct {
51        SkMScalar x, y, z;
52      } axis;
53
54      SkMScalar angle;
55    } rotate;
56  };
57
58  bool IsIdentity() const;
59  static bool BlendTransformOperations(const TransformOperation* from,
60                                       const TransformOperation* to,
61                                       SkMScalar progress,
62                                       gfx::Transform* result);
63
64  static bool BlendedBoundsForBox(const gfx::BoxF& box,
65                                  const TransformOperation* from,
66                                  const TransformOperation* to,
67                                  SkMScalar min_progress,
68                                  SkMScalar max_progress,
69                                  gfx::BoxF* bounds);
70};
71
72}  // namespace cc
73
74#endif  // CC_ANIMATION_TRANSFORM_OPERATION_H_
75