1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/*
3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2006 The Android Open Source Project
4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *
5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file.
7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */
8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkDrawPath.h"
11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkAnimateMaker.h"
12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkCanvas.h"
13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkMath.h"
14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkMatrixParts.h"
15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkPaint.h"
16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkPathParts.h"
17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerenum SkPath_Properties {
19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SK_PROPERTY(fillType),
20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SK_PROPERTY(length)
21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if SK_USE_CONDENSED_INFO == 0
24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerconst SkMemberInfo SkDrawPath::fInfo[] = {
26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SK_MEMBER(d, String),
27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SK_MEMBER_PROPERTY(fillType, FillType),
28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SK_MEMBER_PROPERTY(length, Float)
29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
33f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerDEFINE_GET_MEMBER(SkDrawPath);
34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
35f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkDrawPath::SkDrawPath()
36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{
37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fParent = NULL;
38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fLength = SK_ScalarNaN;
39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fChildHasID = false;
40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fDirty = false;
41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
43f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkDrawPath::~SkDrawPath() {
44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    for (SkPathPart** part = fParts.begin(); part < fParts.end();  part++)
45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        delete *part;
46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkDrawPath::add(SkAnimateMaker& maker, SkDisplayable* child) {
49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkASSERT(child && child->isPathPart());
50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkPathPart* part = (SkPathPart*) child;
51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    *fParts.append() = part;
52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    if (part->add())
53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        maker.setErrorCode(SkDisplayXMLParserError::kErrorAddingToPath);
54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fDirty = false;
55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    return true;
56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkDrawPath::childrenNeedDisposing() const {
59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    return false;
60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkDrawPath::dirty() {
63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fDirty = true;
64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fLength = SK_ScalarNaN;
65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    if (fParent)
66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fParent->dirty();
67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkDrawPath::draw(SkAnimateMaker& maker) {
70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkPath& path = getPath();
71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkBoundableAuto boundable(this, maker);
72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    maker.fCanvas->drawPath(path, *maker.fPaint);
73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    return false;
74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
76f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkDisplayable* SkDrawPath::getParent() const {
77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    return fParent;
78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DUMP_ENABLED
81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkDrawPath::dump(SkAnimateMaker* maker) {
82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    dumpBase(maker);
83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    dumpAttrs(maker);
84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool closedYet = false;
85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkDisplayList::fIndent += 4;
86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    for(SkPathPart** part = fParts.begin(); part < fParts.end(); part++) {
87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        if (closedYet == false) {
88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            SkDebugf(">\n");
89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            closedYet = true;
90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        }
91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        (*part)->dump(maker);
92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkDisplayList::fIndent -= 4;
94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    if (closedYet)
95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        dumpEnd(maker);
96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    else
97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkDebugf("/>\n");
98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
101f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkPath& SkDrawPath::getPath() {
102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    if (fDirty == false)
103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return fPath;
104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    if (d.size() > 0)
105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    {
106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        parseSVG();
107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        d.reset();
108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    else
110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    {
111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fPath.reset();
112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        for (SkPathPart** part = fParts.begin(); part < fParts.end();  part++)
113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            (*part)->add();
114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fDirty = false;
116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    return fPath;
117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkDrawPath::onEndElement(SkAnimateMaker& ) {
120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    if (d.size() > 0) {
121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        parseSVG();
122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        d.reset();
123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fDirty = false;
124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return;
125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    if (fChildHasID == false) {
127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        for (SkPathPart** part = fParts.begin(); part < fParts.end();  part++)
128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            delete *part;
129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fParts.reset();
130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fDirty = false;
131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
133f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
134f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkDrawPath::getProperty(int index, SkScriptValue* value) const {
135f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    switch (index) {
136f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        case SK_PROPERTY(length):
137f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            if (SkScalarIsNaN(fLength)) {
138f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger                const SkPath& path = ((SkDrawPath*) this)->getPath();
139f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger                SkPathMeasure pathMeasure(path, false);
140f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger                fLength = pathMeasure.getLength();
141f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            }
142f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            value->fType = SkType_Float;
143f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            value->fOperand.fScalar = fLength;
144f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            break;
145f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        case SK_PROPERTY(fillType):
146f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            value->fType = SkType_FillType;
147f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            value->fOperand.fS32 = (int) fPath.getFillType();
148f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            break;
149f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        default:
150f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            SkASSERT(0);
151f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            return false;
152f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
153f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    return true;
154f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
155f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
156f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkDrawPath::setChildHasID() {
157f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fChildHasID = true;
158f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
159f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
160f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkDrawPath::setParent(SkDisplayable* parent) {
161f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fParent = parent;
162f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    return false;
163f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
164f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
165f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkDrawPath::setProperty(int index, SkScriptValue& value)
166f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{
167f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    switch (index) {
168f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        case SK_PROPERTY(fillType):
169f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            SkASSERT(value.fType == SkType_FillType);
170f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            SkASSERT(value.fOperand.fS32 >= SkPath::kWinding_FillType &&
171f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger                value.fOperand.fS32 <= SkPath::kEvenOdd_FillType);
172f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            fPath.setFillType((SkPath::FillType) value.fOperand.fS32);
173f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            break;
174f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        default:
175f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            SkASSERT(0);
176f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger            return false;
177f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
178f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    return true;
179f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
180f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
181f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if SK_USE_CONDENSED_INFO == 0
182f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
183f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerconst SkMemberInfo SkPolyline::fInfo[] = {
184f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SK_MEMBER_ARRAY(points, Float)
185f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
186f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
187f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
188f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
189f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerDEFINE_GET_MEMBER(SkPolyline);
190f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
191f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkPolyline::add(SkAnimateMaker& , SkDisplayable*) const {
192f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    return false;
193f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
194f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
195f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkPolyline::onEndElement(SkAnimateMaker& maker) {
196f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    INHERITED::onEndElement(maker);
197f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    if (points.count() <= 0)
198f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return;
199f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fPath.reset();
200f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fPath.moveTo(points[0], points[1]);
201f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    int count = points.count();
202f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    for (int index = 2; index < count; index += 2)
203f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fPath.lineTo(points[index], points[index+1]);
204f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
205f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
206f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
207f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if SK_USE_CONDENSED_INFO == 0
208f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
209f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerconst SkMemberInfo SkPolygon::fInfo[] = {
210f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SK_MEMBER_INHERITED
211f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
212f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
213f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
214f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
215f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerDEFINE_GET_MEMBER(SkPolygon);
216f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
217f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkPolygon::onEndElement(SkAnimateMaker& maker) {
218f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    INHERITED::onEndElement(maker);
219f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    fPath.close();
220f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}
221f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
222