Remove virtual SkImage_Base::getPlanes
Change-Id: I5b106455cc54dad600e64b3f1bfcd02f5099b75b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/306360
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
Reviewed-by: Adlai Holler <adlai@google.com>
diff --git a/tools/DDLPromiseImageHelper.cpp b/tools/DDLPromiseImageHelper.cpp
index 931f03f..bb45fd4 100644
--- a/tools/DDLPromiseImageHelper.cpp
+++ b/tools/DDLPromiseImageHelper.cpp
@@ -13,6 +13,7 @@
#include "include/core/SkYUVAIndex.h"
#include "include/core/SkYUVASizeInfo.h"
#include "include/gpu/GrDirectContext.h"
+#include "src/codec/SkCodecImageGenerator.h"
#include "src/core/SkCachedData.h"
#include "src/core/SkMipmap.h"
#include "src/core/SkTaskGroup.h"
@@ -34,11 +35,10 @@
, fImageInfo(other.fImageInfo)
, fBaseLevel(other.fBaseLevel)
, fMipLevels(std::move(other.fMipLevels))
- , fYUVData(std::move(other.fYUVData))
, fYUVColorSpace(other.fYUVColorSpace) {
memcpy(fYUVAIndices, other.fYUVAIndices, sizeof(fYUVAIndices));
for (int i = 0; i < SkYUVASizeInfo::kMaxCount; ++i) {
- fYUVPlanes[i] = other.fYUVPlanes[i];
+ fYUVPlanes[i] = std::move(other.fYUVPlanes[i]);
fCallbackContexts[i] = std::move(other.fCallbackContexts[i]);
}
}
@@ -70,6 +70,44 @@
fMipLevels = std::move(mipLevels);
}
+void DDLPromiseImageHelper::PromiseImageInfo::setYUVPlanes(
+ const SkYUVASizeInfo& yuvaSizeInfo,
+ const SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
+ SkYUVColorSpace cs,
+ std::unique_ptr<char[]> planes[SkYUVAIndex::kIndexCount]) {
+ memcpy(fYUVAIndices, yuvaIndices, sizeof(fYUVAIndices));
+ fYUVColorSpace = cs;
+ SkColorType colorTypes[] = {kUnknown_SkColorType,
+ kUnknown_SkColorType,
+ kUnknown_SkColorType,
+ kUnknown_SkColorType};
+ for (int yuvIndex = 0; yuvIndex < SkYUVAIndex::kIndexCount; ++yuvIndex) {
+ int texIdx = yuvaIndices[yuvIndex].fIndex;
+ if (texIdx < 0) {
+ SkASSERT(SkYUVAIndex::kA_Index == yuvIndex);
+ continue;
+ }
+ // In current testing only ever expect A8, RG_88
+ if (colorTypes[texIdx] == kUnknown_SkColorType) {
+ colorTypes[texIdx] = kAlpha_8_SkColorType;
+ } else {
+ SkASSERT(colorTypes[texIdx] == kAlpha_8_SkColorType);
+ colorTypes[texIdx] = kR8G8_unorm_SkColorType;
+ }
+ }
+
+ for (int i = 0; i < SkYUVASizeInfo::kMaxCount; ++i) {
+ if (yuvaSizeInfo.fSizes[i].isEmpty()) {
+ SkASSERT(!yuvaSizeInfo.fWidthBytes[i] && colorTypes[i] == kUnknown_SkColorType);
+ continue;
+ }
+ auto info = SkImageInfo::Make(yuvaSizeInfo.fSizes[i], colorTypes[i], kPremul_SkAlphaType);
+ auto release = [](void* addr, void*) { std::unique_ptr<char[]>(static_cast<char*>(addr)); };
+ fYUVPlanes[i].installPixels(info, planes[i].get(), yuvaSizeInfo.fWidthBytes[i], release,
+ planes[i].release());
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////////
PromiseImageCallbackContext::~PromiseImageCallbackContext() {
SkASSERT(fDoneCnt == fNumImages);
@@ -429,42 +467,19 @@
SkYUVASizeInfo yuvaSizeInfo;
SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount];
SkYUVColorSpace yuvColorSpace;
- const void* planes[SkYUVASizeInfo::kMaxCount];
- sk_sp<SkCachedData> yuvData = ib->getPlanes(&yuvaSizeInfo, yuvaIndices, &yuvColorSpace, planes);
- if (yuvData) {
- newImageInfo.setYUVData(std::move(yuvData), yuvaIndices, yuvColorSpace);
-
- // determine colortypes from index data
- // for testing we only ever use A8, RG_88
- SkColorType colorTypes[SkYUVASizeInfo::kMaxCount] = {
- kUnknown_SkColorType, kUnknown_SkColorType,
- kUnknown_SkColorType, kUnknown_SkColorType
- };
- for (int yuvIndex = 0; yuvIndex < SkYUVAIndex::kIndexCount; ++yuvIndex) {
- int texIdx = yuvaIndices[yuvIndex].fIndex;
- if (texIdx < 0) {
- SkASSERT(SkYUVAIndex::kA_Index == yuvIndex);
- continue;
+ auto codec = SkCodecImageGenerator::MakeFromEncodedCodec(ib->refEncodedData());
+ std::unique_ptr<char[]> planes[SkYUVASizeInfo::kMaxCount];
+ if (codec && codec->queryYUVA8(&yuvaSizeInfo, yuvaIndices, &yuvColorSpace)) {
+ void* data[4];
+ for (int i = 0; i < 4; ++i) {
+ size_t size = yuvaSizeInfo.fSizes[i].height() * yuvaSizeInfo.fWidthBytes[i];
+ if (size) {
+ planes[i].reset(new char[size]);
}
- if (kUnknown_SkColorType == colorTypes[texIdx]) {
- colorTypes[texIdx] = kAlpha_8_SkColorType;
- } else {
- colorTypes[texIdx] = kR8G8_unorm_SkColorType;
- }
+ data[i] = planes[i].get();
}
-
- for (int i = 0; i < SkYUVASizeInfo::kMaxCount; ++i) {
- if (yuvaSizeInfo.fSizes[i].isEmpty()) {
- SkASSERT(!yuvaSizeInfo.fWidthBytes[i] && kUnknown_SkColorType == colorTypes[i]);
- continue;
- }
-
- SkImageInfo planeII = SkImageInfo::Make(yuvaSizeInfo.fSizes[i].fWidth,
- yuvaSizeInfo.fSizes[i].fHeight,
- colorTypes[i],
- kUnpremul_SkAlphaType);
- newImageInfo.addYUVPlane(i, planeII, planes[i], yuvaSizeInfo.fWidthBytes[i]);
- }
+ SkAssertResult(codec->getYUVA8Planes(yuvaSizeInfo, yuvaIndices, data));
+ newImageInfo.setYUVPlanes(yuvaSizeInfo, yuvaIndices, yuvColorSpace, planes);
} else {
sk_sp<SkImage> rasterImage = image->makeRasterImage(); // force decoding of lazy images
if (!rasterImage) {