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