Home | History | Annotate | Download | only in animation
      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