1 /* 2 * Copyright (C) 2012 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 */ 24 25 #include "config.h" 26 27 #include "core/animation/AnimationTranslationUtil.h" 28 29 #include "platform/graphics/filters/FilterOperations.h" 30 #include "platform/graphics/filters/SkiaImageFilterBuilder.h" 31 #include "platform/transforms/InterpolatedTransformOperation.h" 32 #include "platform/transforms/Matrix3DTransformOperation.h" 33 #include "platform/transforms/MatrixTransformOperation.h" 34 #include "platform/transforms/PerspectiveTransformOperation.h" 35 #include "platform/transforms/RotateTransformOperation.h" 36 #include "platform/transforms/ScaleTransformOperation.h" 37 #include "platform/transforms/SkewTransformOperation.h" 38 #include "platform/transforms/TransformOperations.h" 39 #include "platform/transforms/TransformationMatrix.h" 40 #include "platform/transforms/TranslateTransformOperation.h" 41 #include "public/platform/WebTransformOperations.h" 42 43 namespace blink { 44 45 void toWebTransformOperations(const TransformOperations& transformOperations, WebTransformOperations* webTransformOperations) 46 { 47 // We need to do a deep copy the transformOperations may contain ref pointers to TransformOperation objects. 48 for (size_t j = 0; j < transformOperations.size(); ++j) { 49 switch (transformOperations.operations()[j]->type()) { 50 case TransformOperation::ScaleX: 51 case TransformOperation::ScaleY: 52 case TransformOperation::ScaleZ: 53 case TransformOperation::Scale3D: 54 case TransformOperation::Scale: { 55 ScaleTransformOperation* transform = static_cast<ScaleTransformOperation*>(transformOperations.operations()[j].get()); 56 webTransformOperations->appendScale(transform->x(), transform->y(), transform->z()); 57 break; 58 } 59 case TransformOperation::TranslateX: 60 case TransformOperation::TranslateY: 61 case TransformOperation::TranslateZ: 62 case TransformOperation::Translate3D: 63 case TransformOperation::Translate: { 64 TranslateTransformOperation* transform = static_cast<TranslateTransformOperation*>(transformOperations.operations()[j].get()); 65 ASSERT(transform->x().isFixed() && transform->y().isFixed()); 66 webTransformOperations->appendTranslate(transform->x().value(), transform->y().value(), transform->z()); 67 break; 68 } 69 case TransformOperation::RotateX: 70 case TransformOperation::RotateY: 71 case TransformOperation::Rotate3D: 72 case TransformOperation::Rotate: { 73 RotateTransformOperation* transform = static_cast<RotateTransformOperation*>(transformOperations.operations()[j].get()); 74 webTransformOperations->appendRotate(transform->x(), transform->y(), transform->z(), transform->angle()); 75 break; 76 } 77 case TransformOperation::SkewX: 78 case TransformOperation::SkewY: 79 case TransformOperation::Skew: { 80 SkewTransformOperation* transform = static_cast<SkewTransformOperation*>(transformOperations.operations()[j].get()); 81 webTransformOperations->appendSkew(transform->angleX(), transform->angleY()); 82 break; 83 } 84 case TransformOperation::Matrix: { 85 MatrixTransformOperation* transform = static_cast<MatrixTransformOperation*>(transformOperations.operations()[j].get()); 86 TransformationMatrix m = transform->matrix(); 87 webTransformOperations->appendMatrix(TransformationMatrix::toSkMatrix44(m)); 88 break; 89 } 90 case TransformOperation::Matrix3D: { 91 Matrix3DTransformOperation* transform = static_cast<Matrix3DTransformOperation*>(transformOperations.operations()[j].get()); 92 TransformationMatrix m = transform->matrix(); 93 webTransformOperations->appendMatrix(TransformationMatrix::toSkMatrix44(m)); 94 break; 95 } 96 case TransformOperation::Perspective: { 97 PerspectiveTransformOperation* transform = static_cast<PerspectiveTransformOperation*>(transformOperations.operations()[j].get()); 98 webTransformOperations->appendPerspective(transform->perspective()); 99 break; 100 } 101 case TransformOperation::Interpolated: { 102 TransformationMatrix m; 103 transformOperations.operations()[j]->apply(m, FloatSize()); 104 webTransformOperations->appendMatrix(TransformationMatrix::toSkMatrix44(m)); 105 break; 106 } 107 case TransformOperation::Identity: 108 webTransformOperations->appendIdentity(); 109 break; 110 case TransformOperation::None: 111 // Do nothing. 112 break; 113 } // switch 114 } // for each operation 115 } 116 117 void toWebFilterOperations(const FilterOperations& inOperations, WebFilterOperations* outOperations) 118 { 119 SkiaImageFilterBuilder builder; 120 FilterOutsets outsets = inOperations.outsets(); 121 builder.setCropOffset(FloatSize(outsets.left(), outsets.top())); 122 builder.buildFilterOperations(inOperations, outOperations); 123 } 124 125 } // namespace blink 126