diff options
author | Jim Van Verth <jvanverth@google.com> | 2018-10-18 10:31:59 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-10-18 15:10:39 +0000 |
commit | 0c583af06d50cf3a11a39f5804eccdeefd74fc02 (patch) | |
tree | ce98c3fb615a9033322336c4eb0d52d8f6d1e5b0 /src/image | |
parent | dbac839f07a682e6685ab5a4536e137f779b85b8 (diff) | |
download | skqp-0c583af06d50cf3a11a39f5804eccdeefd74fc02.tar.gz |
Widen internal API to support more complex YUV formats
Bug: skia:7901
Change-Id: I46fec08711b8b483cf58ccae733e4dc2a9689231
Reviewed-on: https://skia-review.googlesource.com/c/162280
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/image')
-rw-r--r-- | src/image/SkImage.cpp | 3 | ||||
-rw-r--r-- | src/image/SkImage_Base.h | 3 | ||||
-rw-r--r-- | src/image/SkImage_GpuYUVA.cpp | 19 | ||||
-rw-r--r-- | src/image/SkImage_Lazy.cpp | 19 | ||||
-rw-r--r-- | src/image/SkImage_Lazy.h | 3 |
5 files changed, 30 insertions, 17 deletions
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index 75cf1270ab..dcdd103d54 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -227,7 +227,8 @@ bool SkImage::asLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode ) const { return as_IB(this)->onAsLegacyBitmap(bitmap); } -sk_sp<SkCachedData> SkImage_Base::getPlanes(SkYUVSizeInfo*, SkYUVColorSpace*,const void*[3]) { +sk_sp<SkCachedData> SkImage_Base::getPlanes(SkYUVSizeInfo*, SkYUVAIndex[4], + SkYUVColorSpace*, const void*[4]) { return nullptr; } diff --git a/src/image/SkImage_Base.h b/src/image/SkImage_Base.h index 8765f8948e..7bbd81d05f 100644 --- a/src/image/SkImage_Base.h +++ b/src/image/SkImage_Base.h @@ -72,7 +72,8 @@ public: virtual sk_sp<SkImage> onMakeSubset(const SkIRect&) const = 0; - virtual sk_sp<SkCachedData> getPlanes(SkYUVSizeInfo*, SkYUVColorSpace*, const void* planes[3]); + virtual sk_sp<SkCachedData> getPlanes(SkYUVSizeInfo*, SkYUVAIndex[4], + SkYUVColorSpace*, const void* planes[4]); virtual sk_sp<SkData> onRefEncoded() const { return nullptr; } virtual bool onAsLegacyBitmap(SkBitmap*) const; diff --git a/src/image/SkImage_GpuYUVA.cpp b/src/image/SkImage_GpuYUVA.cpp index 25b9349fa4..2fd4406586 100644 --- a/src/image/SkImage_GpuYUVA.cpp +++ b/src/image/SkImage_GpuYUVA.cpp @@ -233,6 +233,7 @@ sk_sp<SkImage> SkImage_GpuYUVA::MakePromiseYUVATexture(GrContext* context, } // Set up color types + // TODO: pass in the correct color type rather than deducing it? SkColorType texColorTypes[4] = { kUnknown_SkColorType, kUnknown_SkColorType, kUnknown_SkColorType, kUnknown_SkColorType }; for (int yuvIndex = 0; yuvIndex < 4; ++yuvIndex) { @@ -247,10 +248,6 @@ sk_sp<SkImage> SkImage_GpuYUVA::MakePromiseYUVATexture(GrContext* context, texColorTypes[texIdx] = kRGBA_8888_SkColorType; } } - // If UV is interleaved, then Y will have RGBA color type - if (kRGBA_8888_SkColorType == texColorTypes[yuvaIndices[SkYUVAIndex::kU_Index].fIndex]) { - texColorTypes[yuvaIndices[SkYUVAIndex::kY_Index].fIndex] = kRGBA_8888_SkColorType; - } // Get lazy proxies GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider(); @@ -261,9 +258,17 @@ sk_sp<SkImage> SkImage_GpuYUVA::MakePromiseYUVATexture(GrContext* context, GrPixelConfig fConfig; SkPromiseImageHelper fPromiseHelper; } params; - if (!context->contextPriv().caps()->getConfigFromBackendFormat(yuvaFormats[texIdx], - texColorTypes[texIdx], - ¶ms.fConfig)) { + bool res = context->contextPriv().caps()->getConfigFromBackendFormat(yuvaFormats[texIdx], + texColorTypes[texIdx], + ¶ms.fConfig); + // Even though the data is single channel, we might be handed a multi-channel texture. + // To cover this case, we'll re-try with the RGBA colortype on failure. + if (!res && kAlpha_8_SkColorType == texColorTypes[texIdx]) { + res = context->contextPriv().caps()->getConfigFromBackendFormat(yuvaFormats[texIdx], + kRGBA_8888_SkColorType, + ¶ms.fConfig); + } + if (!res) { return nullptr; } params.fPromiseHelper = promiseHelpers[texIdx]; diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp index 7071b4b6f6..1688a8178f 100644 --- a/src/image/SkImage_Lazy.cpp +++ b/src/image/SkImage_Lazy.cpp @@ -355,11 +355,15 @@ public: private: uint32_t onGetID() const override { return fGen->uniqueID(); } - bool onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const override { - return fGen->queryYUV8(sizeInfo, colorSpace); + bool onQueryYUVA8(SkYUVSizeInfo* sizeInfo, + SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount], + SkYUVColorSpace* colorSpace) const override { + return fGen->queryYUVA8(sizeInfo, yuvaIndices, colorSpace); } - bool onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) override { - return fGen->getYUV8Planes(sizeInfo, planes); + bool onGetYUVA8Planes(const SkYUVSizeInfo& sizeInfo, + const SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount], + void* planes[]) override { + return fGen->getYUVA8Planes(sizeInfo, yuvaIndices, planes); } SkImageGenerator* fGen; @@ -384,13 +388,14 @@ static void set_key_on_proxy(GrProxyProvider* proxyProvider, } } -sk_sp<SkCachedData> SkImage_Lazy::getPlanes(SkYUVSizeInfo* yuvSizeInfo, +sk_sp<SkCachedData> SkImage_Lazy::getPlanes(SkYUVSizeInfo* yuvaSizeInfo, + SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount], SkYUVColorSpace* yuvColorSpace, - const void* planes[3]) { + const void* planes[SkYUVSizeInfo::kMaxCount]) { ScopedGenerator generator(fSharedGenerator); Generator_GrYUVProvider provider(generator); - sk_sp<SkCachedData> data = provider.getPlanes(yuvSizeInfo, yuvColorSpace, planes); + sk_sp<SkCachedData> data = provider.getPlanes(yuvaSizeInfo, yuvaIndices, yuvColorSpace, planes); if (!data) { return nullptr; } diff --git a/src/image/SkImage_Lazy.h b/src/image/SkImage_Lazy.h index a2b434a2b1..5c30ee390a 100644 --- a/src/image/SkImage_Lazy.h +++ b/src/image/SkImage_Lazy.h @@ -49,7 +49,8 @@ public: const GrSamplerState&, SkColorSpace*, sk_sp<SkColorSpace>*, SkScalar scaleAdjust[2]) const override; - sk_sp<SkCachedData> getPlanes(SkYUVSizeInfo*, SkYUVColorSpace*, const void* planes[3]) override; + sk_sp<SkCachedData> getPlanes(SkYUVSizeInfo*, SkYUVAIndex[4], + SkYUVColorSpace*, const void* planes[4]) override; #endif sk_sp<SkData> onRefEncoded() const override; sk_sp<SkImage> onMakeSubset(const SkIRect&) const override; |