expose direct methods for decoding to an image
These are meant to contrast MakeFromEncoded(), and emphasize that it is deferred/cached,
while the new methods are not.
Change-Id: I83ac22394cb14cdc84ff8507a514bf708734b84f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/234476
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index 079992a..ae0998c 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -410,6 +410,10 @@
#if !SK_SUPPORT_GPU
+sk_sp<SkImage> SkImage::DecodeToTexture(GrContext*, const void*, size_t, const SkIRect*) {
+ return nullptr;
+}
+
sk_sp<SkImage> SkImage::MakeFromTexture(GrContext* ctx,
const GrBackendTexture& tex, GrSurfaceOrigin origin,
SkColorType ct, SkAlphaType at, sk_sp<SkColorSpace> cs,
diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp
index fbccdc2..5a9c9b2 100644
--- a/src/image/SkImage_Lazy.cpp
+++ b/src/image/SkImage_Lazy.cpp
@@ -287,6 +287,44 @@
return validator ? sk_make_sp<SkImage_Lazy>(&validator) : nullptr;
}
+sk_sp<SkImage> SkImage::DecodeToRaster(const void* encoded, size_t length, const SkIRect* subset) {
+ // The generator will not outlive this function, so we can wrap the encoded data without copy
+ auto gen = SkImageGenerator::MakeFromEncoded(SkData::MakeWithoutCopy(encoded, length));
+ if (!gen) {
+ return nullptr;
+ }
+ SkImageInfo info = gen->getInfo();
+ if (info.isEmpty()) {
+ return nullptr;
+ }
+
+ SkIPoint origin = {0, 0};
+ if (subset) {
+ if (!SkIRect::MakeWH(info.width(), info.height()).contains(*subset)) {
+ return nullptr;
+ }
+ info = info.makeWH(subset->width(), subset->height());
+ origin = {subset->x(), subset->y()};
+ }
+
+ size_t rb = info.minRowBytes();
+ if (rb == 0) {
+ return nullptr; // rb was too big
+ }
+ size_t size = info.computeByteSize(rb);
+ if (size == SIZE_MAX) {
+ return nullptr;
+ }
+ auto data = SkData::MakeUninitialized(size);
+
+ SkPixmap pmap(info, data->writable_data(), rb);
+ if (!generate_pixels(gen.get(), pmap, origin.x(), origin.y())) {
+ return nullptr;
+ }
+
+ return SkImage::MakeRasterData(info, data, rb);
+}
+
//////////////////////////////////////////////////////////////////////////////////////////////////
#if SK_SUPPORT_GPU
@@ -498,4 +536,14 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
+sk_sp<SkImage> SkImage::DecodeToTexture(GrContext* ctx, const void* encoded, size_t length,
+ const SkIRect* subset) {
+ // img will not survive this function, so we don't need to copy/own the encoded data,
+ auto img = MakeFromEncoded(SkData::MakeWithoutCopy(encoded, length), subset);
+ if (!img) {
+ return nullptr;
+ }
+ return img->makeTextureImage(ctx, nullptr);
+}
+
#endif