• 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 "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