michael@0: michael@0: /* michael@0: * Copyright 2006 The Android Open Source Project michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #ifndef SkDisplayXMLParser_DEFINED michael@0: #define SkDisplayXMLParser_DEFINED michael@0: michael@0: #include "SkIntArray.h" michael@0: #include "SkTDict.h" michael@0: #include "SkDisplayType.h" michael@0: #include "SkXMLParser.h" michael@0: michael@0: class SkAnimateMaker; michael@0: class SkDisplayable; michael@0: michael@0: class SkDisplayXMLParserError : public SkXMLParserError { michael@0: public: michael@0: enum ErrorCode { michael@0: kApplyScopesItself = kUnknownError + 1, michael@0: kDisplayTreeTooDeep, michael@0: kElementMissingParent, michael@0: kElementTypeNotAllowedInParent, michael@0: kErrorAddingDataToPost, michael@0: kErrorAddingToMatrix, michael@0: kErrorAddingToPaint, michael@0: kErrorAddingToPath, michael@0: kErrorInAttributeValue, michael@0: kErrorInScript, michael@0: kExpectedMovie, michael@0: kFieldNotInTarget, michael@0: kGradientOffsetsDontMatchColors, michael@0: kGradientOffsetsMustBeNoMoreThanOne, michael@0: kGradientOffsetsMustEndWithOne, michael@0: kGradientOffsetsMustIncrease, michael@0: kGradientOffsetsMustStartWithZero, michael@0: kGradientPointsLengthMustBeFour, michael@0: kInInclude, michael@0: kInMovie, michael@0: kIncludeNameUnknownOrMissing, michael@0: kIndexOutOfRange, michael@0: kMovieNameUnknownOrMissing, michael@0: kNoParentAvailable, michael@0: kParentElementCantContain, michael@0: kSaveLayerNeedsBounds, michael@0: kTargetIDNotFound, michael@0: kUnexpectedType michael@0: }; michael@0: virtual ~SkDisplayXMLParserError(); michael@0: virtual void getErrorString(SkString* str) const; michael@0: void setCode(ErrorCode code) { INHERITED::setCode((INHERITED::ErrorCode) code); } michael@0: void setInnerError(SkAnimateMaker* maker, const SkString& str); michael@0: typedef SkXMLParserError INHERITED; michael@0: friend class SkDisplayXMLParser; michael@0: }; michael@0: michael@0: class SkDisplayXMLParser : public SkXMLParser { michael@0: public: michael@0: SkDisplayXMLParser(SkAnimateMaker& maker); michael@0: virtual ~SkDisplayXMLParser(); michael@0: protected: michael@0: virtual bool onAddAttribute(const char name[], const char value[]); michael@0: bool onAddAttributeLen(const char name[], const char value[], size_t len); michael@0: virtual bool onEndElement(const char elem[]); michael@0: virtual bool onStartElement(const char elem[]); michael@0: bool onStartElementLen(const char elem[], size_t len); michael@0: private: michael@0: struct Parent { michael@0: SkDisplayable* fDisplayable; michael@0: SkDisplayTypes fType; michael@0: }; michael@0: SkTDArray fParents; michael@0: SkDisplayXMLParser& operator= (const SkDisplayXMLParser& ); michael@0: SkDisplayXMLParserError* getError() { return (SkDisplayXMLParserError*) fError; } michael@0: const SkMemberInfo* searchContainer(const SkMemberInfo* , michael@0: int infoCount); michael@0: SkAnimateMaker& fMaker; michael@0: SkBool fInInclude; michael@0: SkBool fInSkia; michael@0: // local state between onStartElement and onAddAttribute michael@0: SkDisplayable* fCurrDisplayable; michael@0: SkDisplayTypes fCurrType; michael@0: friend class SkXMLAnimatorWriter; michael@0: typedef SkXMLParser INHERITED; michael@0: }; michael@0: michael@0: #endif // SkDisplayXMLParser_DEFINED