/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkRive_Streamreader_DEFINED #define SkRive_Streamreader_DEFINED #include #include "include/core/SkColor.h" #include "include/core/SkM44.h" #include "include/core/SkRefCnt.h" class SkStreamAsset; class SkString; namespace skrive::internal { class StreamReader { public: virtual ~StreamReader() = default; static std::unique_ptr Make(std::unique_ptr); static std::unique_ptr Make(const sk_sp&); enum class BlockType : uint8_t { kUnknown = 0, kComponents = 1, kActorNode = 2, kActorShape = 100, kActorPath = 101, kColorFill = 102, kColorStroke = 103, kGradientFill = 104, kGradientStroke = 105, kRadialGradientFill = 106, kRadialGradientStroke = 107, kActorEllipse = 108, kActorRectangle = 109, kActorTriangle = 110, kActorStar = 111, kActorPolygon = 112, kActorArtboard = 114, kArtboards = 115, // End-of-block marker kEoB = 0xff, }; // Sequential block API virtual BlockType openBlock() = 0; virtual void closeBlock() = 0; // Keyed API virtual bool openArray(const char label[]) = 0; virtual void closeArray() = 0; virtual bool openObject(const char label[]) = 0; virtual void closeObject() = 0; virtual uint16_t readId (const char label[]) = 0; virtual bool readBool (const char label[]) = 0; virtual float readFloat (const char label[]) = 0; virtual uint8_t readUInt8 (const char label[]) = 0; virtual uint16_t readUInt16(const char label[]) = 0; virtual uint32_t readUInt32(const char label[]) = 0; virtual SkString readString(const char label[]) = 0; virtual uint8_t readLength8 () = 0; virtual uint16_t readLength16() = 0; SkColor4f readColor(const char label[]); SkV2 readV2(const char label[]); class AutoBlock final { public: explicit AutoBlock(StreamReader* reader) : fReader(reader) , fType(reader->openBlock()) {} explicit AutoBlock(const std::unique_ptr& reader) : fReader(reader.get()) , fType(reader->openBlock()) {} ~AutoBlock() { if (fType != BlockType::kEoB) { fReader->closeBlock(); } } BlockType type() const { return fType; } private: StreamReader* fReader; BlockType fType; }; protected: virtual size_t readFloatArray(const char label[], float dst[], size_t count) = 0; }; } // namespace skrive::internal #endif // SkRiveStreamreader_DEFINED