1 
2 /*
3  * Copyright 2006 The Android Open Source Project
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 #ifndef SkDisplayXMLParser_DEFINED
11 #define SkDisplayXMLParser_DEFINED
12 
13 #include "SkIntArray.h"
14 #include "SkTDict.h"
15 #include "SkDisplayType.h"
16 #include "SkXMLParser.h"
17 
18 class SkAnimateMaker;
19 class SkDisplayable;
20 
21 class SkDisplayXMLParserError : public SkXMLParserError {
22 public:
23     enum ErrorCode {
24         kApplyScopesItself = kUnknownError + 1,
25         kDisplayTreeTooDeep,
26         kElementMissingParent,
27         kElementTypeNotAllowedInParent,
28         kErrorAddingDataToPost,
29         kErrorAddingToMatrix,
30         kErrorAddingToPaint,
31         kErrorAddingToPath,
32         kErrorInAttributeValue,
33         kErrorInScript,
34         kExpectedMovie,
35         kFieldNotInTarget,
36         kGradientOffsetsDontMatchColors,
37         kGradientOffsetsMustBeNoMoreThanOne,
38         kGradientOffsetsMustEndWithOne,
39         kGradientOffsetsMustIncrease,
40         kGradientOffsetsMustStartWithZero,
41         kGradientPointsLengthMustBeFour,
42         kInInclude,
43         kInMovie,
44         kIncludeNameUnknownOrMissing,
45         kIndexOutOfRange,
46         kMovieNameUnknownOrMissing,
47         kNoParentAvailable,
48         kParentElementCantContain,
49         kSaveLayerNeedsBounds,
50         kTargetIDNotFound,
51         kUnexpectedType
52     };
53     virtual ~SkDisplayXMLParserError();
54     virtual void getErrorString(SkString* str) const;
setCode(ErrorCode code)55     void setCode(ErrorCode code) { INHERITED::setCode((INHERITED::ErrorCode) code); }
56     void setInnerError(SkAnimateMaker* maker, const SkString& str);
57     typedef SkXMLParserError INHERITED;
58     friend class SkDisplayXMLParser;
59 };
60 
61 class SkDisplayXMLParser : public SkXMLParser {
62 public:
63     SkDisplayXMLParser(SkAnimateMaker& maker);
64     virtual ~SkDisplayXMLParser();
65 protected:
66     virtual bool onAddAttribute(const char name[], const char value[]);
67     bool onAddAttributeLen(const char name[], const char value[], size_t len);
68     virtual bool onEndElement(const char elem[]);
69     virtual bool onStartElement(const char elem[]);
70     bool onStartElementLen(const char elem[], size_t len);
71 private:
72     struct Parent {
73         SkDisplayable* fDisplayable;
74         SkDisplayTypes fType;
75     };
76     SkTDArray<Parent> fParents;
77     SkDisplayXMLParser& operator= (const SkDisplayXMLParser& );
getError()78     SkDisplayXMLParserError* getError() { return (SkDisplayXMLParserError*) fError; }
79     const SkMemberInfo* searchContainer(const SkMemberInfo* ,
80         int infoCount);
81     SkAnimateMaker& fMaker;
82     SkBool fInInclude;
83     SkBool fInSkia;
84     // local state between onStartElement and onAddAttribute
85     SkDisplayable*  fCurrDisplayable;
86     SkDisplayTypes  fCurrType;
87     friend class SkXMLAnimatorWriter;
88     typedef SkXMLParser INHERITED;
89 };
90 
91 #endif // SkDisplayXMLParser_DEFINED
92