mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
fixes https://github.com/flutter/flutter/issues/137372 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
82 lines
2.9 KiB
C++
82 lines
2.9 KiB
C++
// Copyright 2013 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "flutter/fml/logging.h"
|
|
#include "third_party/skia/include/core/SkColorSpace.h"
|
|
#include "third_party/skia/include/core/SkImage.h"
|
|
#include "third_party/skia/include/core/SkImageInfo.h"
|
|
#include "third_party/skia/include/core/SkStream.h"
|
|
#include "third_party/skia/include/core/SkTypeface.h"
|
|
|
|
namespace flutter {
|
|
|
|
sk_sp<SkData> SerializeTypefaceWithoutData(SkTypeface* typeface, void* ctx) {
|
|
return SkData::MakeEmpty();
|
|
}
|
|
|
|
sk_sp<SkData> SerializeTypefaceWithData(SkTypeface* typeface, void* ctx) {
|
|
return typeface->serialize(SkTypeface::SerializeBehavior::kDoIncludeData);
|
|
}
|
|
|
|
sk_sp<SkTypeface> DeserializeTypefaceWithoutData(const void* data,
|
|
size_t length,
|
|
void* ctx) {
|
|
return nullptr;
|
|
}
|
|
|
|
struct ImageMetaData {
|
|
int32_t width;
|
|
int32_t height;
|
|
uint32_t color_type;
|
|
uint32_t alpha_type;
|
|
bool has_color_space;
|
|
} __attribute__((packed));
|
|
|
|
sk_sp<SkData> SerializeImageWithoutData(SkImage* image, void* ctx) {
|
|
const auto& info = image->imageInfo();
|
|
SkDynamicMemoryWStream stream;
|
|
|
|
ImageMetaData metadata = {info.width(), info.height(),
|
|
static_cast<uint32_t>(info.colorType()),
|
|
static_cast<uint32_t>(info.alphaType()),
|
|
static_cast<bool>(info.colorSpace())};
|
|
stream.write(&metadata, sizeof(ImageMetaData));
|
|
|
|
if (info.colorSpace()) {
|
|
auto color_space_data = info.colorSpace()->serialize();
|
|
FML_CHECK(color_space_data);
|
|
SkMemoryStream color_space_stream(color_space_data);
|
|
stream.writeStream(&color_space_stream, color_space_data->size());
|
|
}
|
|
|
|
return stream.detachAsData();
|
|
};
|
|
|
|
sk_sp<SkImage> DeserializeImageWithoutData(const void* data,
|
|
size_t length,
|
|
void* ctx) {
|
|
FML_CHECK(length >= sizeof(ImageMetaData));
|
|
auto metadata = static_cast<const ImageMetaData*>(data);
|
|
sk_sp<SkColorSpace> color_space = nullptr;
|
|
if (metadata->has_color_space) {
|
|
color_space = SkColorSpace::Deserialize(
|
|
static_cast<const uint8_t*>(data) + sizeof(ImageMetaData),
|
|
length - sizeof(ImageMetaData));
|
|
}
|
|
|
|
auto image_size = SkISize::Make(metadata->width, metadata->height);
|
|
auto info = SkImageInfo::Make(
|
|
image_size, static_cast<SkColorType>(metadata->color_type),
|
|
static_cast<SkAlphaType>(metadata->alpha_type), color_space);
|
|
sk_sp<SkData> image_data =
|
|
SkData::MakeUninitialized(image_size.width() * image_size.height() * 4);
|
|
memset(image_data->writable_data(), 0x0f, image_data->size());
|
|
sk_sp<SkImage> image =
|
|
SkImages::RasterFromData(info, image_data, image_size.width() * 4);
|
|
|
|
return image;
|
|
};
|
|
|
|
} // namespace flutter
|