Index: src/image/SkImage_Gpu.cpp |
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp |
index cc92d4efa5475b16076571f0580825bd4cdc80b0..9ad33ea2baa013a8a5e4939522f6a7eb3886beea 100644 |
--- a/src/image/SkImage_Gpu.cpp |
+++ b/src/image/SkImage_Gpu.cpp |
@@ -205,18 +205,23 @@ sk_sp<SkImage> SkImage::MakeFromTextureCopy(GrContext* ctx, const GrBackendTextu |
SkBudgeted::kYes); |
} |
-sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorSpace, |
- const GrBackendObject yuvTextureHandles[3], |
- const SkISize yuvSizes[3], |
- GrSurfaceOrigin origin) { |
+static sk_sp<SkImage> make_from_yuv_textures_copy(GrContext* ctx, SkYUVColorSpace colorSpace, |
+ bool nv12, |
+ const GrBackendObject yuvTextureHandles[], |
+ const SkISize yuvSizes[], |
+ GrSurfaceOrigin origin) { |
const SkBudgeted budgeted = SkBudgeted::kYes; |
- if (yuvSizes[0].fWidth <= 0 || yuvSizes[0].fHeight <= 0 || |
- yuvSizes[1].fWidth <= 0 || yuvSizes[1].fHeight <= 0 || |
- yuvSizes[2].fWidth <= 0 || yuvSizes[2].fHeight <= 0) { |
+ if (yuvSizes[0].fWidth <= 0 || yuvSizes[0].fHeight <= 0 || yuvSizes[1].fWidth <= 0 || |
+ yuvSizes[1].fHeight <= 0) { |
+ return nullptr; |
+ } |
+ if (!nv12 && (yuvSizes[2].fWidth <= 0 || yuvSizes[2].fHeight <= 0)) { |
return nullptr; |
} |
- static const GrPixelConfig kConfig = kAlpha_8_GrPixelConfig; |
+ |
+ const GrPixelConfig kConfig = nv12 ? kRGBA_8888_GrPixelConfig : kAlpha_8_GrPixelConfig; |
+ |
GrBackendTextureDesc yDesc; |
yDesc.fConfig = kConfig; |
yDesc.fOrigin = origin; |
@@ -233,20 +238,25 @@ sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace |
uDesc.fWidth = yuvSizes[1].fWidth; |
uDesc.fHeight = yuvSizes[1].fHeight; |
- GrBackendTextureDesc vDesc; |
- vDesc.fConfig = kConfig; |
- vDesc.fOrigin = origin; |
- vDesc.fSampleCnt = 0; |
- vDesc.fTextureHandle = yuvTextureHandles[2]; |
- vDesc.fWidth = yuvSizes[2].fWidth; |
- vDesc.fHeight = yuvSizes[2].fHeight; |
- |
- SkAutoTUnref<GrTexture> yTex(ctx->textureProvider()->wrapBackendTexture( |
- yDesc, kBorrow_GrWrapOwnership)); |
- SkAutoTUnref<GrTexture> uTex(ctx->textureProvider()->wrapBackendTexture( |
- uDesc, kBorrow_GrWrapOwnership)); |
- SkAutoTUnref<GrTexture> vTex(ctx->textureProvider()->wrapBackendTexture( |
- vDesc, kBorrow_GrWrapOwnership)); |
+ sk_sp<GrTexture> yTex( |
+ ctx->textureProvider()->wrapBackendTexture(yDesc, kBorrow_GrWrapOwnership)); |
+ sk_sp<GrTexture> uTex( |
+ ctx->textureProvider()->wrapBackendTexture(uDesc, kBorrow_GrWrapOwnership)); |
+ sk_sp<GrTexture> vTex; |
+ if (nv12) { |
+ vTex = uTex; |
+ } else { |
+ GrBackendTextureDesc vDesc; |
+ vDesc.fConfig = kConfig; |
+ vDesc.fOrigin = origin; |
+ vDesc.fSampleCnt = 0; |
+ vDesc.fTextureHandle = yuvTextureHandles[2]; |
+ vDesc.fWidth = yuvSizes[2].fWidth; |
+ vDesc.fHeight = yuvSizes[2].fHeight; |
+ |
+ vTex = sk_sp<GrTexture>( |
+ ctx->textureProvider()->wrapBackendTexture(vDesc, kBorrow_GrWrapOwnership)); |
+ } |
if (!yTex || !uTex || !vTex) { |
return nullptr; |
} |
@@ -266,8 +276,8 @@ sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace |
GrPaint paint; |
paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); |
- paint.addColorFragmentProcessor(GrYUVEffect::MakeYUVToRGB(yTex, uTex, vTex, yuvSizes, |
- colorSpace)); |
+ paint.addColorFragmentProcessor( |
+ GrYUVEffect::MakeYUVToRGB(yTex.get(), uTex.get(), vTex.get(), yuvSizes, colorSpace, nv12)); |
const SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)); |
@@ -278,6 +288,19 @@ sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace |
drawContext->asTexture().get(), budgeted); |
} |
+sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace colorSpace, |
+ const GrBackendObject yuvTextureHandles[3], |
+ const SkISize yuvSizes[3], GrSurfaceOrigin origin) { |
+ return make_from_yuv_textures_copy(ctx, colorSpace, false, yuvTextureHandles, yuvSizes, origin); |
+} |
+ |
+sk_sp<SkImage> SkImage::MakeFromNV12TexturesCopy(GrContext* ctx, SkYUVColorSpace colorSpace, |
+ const GrBackendObject yuvTextureHandles[2], |
+ const SkISize yuvSizes[2], |
+ GrSurfaceOrigin origin) { |
+ return make_from_yuv_textures_copy(ctx, colorSpace, true, yuvTextureHandles, yuvSizes, origin); |
+} |
+ |
static sk_sp<SkImage> create_image_from_maker(GrTextureMaker* maker, SkAlphaType at, uint32_t id) { |
SkAutoTUnref<GrTexture> texture(maker->refTextureForParams(GrTextureParams::ClampNoFilter(), |
SkSourceGammaTreatment::kRespect)); |