blob: 23abc4ce886515251c725c2bb84e41f395c6fc6c [file] [log] [blame]
/*
* 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 <cstring>
namespace skrive::internal {
static constexpr char kBinaryPrefix[] = "FLARE";
static constexpr size_t kBinaryPrefixSize = sizeof(kBinaryPrefix) - 1;
extern std::unique_ptr<StreamReader> MakeJsonStreamReader(const char[], size_t);
extern std::unique_ptr<StreamReader> MakeBinaryStreamReader(std::unique_ptr<SkStreamAsset>);
std::unique_ptr<StreamReader> StreamReader::Make(const sk_sp<SkData>& 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<const char*>(data->data()), data->size());
}
std::unique_ptr<StreamReader> StreamReader::Make(std::unique_ptr<SkStreamAsset> 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<float*>(&v2), 2);
return v2;
}
SkColor4f StreamReader::readColor(const char label[]) {
SkColor4f color{0,0,0,1};
this->readFloatArray(label, reinterpret_cast<float*>(&color), 4);
return color;
}
} // namespace skrive::internal