• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "../private/SkTemplates.h"
12 #include "SkArenaAlloc.h"
13 #include "SkScalar.h"
14 #include "SkTypes.h"
15 
16 struct SkDOMNode;
17 struct SkDOMAttr;
18 
19 class SkDOMParser;
20 class SkStream;
21 class SkXMLParser;
22 
23 class SkDOM : public SkNoncopyable {
24 public:
25     SkDOM();
26     ~SkDOM();
27 
28     typedef SkDOMNode Node;
29     typedef SkDOMAttr Attr;
30 
31     /** Returns null on failure
32     */
33     const Node* build(SkStream&);
34     const Node* copy(const SkDOM& dom, const Node* node);
35 
36     const Node* getRootNode() const;
37 
38     SkXMLParser* beginParsing();
39     const Node* finishParsing();
40 
41     enum Type {
42         kElement_Type,
43         kText_Type
44     };
45     Type getType(const Node*) const;
46 
47     const char* getName(const Node*) const;
48     const Node* getFirstChild(const Node*, const char elem[] = NULL) const;
49     const Node* getNextSibling(const Node*, const char elem[] = NULL) const;
50 
51     const char* findAttr(const Node*, const char attrName[]) const;
52     const Attr* getFirstAttr(const Node*) const;
53     const Attr* getNextAttr(const Node*, const Attr*) const;
54     const char* getAttrName(const Node*, const Attr*) const;
55     const char* getAttrValue(const Node*, const Attr*) const;
56 
57     // helpers for walking children
58     int countChildren(const Node* node, const char elem[] = NULL) const;
59 
60     // helpers for calling SkParse
61     bool findS32(const Node*, const char name[], int32_t* value) const;
62     bool findScalars(const Node*, const char name[], SkScalar value[], int count) const;
63     bool findHex(const Node*, const char name[], uint32_t* value) const;
64     bool findBool(const Node*, const char name[], bool*) const;
65     int  findList(const Node*, const char name[], const char list[]) const;
66 
findScalar(const Node * node,const char name[],SkScalar value[])67     bool findScalar(const Node* node, const char name[], SkScalar value[]) const {
68         return this->findScalars(node, name, value, 1);
69     }
70 
71     bool hasAttr(const Node*, const char name[], const char value[]) const;
72     bool hasS32(const Node*, const char name[], int32_t value) const;
73     bool hasScalar(const Node*, const char name[], SkScalar value) const;
74     bool hasHex(const Node*, const char name[], uint32_t value) const;
75     bool hasBool(const Node*, const char name[], bool value) const;
76 
77     class AttrIter {
78     public:
79         AttrIter(const SkDOM&, const Node*);
80         const char* next(const char** value);
81     private:
82         const Attr* fAttr;
83         const Attr* fStop;
84     };
85 
86 private:
87     SkArenaAlloc                 fAlloc;
88     Node*                        fRoot;
89     std::unique_ptr<SkDOMParser> fParser;
90 
91     typedef SkNoncopyable INHERITED;
92 };
93 
94 #endif
95