Reland "Add compressed data support for SkImage."
This is a reland of 57263c2e0ccddf4dd62814c427a39d9d615acbe5
Original change's description:
> Add compressed data support for SkImage.
>
> Adds a new SkImage::MakeFromCompressed method which takes raw data,
> a size, and a compression method, and returns a GPU-backed
> image.
>
> Bug: skia:8684
> Change-Id: I570c9dafce283bcd64dfbef4fbe1c4bfeac6ce2a
> Reviewed-on: https://skia-review.googlesource.com/c/184484
> Commit-Queue: Jim Van Verth <jvanverth@google.com>
> Reviewed-by: Brian Salomon <bsalomon@google.com>
> Reviewed-by: Robert Phillips <robertphillips@google.com>
Bug: skia:8684
Change-Id: I25fb320e8cc05e1c5afa6faa81e1a55ffd83a7a3
Reviewed-on: https://skia-review.googlesource.com/c/185200
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
diff --git a/src/gpu/GrProxyProvider.cpp b/src/gpu/GrProxyProvider.cpp
index 657d607..3aa6262 100644
--- a/src/gpu/GrProxyProvider.cpp
+++ b/src/gpu/GrProxyProvider.cpp
@@ -412,6 +412,42 @@
fit, budgeted, surfaceFlags));
}
+sk_sp<GrTextureProxy> GrProxyProvider::createProxy(sk_sp<SkData> data, const GrSurfaceDesc& desc) {
+ if (!this->caps()->isConfigTexturable(desc.fConfig)) {
+ return nullptr;
+ }
+
+ const GrColorType ct = GrPixelConfigToColorType(desc.fConfig);
+ const GrBackendFormat format = fCaps->getBackendFormatFromGrColorType(ct, GrSRGBEncoded::kNo);
+
+ sk_sp<GrTextureProxy> proxy = this->createLazyProxy(
+ [desc, data](GrResourceProvider* resourceProvider) {
+ if (!resourceProvider) {
+ return sk_sp<GrTexture>();
+ }
+
+ GrMipLevel texels;
+ texels.fPixels = data->data();
+ texels.fRowBytes = GrBytesPerPixel(desc.fConfig)*desc.fWidth;
+ return resourceProvider->createTexture(desc, SkBudgeted::kYes, &texels, 1);
+ },
+ format, desc, kTopLeft_GrSurfaceOrigin, GrMipMapped::kNo, SkBackingFit::kExact,
+ SkBudgeted::kYes);
+
+ if (!proxy) {
+ return nullptr;
+ }
+
+ if (fResourceProvider) {
+ // In order to reuse code we always create a lazy proxy. When we aren't in DDL mode however
+ // we're better off instantiating the proxy immediately here.
+ if (!proxy->priv().doLazyInstantiation(fResourceProvider)) {
+ return nullptr;
+ }
+ }
+ return proxy;
+}
+
sk_sp<GrTextureProxy> GrProxyProvider::wrapBackendTexture(const GrBackendTexture& backendTex,
GrSurfaceOrigin origin,
GrWrapOwnership ownership,