180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDrawMatrix.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimateMaker.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkParse.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMatrixParts.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkScript.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTypedArray.h"
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruenum SkDrawMatrix_Properties {
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(perspectX),
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(perspectY),
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(rotate),
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(scale),
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(scaleX),
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(scaleY),
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(skewX),
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(skewY),
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(translate),
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(translateX),
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_PROPERTY(translateY)
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if SK_USE_CONDENSED_INFO == 0
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkMemberInfo SkDrawMatrix::fInfo[] = {
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_ARRAY(matrix, Float),
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(perspectX, Float),
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(perspectY, Float),
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(rotate, Float),
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(scale, Float),
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(scaleX, Float),
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(scaleY, Float),
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(skewX, Float),
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(skewY, Float),
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(translate, Point),
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(translateX, Float),
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_MEMBER_PROPERTY(translateY, Float)
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruDEFINE_GET_MEMBER(SkDrawMatrix);
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDrawMatrix::SkDrawMatrix() : fChildHasID(false), fDirty(false) {
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fConcat.reset();
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fMatrix.reset();
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDrawMatrix::~SkDrawMatrix() {
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (SkMatrixPart** part = fParts.begin(); part < fParts.end();  part++)
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        delete *part;
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
64363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool SkDrawMatrix::addChild(SkAnimateMaker& maker, SkDisplayable* child) {
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(child && child->isMatrixPart());
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMatrixPart* part = (SkMatrixPart*) child;
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    *fParts.append() = part;
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (part->add())
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        maker.setErrorCode(SkDisplayXMLParserError::kErrorAddingToMatrix);
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDrawMatrix::childrenNeedDisposing() const {
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDisplayable* SkDrawMatrix::deepCopy(SkAnimateMaker* maker) {
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDrawMatrix* copy = (SkDrawMatrix*)
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDisplayType::CreateInstance(maker, SkType_Matrix);
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(fParts.count() == 0);
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    copy->fMatrix = fMatrix;
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    copy->fConcat = fConcat;
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return copy;
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDrawMatrix::dirty() {
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fDirty = true;
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDrawMatrix::draw(SkAnimateMaker& maker) {
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMatrix& concat = getMatrix();
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    maker.fCanvas->concat(concat);
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DUMP_ENABLED
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDrawMatrix::dump(SkAnimateMaker* maker) {
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dumpBase(maker);
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fMatrix.isIdentity()) {
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("matrix=\"identity\"/>\n");
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return;
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar result;
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    result = fMatrix[SkMatrix::kMScaleX];
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (result != SK_Scalar1)
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("sx=\"%g\" ", SkScalarToFloat(result));
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    result = fMatrix.getScaleY();
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (result != SK_Scalar1)
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("sy=\"%g\" ", SkScalarToFloat(result));
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    result = fMatrix.getSkewX();
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (result)
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("skew-x=\"%g\" ", SkScalarToFloat(result));
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    result = fMatrix.getSkewY();
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (result)
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("skew-y=\"%g\" ", SkScalarToFloat(result));
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    result = fMatrix.getTranslateX();
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (result)
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("tx=\"%g\" ", SkScalarToFloat(result));
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    result = fMatrix.getTranslateY();
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (result)
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("ty=\"%g\" ", SkScalarToFloat(result));
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    result = SkPerspToScalar(fMatrix.getPerspX());
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (result)
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("perspect-x=\"%g\" ", SkScalarToFloat(result));
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    result = SkPerspToScalar(fMatrix.getPerspY());
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (result)
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("perspect-y=\"%g\" ", SkScalarToFloat(result));
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDebugf("/>\n");
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMatrix& SkDrawMatrix::getMatrix() {
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fDirty == false)
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fConcat;
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fMatrix.reset();
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (SkMatrixPart** part = fParts.begin(); part < fParts.end();  part++) {
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (*part)->add();
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fConcat = fMatrix;
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fDirty = false;
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fConcat;
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDrawMatrix::getProperty(int index, SkScriptValue* value) const {
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    value->fType = SkType_Float;
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar result;
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (index) {
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(perspectX):
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result = fMatrix.getPerspX();
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(perspectY):
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result = fMatrix.getPerspY();
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(scaleX):
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result = fMatrix.getScaleX();
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(scaleY):
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result = fMatrix.getScaleY();
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(skewX):
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result = fMatrix.getSkewX();
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(skewY):
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result = fMatrix.getSkewY();
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(translateX):
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result = fMatrix.getTranslateX();
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(translateY):
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result = fMatrix.getTranslateY();
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        default:
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//          SkASSERT(0);
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return false;
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    value->fOperand.fScalar = result;
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDrawMatrix::initialize() {
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fConcat = fMatrix;
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDrawMatrix::onEndElement(SkAnimateMaker& ) {
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (matrix.count() > 0) {
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkScalar* vals = matrix.begin();
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fMatrix.setScaleX(vals[0]);
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fMatrix.setSkewX(vals[1]);
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fMatrix.setTranslateX(vals[2]);
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fMatrix.setSkewY(vals[3]);
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fMatrix.setScaleY(vals[4]);
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fMatrix.setTranslateY(vals[5]);
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fMatrix.setPerspX(SkScalarToPersp(vals[6]));
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fMatrix.setPerspY(SkScalarToPersp(vals[7]));
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//      fMatrix.setPerspW(SkScalarToPersp(vals[8]));
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        goto setConcat;
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fChildHasID == false) {
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        {
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (SkMatrixPart** part = fParts.begin(); part < fParts.end();  part++)
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                delete *part;
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fParts.reset();
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QuerusetConcat:
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fConcat = fMatrix;
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fDirty = false;
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDrawMatrix::setChildHasID() {
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fChildHasID = true;
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDrawMatrix::setProperty(int index, SkScriptValue& scriptValue) {
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar number = scriptValue.fOperand.fScalar;
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (index) {
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(translate):
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //      SkScalar xy[2];
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(scriptValue.fType == SkType_Array);
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(scriptValue.fOperand.fArray->getType() == SkType_Float);
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(scriptValue.fOperand.fArray->count() == 2);
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    //      SkParse::FindScalars(scriptValue.fOperand.fString->c_str(), xy, 2);
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setTranslateX((*scriptValue.fOperand.fArray)[0].fScalar);
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setTranslateY((*scriptValue.fOperand.fArray)[1].fScalar);
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return true;
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(perspectX):
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setPerspX(SkScalarToPersp((number)));
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(perspectY):
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setPerspY(SkScalarToPersp((number)));
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(rotate): {
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkMatrix temp;
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            temp.setRotate(number, 0, 0);
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setScaleX(temp.getScaleX());
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setScaleY(temp.getScaleY());
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setSkewX(temp.getSkewX());
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setSkewY(temp.getSkewY());
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            } break;
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(scale):
24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setScaleX(number);
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setScaleY(number);
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(scaleX):
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setScaleX(number);
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(scaleY):
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setScaleY(number);
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(skewX):
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setSkewX(number);
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(skewY):
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setSkewY(number);
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(translateX):
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setTranslateX(number);
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SK_PROPERTY(translateY):
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fMatrix.setTranslateY(number);
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        default:
26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(0);
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return false;
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fConcat = fMatrix;
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return true;
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
269