1 /* 2 * Copyright 2006 The Android Open Source Project 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkDOM_DEFINED 9 #define SkDOM_DEFINED 10 11 #include "SkArenaAlloc.h" 12 #include "SkNoncopyable.h" 13 #include "SkScalar.h" 14 #include "SkTemplates.h" 15 #include "SkTypes.h" 16 17 struct SkDOMNode; 18 struct SkDOMAttr; 19 20 class SkDOMParser; 21 class SkStream; 22 class SkXMLParser; 23 24 class SkDOM : public SkNoncopyable { 25 public: 26 SkDOM(); 27 ~SkDOM(); 28 29 typedef SkDOMNode Node; 30 typedef SkDOMAttr Attr; 31 32 /** Returns null on failure 33 */ 34 const Node* build(SkStream&); 35 const Node* copy(const SkDOM& dom, const Node* node); 36 37 const Node* getRootNode() const; 38 39 SkXMLParser* beginParsing(); 40 const Node* finishParsing(); 41 42 enum Type { 43 kElement_Type, 44 kText_Type 45 }; 46 Type getType(const Node*) const; 47 48 const char* getName(const Node*) const; 49 const Node* getFirstChild(const Node*, const char elem[] = nullptr) const; 50 const Node* getNextSibling(const Node*, const char elem[] = nullptr) const; 51 52 const char* findAttr(const Node*, const char attrName[]) const; 53 const Attr* getFirstAttr(const Node*) const; 54 const Attr* getNextAttr(const Node*, const Attr*) const; 55 const char* getAttrName(const Node*, const Attr*) const; 56 const char* getAttrValue(const Node*, const Attr*) const; 57 58 // helpers for walking children 59 int countChildren(const Node* node, const char elem[] = nullptr) const; 60 61 // helpers for calling SkParse 62 bool findS32(const Node*, const char name[], int32_t* value) const; 63 bool findScalars(const Node*, const char name[], SkScalar value[], int count) const; 64 bool findHex(const Node*, const char name[], uint32_t* value) const; 65 bool findBool(const Node*, const char name[], bool*) const; 66 int findList(const Node*, const char name[], const char list[]) const; 67 findScalar(const Node * node,const char name[],SkScalar value[])68 bool findScalar(const Node* node, const char name[], SkScalar value[]) const { 69 return this->findScalars(node, name, value, 1); 70 } 71 72 bool hasAttr(const Node*, const char name[], const char value[]) const; 73 bool hasS32(const Node*, const char name[], int32_t value) const; 74 bool hasScalar(const Node*, const char name[], SkScalar value) const; 75 bool hasHex(const Node*, const char name[], uint32_t value) const; 76 bool hasBool(const Node*, const char name[], bool value) const; 77 78 class AttrIter { 79 public: 80 AttrIter(const SkDOM&, const Node*); 81 const char* next(const char** value); 82 private: 83 const Attr* fAttr; 84 const Attr* fStop; 85 }; 86 87 private: 88 SkArenaAlloc fAlloc; 89 Node* fRoot; 90 std::unique_ptr<SkDOMParser> fParser; 91 92 typedef SkNoncopyable INHERITED; 93 }; 94 95 #endif 96