1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef SkSVGParser_DEFINED 18 #define SkSVGParser_DEFINED 19 20 #include "SkMatrix.h" 21 #include "SkTDict.h" 22 #include "SkTDStack.h" 23 #include "SkSVGPaintState.h" 24 #include "SkSVGTypes.h" 25 #include "SkStream.h" 26 #include "SkString.h" 27 #include "SkXMLParser.h" 28 #include "SkXMLWriter.h" 29 30 class SkSVGBase; 31 class SkSVGElement; 32 33 class SkSVGParser : public SkXMLParser { 34 public: 35 SkSVGParser(); 36 virtual ~SkSVGParser(); _addAttribute(const char * attrName,const char * attrValue)37 void _addAttribute(const char* attrName, const char* attrValue) { 38 fXMLWriter.addAttribute(attrName, attrValue); } _addAttribute(const char * attrName,SkString & attrValue)39 void _addAttribute(const char* attrName, SkString& attrValue) { 40 fXMLWriter.addAttribute(attrName, attrValue.c_str()); } _addAttributeLen(const char * attrName,const char * attrValue,size_t len)41 void _addAttributeLen(const char* attrName, const char* attrValue, size_t len) { 42 fXMLWriter.addAttributeLen(attrName, attrValue, len); } _endElement()43 void _endElement() { fXMLWriter.endElement(); } 44 int findAttribute(SkSVGBase* , const char* attrValue, size_t len, bool isPaint); 45 const char* getFinal(); getIDs()46 SkTDict<SkSVGElement*>& getIDs() { return fIDs; } 47 SkString& getPaintLast(SkSVGPaint::Field field); _startElement(const char name[])48 void _startElement(const char name[]) { fXMLWriter.startElement(name); } 49 void translate(SkSVGElement*, bool isDef); 50 void translateMatrix(SkString& , SkString* id); 51 static void ConvertToArray(SkString& vals); 52 protected: 53 virtual bool onAddAttribute(const char name[], const char value[]); 54 bool onAddAttributeLen(const char name[], const char value[], size_t len); 55 virtual bool onEndElement(const char elem[]); 56 virtual bool onStartElement(const char elem[]); 57 bool onStartElementLen(const char elem[], size_t len); 58 virtual bool onText(const char text[], int len); 59 private: 60 bool isStrokeAndFill(SkSVGPaint** stroke, SkSVGPaint** fill); 61 static SkSVGElement* CreateElement(SkSVGTypes type, SkSVGElement* parent); 62 static void Delete(SkTDArray<SkSVGElement*>& fChildren); 63 static SkSVGTypes GetType(const char name[], size_t len); 64 SkSVGPaint* fHead; 65 SkSVGPaint fEmptyPaint; 66 SkSVGPaint fLastFlush; 67 SkString fLastColor; 68 SkMatrix fLastTransform; 69 SkTDArray<SkSVGElement*> fChildren; 70 SkTDict<SkSVGElement*> fIDs; 71 SkTDArray<SkSVGElement*> fParents; 72 SkDynamicMemoryWStream fStream; 73 SkXMLStreamWriter fXMLWriter; 74 SkSVGElement* fCurrElement; 75 SkBool8 fInSVG; 76 SkBool8 fSuppressPaint; 77 friend class SkSVGPaint; 78 friend class SkSVGGradient; 79 }; 80 81 #endif // SkSVGParser_DEFINED 82