12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_ANIMATION_TRANSFORM_OPERATION_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_ANIMATION_TRANSFORM_OPERATION_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace gfx {
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class BoxF;
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct TransformOperation {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum Type {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransformOperationTranslate,
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransformOperationRotate,
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransformOperationScale,
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransformOperationSkew,
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransformOperationPerspective,
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransformOperationMatrix,
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TransformOperationIdentity
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TransformOperation()
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(TransformOperationIdentity) {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Type type;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform matrix;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  union {
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SkMScalar perspective_depth;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    struct {
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SkMScalar x, y;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } skew;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    struct {
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SkMScalar x, y, z;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } scale;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    struct {
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SkMScalar x, y, z;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } translate;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    struct {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      struct {
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        SkMScalar x, y, z;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } axis;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SkMScalar angle;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } rotate;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsIdentity() const;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool BlendTransformOperations(const TransformOperation* from,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       const TransformOperation* to,
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       SkMScalar progress,
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       gfx::Transform* result);
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static bool BlendedBoundsForBox(const gfx::BoxF& box,
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  const TransformOperation* from,
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  const TransformOperation* to,
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  SkMScalar min_progress,
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                  SkMScalar max_progress,
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  gfx::BoxF* bounds);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CC_ANIMATION_TRANSFORM_OPERATION_H_
75