/* * 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/src/reader/StreamReader.h" #include "include/core/SkStream.h" #include namespace skrive::internal { static constexpr char kBinaryPrefix[] = "FLARE"; static constexpr size_t kBinaryPrefixSize = sizeof(kBinaryPrefix) - 1; extern std::unique_ptr MakeJsonStreamReader(const char[], size_t); extern std::unique_ptr MakeBinaryStreamReader(std::unique_ptr); std::unique_ptr StreamReader::Make(const sk_sp& data) { if (data->size() >= kBinaryPrefixSize && !memcmp(data->data(), kBinaryPrefix, kBinaryPrefixSize)) { auto reader = SkMemoryStream::Make(data); reader->skip(kBinaryPrefixSize); return MakeBinaryStreamReader(std::move(reader)); } return MakeJsonStreamReader(static_cast(data->data()), data->size()); } std::unique_ptr StreamReader::Make(std::unique_ptr stream) { char buf[kBinaryPrefixSize]; if (stream->read(buf, kBinaryPrefixSize) == kBinaryPrefixSize) { if (!strncmp(buf, kBinaryPrefix, kBinaryPrefixSize)) { // binary stream - we can stay in streaming mode return MakeBinaryStreamReader(std::move(stream)); } } else { // stream too short to hold anything useful return nullptr; } if (!stream->rewind()) { SkDebugf("!! failed to rewind stream.\n"); return nullptr; } // read to memory to figure what we're dealing with return StreamReader::Make(SkData::MakeFromStream(stream.get(), stream->getLength())); } SkV2 StreamReader::readV2(const char label[]) { SkV2 v2{0,0}; this->readFloatArray(label, reinterpret_cast(&v2), 2); return v2; } SkColor4f StreamReader::readColor(const char label[]) { SkColor4f color{0,0,0,1}; this->readFloatArray(label, reinterpret_cast(&color), 4); return color; } } // namespace skrive::internal