/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "experimental/skrive/include/SkRive.h" #include "experimental/skrive/src/reader/StreamReader.h" #include "include/core/SkStream.h" namespace skrive { namespace internal { extern sk_sp parse_artboard(StreamReader*); void parse_artboards(const sk_sp& skrive, StreamReader* sr) { const size_t artboard_count = sr->readLength16(); skrive->artboards().reserve(artboard_count); for (size_t i = 0; i < artboard_count; ++i) { StreamReader::AutoBlock block(sr); if (block.type() == StreamReader::BlockType::kEoB) { break; } if (block.type() != StreamReader::BlockType::kActorArtboard) { SkDebugf("!! Unexpected artboard block type: %d\n", (int)block.type()); continue; } skrive->artboards().push_back(parse_artboard(sr)); } } static sk_sp parse_skrive(std::unique_ptr sr) { if (!sr) { return nullptr; } const auto version = sr->readUInt32("version"); SkDebugf(".. loading version %d\n", version); auto skrive = sk_make_sp(); for (;;) { StreamReader::AutoBlock block(sr); if (block.type() == StreamReader::BlockType::kEoB) { break; } switch (block.type()) { case StreamReader::BlockType::kArtboards: parse_artboards(skrive, sr.get()); break; default: SkDebugf("!! Unsupported block type: %d\n", (int)block.type()); break; } } return skrive; } } // namespace internal sk_sp SkRive::Builder::make(std::unique_ptr stream) { auto reader = internal::StreamReader::Make(std::move(stream)); return reader ? parse_skrive(std::move(reader)) : nullptr; } } // namespace skrive