aboutsummaryrefslogtreecommitdiff
path: root/src/image
diff options
context:
space:
mode:
authorJim Van Verth <jvanverth@google.com>2018-10-18 10:31:59 -0400
committerSkia Commit-Bot <skia-commit-bot@chromium.org>2018-10-18 15:10:39 +0000
commit0c583af06d50cf3a11a39f5804eccdeefd74fc02 (patch)
treece98c3fb615a9033322336c4eb0d52d8f6d1e5b0 /src/image
parentdbac839f07a682e6685ab5a4536e137f779b85b8 (diff)
downloadskqp-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.cpp3
-rw-r--r--src/image/SkImage_Base.h3
-rw-r--r--src/image/SkImage_GpuYUVA.cpp19
-rw-r--r--src/image/SkImage_Lazy.cpp19
-rw-r--r--src/image/SkImage_Lazy.h3
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],
- &params.fConfig)) {
+ bool res = context->contextPriv().caps()->getConfigFromBackendFormat(yuvaFormats[texIdx],
+ texColorTypes[texIdx],
+ &params.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,
+ &params.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;