transform_operations.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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)#include "cc/animation/transform_operations.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <algorithm> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/gfx/box_f.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform_util.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector3d_f.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TransformOperations::TransformOperations() 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : decomposed_transform_dirty_(true) { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TransformOperations::TransformOperations(const TransformOperations& other) { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) operations_ = other.operations_; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_dirty_ = other.decomposed_transform_dirty_; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!decomposed_transform_dirty_) { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_.reset( 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new gfx::DecomposedTransform(*other.decomposed_transform_.get())); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TransformOperations::~TransformOperations() { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Transform TransformOperations::Apply() const { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform to_return; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < operations_.size(); ++i) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_return.PreconcatTransform(operations_[i].matrix); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return to_return; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Transform TransformOperations::Blend(const TransformOperations& from, 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkMScalar progress) const { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform to_return; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BlendInternal(from, progress, &to_return); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return to_return; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool TransformOperations::BlendedBoundsForBox(const gfx::BoxF& box, 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const TransformOperations& from, 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkMScalar min_progress, 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkMScalar max_progress, 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gfx::BoxF* bounds) const { 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *bounds = box; 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool from_identity = from.IsIdentity(); 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool to_identity = IsIdentity(); 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (from_identity && to_identity) 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!MatchesTypes(from)) 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t num_operations = 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::max(from_identity ? 0 : from.operations_.size(), 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) to_identity ? 0 : operations_.size()); 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (size_t i = 0; i < num_operations; ++i) { 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gfx::BoxF bounds_for_operation; 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const TransformOperation* from_op = 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) from_identity ? NULL : &from.operations_[i]; 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const TransformOperation* to_op = to_identity ? NULL : &operations_[i]; 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!TransformOperation::BlendedBoundsForBox(*bounds, 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) from_op, 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) to_op, 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) min_progress, 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) max_progress, 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &bounds_for_operation)) 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *bounds = bounds_for_operation; 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool TransformOperations::AffectsScale() const { 82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t i = 0; i < operations_.size(); ++i) { 83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (operations_[i].type == TransformOperation::TransformOperationScale) 84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return true; 85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (operations_[i].type == TransformOperation::TransformOperationMatrix && 86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch !operations_[i].matrix.IsIdentityOrTranslation()) 87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return true; 88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return false; 90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TransformOperations::MatchesTypes(const TransformOperations& other) const { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsIdentity() || other.IsIdentity()) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (operations_.size() != other.operations_.size()) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < operations_.size(); ++i) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (operations_[i].type != other.operations_[i].type 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) && !operations_[i].IsIdentity() 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) && !other.operations_[i].IsIdentity()) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TransformOperations::CanBlendWith( 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TransformOperations& other) const { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform dummy; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return BlendInternal(other, 0.5, &dummy); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TransformOperations::AppendTranslate(SkMScalar x, 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkMScalar y, 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkMScalar z) { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransformOperation to_add; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.matrix.Translate3d(x, y, z); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.type = TransformOperation::TransformOperationTranslate; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.translate.x = x; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.translate.y = y; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.translate.z = z; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) operations_.push_back(to_add); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_dirty_ = true; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TransformOperations::AppendRotate(SkMScalar x, 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkMScalar y, 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkMScalar z, 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkMScalar degrees) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransformOperation to_add; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.matrix.RotateAbout(gfx::Vector3dF(x, y, z), degrees); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.type = TransformOperation::TransformOperationRotate; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.rotate.axis.x = x; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.rotate.axis.y = y; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.rotate.axis.z = z; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.rotate.angle = degrees; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) operations_.push_back(to_add); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_dirty_ = true; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TransformOperations::AppendScale(SkMScalar x, SkMScalar y, SkMScalar z) { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransformOperation to_add; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.matrix.Scale3d(x, y, z); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.type = TransformOperation::TransformOperationScale; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.scale.x = x; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.scale.y = y; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.scale.z = z; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) operations_.push_back(to_add); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_dirty_ = true; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TransformOperations::AppendSkew(SkMScalar x, SkMScalar y) { 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransformOperation to_add; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.matrix.SkewX(x); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.matrix.SkewY(y); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.type = TransformOperation::TransformOperationSkew; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.skew.x = x; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.skew.y = y; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) operations_.push_back(to_add); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_dirty_ = true; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TransformOperations::AppendPerspective(SkMScalar depth) { 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransformOperation to_add; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.matrix.ApplyPerspectiveDepth(depth); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.type = TransformOperation::TransformOperationPerspective; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.perspective_depth = depth; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) operations_.push_back(to_add); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_dirty_ = true; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TransformOperations::AppendMatrix(const gfx::Transform& matrix) { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransformOperation to_add; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.matrix = matrix; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_add.type = TransformOperation::TransformOperationMatrix; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) operations_.push_back(to_add); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_dirty_ = true; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TransformOperations::AppendIdentity() { 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) operations_.push_back(TransformOperation()); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TransformOperations::IsIdentity() const { 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < operations_.size(); ++i) { 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!operations_[i].IsIdentity()) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TransformOperations::BlendInternal(const TransformOperations& from, 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SkMScalar progress, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform* result) const { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool from_identity = from.IsIdentity(); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool to_identity = IsIdentity(); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (from_identity && to_identity) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (MatchesTypes(from)) { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t num_operations = 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::max(from_identity ? 0 : from.operations_.size(), 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_identity ? 0 : operations_.size()); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < num_operations; ++i) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform blended; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!TransformOperation::BlendTransformOperations( 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) from_identity ? 0 : &from.operations_[i], 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) to_identity ? 0 : &operations_[i], 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) progress, 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &blended)) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result->PreconcatTransform(blended); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ComputeDecomposedTransform() || !from.ComputeDecomposedTransform()) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::DecomposedTransform to_return; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gfx::BlendDecomposedTransforms(&to_return, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *decomposed_transform_.get(), 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *from.decomposed_transform_.get(), 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) progress)) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *result = ComposeTransform(to_return); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TransformOperations::ComputeDecomposedTransform() const { 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decomposed_transform_dirty_) { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!decomposed_transform_) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_.reset(new gfx::DecomposedTransform()); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform = Apply(); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gfx::DecomposeTransform(decomposed_transform_.get(), transform)) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_transform_dirty_ = false; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 246