2011-07-28 14:26:00 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
/*
|
2011-07-28 14:26:00 +00:00
|
|
|
* Copyright 2006 The Android Open Source Project
|
2008-12-17 15:59:43 +00:00
|
|
|
*
|
2011-07-28 14:26:00 +00:00
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
2008-12-17 15:59:43 +00:00
|
|
|
*/
|
|
|
|
|
2011-07-28 14:26:00 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
#ifndef SkSVGParser_DEFINED
|
|
|
|
#define SkSVGParser_DEFINED
|
|
|
|
|
|
|
|
#include "SkMatrix.h"
|
|
|
|
#include "SkTDict.h"
|
|
|
|
#include "SkTDStack.h"
|
|
|
|
#include "SkSVGPaintState.h"
|
|
|
|
#include "SkSVGTypes.h"
|
|
|
|
#include "SkStream.h"
|
|
|
|
#include "SkString.h"
|
|
|
|
#include "SkXMLParser.h"
|
|
|
|
#include "SkXMLWriter.h"
|
|
|
|
|
|
|
|
class SkSVGBase;
|
|
|
|
class SkSVGElement;
|
|
|
|
|
|
|
|
class SkSVGParser : public SkXMLParser {
|
|
|
|
public:
|
2010-05-17 14:34:13 +00:00
|
|
|
SkSVGParser(SkXMLParserError* err = NULL);
|
2008-12-17 15:59:43 +00:00
|
|
|
virtual ~SkSVGParser();
|
|
|
|
void _addAttribute(const char* attrName, const char* attrValue) {
|
|
|
|
fXMLWriter.addAttribute(attrName, attrValue); }
|
|
|
|
void _addAttribute(const char* attrName, SkString& attrValue) {
|
|
|
|
fXMLWriter.addAttribute(attrName, attrValue.c_str()); }
|
|
|
|
void _addAttributeLen(const char* attrName, const char* attrValue, size_t len) {
|
|
|
|
fXMLWriter.addAttributeLen(attrName, attrValue, len); }
|
|
|
|
void _endElement() { fXMLWriter.endElement(); }
|
|
|
|
int findAttribute(SkSVGBase* , const char* attrValue, size_t len, bool isPaint);
|
2011-06-24 19:12:12 +00:00
|
|
|
// const char* getFinal();
|
2008-12-17 15:59:43 +00:00
|
|
|
SkTDict<SkSVGElement*>& getIDs() { return fIDs; }
|
|
|
|
SkString& getPaintLast(SkSVGPaint::Field field);
|
|
|
|
void _startElement(const char name[]) { fXMLWriter.startElement(name); }
|
|
|
|
void translate(SkSVGElement*, bool isDef);
|
|
|
|
void translateMatrix(SkString& , SkString* id);
|
|
|
|
static void ConvertToArray(SkString& vals);
|
|
|
|
protected:
|
|
|
|
virtual bool onAddAttribute(const char name[], const char value[]);
|
|
|
|
bool onAddAttributeLen(const char name[], const char value[], size_t len);
|
|
|
|
virtual bool onEndElement(const char elem[]);
|
|
|
|
virtual bool onStartElement(const char elem[]);
|
|
|
|
bool onStartElementLen(const char elem[], size_t len);
|
|
|
|
virtual bool onText(const char text[], int len);
|
|
|
|
private:
|
|
|
|
bool isStrokeAndFill(SkSVGPaint** stroke, SkSVGPaint** fill);
|
|
|
|
static SkSVGElement* CreateElement(SkSVGTypes type, SkSVGElement* parent);
|
|
|
|
static void Delete(SkTDArray<SkSVGElement*>& fChildren);
|
|
|
|
static SkSVGTypes GetType(const char name[], size_t len);
|
|
|
|
SkSVGPaint* fHead;
|
2012-08-23 18:09:54 +00:00
|
|
|
SkSVGPaint fEmptyPaint;
|
2008-12-17 15:59:43 +00:00
|
|
|
SkSVGPaint fLastFlush;
|
|
|
|
SkString fLastColor;
|
|
|
|
SkMatrix fLastTransform;
|
|
|
|
SkTDArray<SkSVGElement*> fChildren;
|
|
|
|
SkTDict<SkSVGElement*> fIDs;
|
|
|
|
SkTDArray<SkSVGElement*> fParents;
|
|
|
|
SkDynamicMemoryWStream fStream;
|
|
|
|
SkXMLStreamWriter fXMLWriter;
|
|
|
|
SkSVGElement* fCurrElement;
|
|
|
|
SkBool8 fInSVG;
|
|
|
|
SkBool8 fSuppressPaint;
|
|
|
|
friend class SkSVGPaint;
|
|
|
|
friend class SkSVGGradient;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // SkSVGParser_DEFINED
|