00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkSVGParser_DEFINED
00018 #define SkSVGParser_DEFINED
00019
00020 #include "SkMatrix.h"
00021 #include "SkTDict.h"
00022 #include "SkTDStack.h"
00023 #include "SkSVGPaintState.h"
00024 #include "SkSVGTypes.h"
00025 #include "SkStream.h"
00026 #include "SkString.h"
00027 #include "SkXMLParser.h"
00028 #include "SkXMLWriter.h"
00029
00030 class SkSVGBase;
00031 class SkSVGElement;
00032
00033 class SkSVGParser : public SkXMLParser {
00034 public:
00035 SkSVGParser();
00036 virtual ~SkSVGParser();
00037 void _addAttribute(const char* attrName, const char* attrValue) {
00038 fXMLWriter.addAttribute(attrName, attrValue); }
00039 void _addAttribute(const char* attrName, SkString& attrValue) {
00040 fXMLWriter.addAttribute(attrName, attrValue.c_str()); }
00041 void _addAttributeLen(const char* attrName, const char* attrValue, size_t len) {
00042 fXMLWriter.addAttributeLen(attrName, attrValue, len); }
00043 void _endElement() { fXMLWriter.endElement(); }
00044 int findAttribute(SkSVGBase* , const char* attrValue, size_t len, bool isPaint);
00045 const char* getFinal();
00046 SkTDict<SkSVGElement*>& getIDs() { return fIDs; }
00047 SkString& getPaintLast(SkSVGPaint::Field field);
00048 void _startElement(const char name[]) { fXMLWriter.startElement(name); }
00049 void translate(SkSVGElement*, bool isDef);
00050 void translateMatrix(SkString& , SkString* id);
00051 static void ConvertToArray(SkString& vals);
00052 protected:
00053 virtual bool onAddAttribute(const char name[], const char value[]);
00054 bool onAddAttributeLen(const char name[], const char value[], size_t len);
00055 virtual bool onEndElement(const char elem[]);
00056 virtual bool onStartElement(const char elem[]);
00057 bool onStartElementLen(const char elem[], size_t len);
00058 virtual bool onText(const char text[], int len);
00059 private:
00060 bool isStrokeAndFill(SkSVGPaint** stroke, SkSVGPaint** fill);
00061 static SkSVGElement* CreateElement(SkSVGTypes type, SkSVGElement* parent);
00062 static void Delete(SkTDArray<SkSVGElement*>& fChildren);
00063 static SkSVGTypes GetType(const char name[], size_t len);
00064 SkSVGPaint* fHead;
00065 SkSVGPaint fEmptyPaint;
00066 SkSVGPaint fLastFlush;
00067 SkString fLastColor;
00068 SkMatrix fLastTransform;
00069 SkTDArray<SkSVGElement*> fChildren;
00070 SkTDict<SkSVGElement*> fIDs;
00071 SkTDArray<SkSVGElement*> fParents;
00072 SkDynamicMemoryWStream fStream;
00073 SkXMLStreamWriter fXMLWriter;
00074 SkSVGElement* fCurrElement;
00075 SkBool8 fInSVG;
00076 SkBool8 fSuppressPaint;
00077 friend class SkSVGPaint;
00078 friend class SkSVGGradient;
00079 };
00080
00081 #endif // SkSVGParser_DEFINED