1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "experimental/skrive/src/reader/StreamReader.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ci#include <cstring> 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cinamespace skrive::internal { 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cistatic constexpr char kBinaryPrefix[] = "FLARE"; 17cb93a386Sopenharmony_cistatic constexpr size_t kBinaryPrefixSize = sizeof(kBinaryPrefix) - 1; 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ciextern std::unique_ptr<StreamReader> MakeJsonStreamReader(const char[], size_t); 20cb93a386Sopenharmony_ciextern std::unique_ptr<StreamReader> MakeBinaryStreamReader(std::unique_ptr<SkStreamAsset>); 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cistd::unique_ptr<StreamReader> StreamReader::Make(const sk_sp<SkData>& data) { 23cb93a386Sopenharmony_ci if (data->size() >= kBinaryPrefixSize && 24cb93a386Sopenharmony_ci !memcmp(data->data(), kBinaryPrefix, kBinaryPrefixSize)) { 25cb93a386Sopenharmony_ci auto reader = SkMemoryStream::Make(data); 26cb93a386Sopenharmony_ci reader->skip(kBinaryPrefixSize); 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci return MakeBinaryStreamReader(std::move(reader)); 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci return MakeJsonStreamReader(static_cast<const char*>(data->data()), data->size()); 32cb93a386Sopenharmony_ci} 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_cistd::unique_ptr<StreamReader> StreamReader::Make(std::unique_ptr<SkStreamAsset> stream) { 35cb93a386Sopenharmony_ci char buf[kBinaryPrefixSize]; 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci if (stream->read(buf, kBinaryPrefixSize) == kBinaryPrefixSize) { 38cb93a386Sopenharmony_ci if (!strncmp(buf, kBinaryPrefix, kBinaryPrefixSize)) { 39cb93a386Sopenharmony_ci // binary stream - we can stay in streaming mode 40cb93a386Sopenharmony_ci return MakeBinaryStreamReader(std::move(stream)); 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci } else { 43cb93a386Sopenharmony_ci // stream too short to hold anything useful 44cb93a386Sopenharmony_ci return nullptr; 45cb93a386Sopenharmony_ci } 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci if (!stream->rewind()) { 48cb93a386Sopenharmony_ci SkDebugf("!! failed to rewind stream.\n"); 49cb93a386Sopenharmony_ci return nullptr; 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci // read to memory to figure what we're dealing with 53cb93a386Sopenharmony_ci return StreamReader::Make(SkData::MakeFromStream(stream.get(), stream->getLength())); 54cb93a386Sopenharmony_ci} 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ciSkV2 StreamReader::readV2(const char label[]) { 57cb93a386Sopenharmony_ci SkV2 v2{0,0}; 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci this->readFloatArray(label, reinterpret_cast<float*>(&v2), 2); 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci return v2; 62cb93a386Sopenharmony_ci} 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ciSkColor4f StreamReader::readColor(const char label[]) { 65cb93a386Sopenharmony_ci SkColor4f color{0,0,0,1}; 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci this->readFloatArray(label, reinterpret_cast<float*>(&color), 4); 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci return color; 70cb93a386Sopenharmony_ci} 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci} // namespace skrive::internal 73