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