Remove legacy SkImageGenerator YUV planes interface
Bug: skia:10632
Change-Id: Iaed6b51e03ef9023a74d77f3262104c1677c416f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/327917
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index e2d4147..c3159b4 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -9,10 +9,15 @@
* <insert new release notes here>
+ * Legacy 8-bit YUV interface removed from SkImageGenerator. Use more flexible SkYUVAPixmaps-
+ based interface instead.
+ https://review.skia.org/327917
+
* New variant of SkImage::MakeFromYUVATextures. Takes a new type GrYUVATextures
which wraps an SkYUVAInfo and compatible set of GrBackendTextures. The provides
a more complete and structured specification of the planar configuration. Previous
version is deprecated.
+ https://review.skia.org/317762
* Add field to GrContextOptions to disable mipmap support even if the backend
supports it.
diff --git a/include/core/SkDeferredDisplayListRecorder.h b/include/core/SkDeferredDisplayListRecorder.h
index 6fc49fe..8a400ad 100644
--- a/include/core/SkDeferredDisplayListRecorder.h
+++ b/include/core/SkDeferredDisplayListRecorder.h
@@ -22,7 +22,6 @@
class SkPromiseImageTexture;
class SkSurface;
struct SkYUVAIndex;
-struct SkYUVASizeInfo;
/*
* This class is intended to be used as:
diff --git a/include/core/SkImageGenerator.h b/include/core/SkImageGenerator.h
index 380cb73..81d08b2 100644
--- a/include/core/SkImageGenerator.h
+++ b/include/core/SkImageGenerator.h
@@ -113,39 +113,6 @@
*/
bool getYUVAPlanes(const SkYUVAPixmaps& yuvaPixmaps);
- /**
- * Deprecated. Use queryYUVAInfo instead for more structured YUVA plane specification.
- *
- * If decoding to YUV is supported, this returns true. Otherwise, this
- * returns false and does not modify any of the parameters.
- *
- * @param sizeInfo Output parameter indicating the sizes and required
- * allocation widths of the Y, U, V, and A planes.
- * @param yuvaIndices How the YUVA planes are organized/used
- * @param colorSpace Output parameter.
- */
- bool queryYUVA8(SkYUVASizeInfo* sizeInfo,
- SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
- SkYUVColorSpace* colorSpace) const;
-
- /**
- * Deprecated. Use getYUVAPlanes instead for more structured YUVA plane retrieval.
- *
- * Returns true on success and false on failure.
- * This always attempts to perform a full decode. If the client only
- * wants size, it should call queryYUVA8().
- *
- * @param sizeInfo Needs to exactly match the values returned by the
- * query, except the WidthBytes may be larger than the
- * recommendation (but not smaller).
- * @param yuvaIndices Needs to exactly match the values returned by the query.
- * @param planes Memory for the Y, U, V, and A planes. Note that, depending on the
- * settings in yuvaIndices, anywhere from 1..4 planes could be returned.
- */
- bool getYUVA8Planes(const SkYUVASizeInfo& sizeInfo,
- const SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
- void* planes[]);
-
#if SK_SUPPORT_GPU
/**
* If the generator can natively/efficiently return its pixels as a GPU image (backed by a
@@ -212,10 +179,6 @@
virtual bool onQueryYUVAInfo(const SkYUVAPixmapInfo::SupportedDataTypes&,
SkYUVAPixmapInfo*) const { return false; }
virtual bool onGetYUVAPlanes(const SkYUVAPixmaps&) { return false; }
- virtual bool onQueryYUVA8(SkYUVASizeInfo*, SkYUVAIndex[SkYUVAIndex::kIndexCount],
- SkYUVColorSpace*) const { return false; }
- virtual bool onGetYUVA8Planes(const SkYUVASizeInfo&, const SkYUVAIndex[SkYUVAIndex::kIndexCount],
- void*[4] /*planes*/) { return false; }
#if SK_SUPPORT_GPU
// returns nullptr
virtual GrSurfaceProxyView onGenerateTexture(GrRecordingContext*, const SkImageInfo&,
diff --git a/src/core/SkImageGenerator.cpp b/src/core/SkImageGenerator.cpp
index 7f3306e..f6291d3 100644
--- a/src/core/SkImageGenerator.cpp
+++ b/src/core/SkImageGenerator.cpp
@@ -42,34 +42,6 @@
return this->onGetYUVAPlanes(yuvaPixmaps);
}
-bool SkImageGenerator::queryYUVA8(SkYUVASizeInfo* sizeInfo,
- SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
- SkYUVColorSpace* colorSpace) const {
- SkASSERT(sizeInfo);
-
- return this->onQueryYUVA8(sizeInfo, yuvaIndices, colorSpace);
-}
-
-bool SkImageGenerator::getYUVA8Planes(const SkYUVASizeInfo& sizeInfo,
- const SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
- void* planes[SkYUVASizeInfo::kMaxCount]) {
-
- for (int i = 0; i < SkYUVASizeInfo::kMaxCount; ++i) {
- SkASSERT(sizeInfo.fSizes[i].fWidth >= 0);
- SkASSERT(sizeInfo.fSizes[i].fHeight >= 0);
- SkASSERT(sizeInfo.fWidthBytes[i] >= (size_t) sizeInfo.fSizes[i].fWidth);
- }
-
- int numPlanes = 0;
- SkASSERT(SkYUVAIndex::AreValidIndices(yuvaIndices, &numPlanes));
- SkASSERT(planes);
- for (int i = 0; i < numPlanes; ++i) {
- SkASSERT(planes[i]);
- }
-
- return this->onGetYUVA8Planes(sizeInfo, yuvaIndices, planes);
-}
-
#if SK_SUPPORT_GPU
#include "src/gpu/GrSurfaceProxyView.h"
diff --git a/src/core/SkYUVPlanesCache.cpp b/src/core/SkYUVPlanesCache.cpp
index 756937f..3f33fce 100644
--- a/src/core/SkYUVPlanesCache.cpp
+++ b/src/core/SkYUVPlanesCache.cpp
@@ -5,10 +5,13 @@
* found in the LICENSE file.
*/
-#include "src/core/SkBitmapCache.h"
-#include "src/core/SkResourceCache.h"
#include "src/core/SkYUVPlanesCache.h"
+#include "include/core/SkYUVAPixmaps.h"
+#include "src/core/SkBitmapCache.h"
+#include "src/core/SkCachedData.h"
+#include "src/core/SkResourceCache.h"
+
#define CHECK_LOCAL(localCache, localName, globalName, ...) \
((localCache) ? localCache->localName(__VA_ARGS__) : SkResourceCache::globalName(__VA_ARGS__))
@@ -16,8 +19,8 @@
static unsigned gYUVPlanesKeyNamespaceLabel;
struct YUVValue {
- SkYUVPlanesCache::Info fInfo;
- SkCachedData* fData;
+ SkYUVAPixmaps fPixmaps;
+ SkCachedData* fData;
};
struct YUVPlanesKey : public SkResourceCache::Key {
@@ -32,11 +35,11 @@
};
struct YUVPlanesRec : public SkResourceCache::Rec {
- YUVPlanesRec(YUVPlanesKey key, SkCachedData* data, SkYUVPlanesCache::Info* info)
+ YUVPlanesRec(YUVPlanesKey key, SkCachedData* data, const SkYUVAPixmaps& pixmaps)
: fKey(key)
{
fValue.fData = data;
- fValue.fInfo = *info;
+ fValue.fPixmaps = pixmaps;
fValue.fData->attachToCacheAndRef();
}
~YUVPlanesRec() override {
@@ -64,13 +67,14 @@
return false;
}
result->fData = tmpData;
- result->fInfo = rec.fValue.fInfo;
+ result->fPixmaps = rec.fValue.fPixmaps;
return true;
}
};
} // namespace
-SkCachedData* SkYUVPlanesCache::FindAndRef(uint32_t genID, Info* info,
+SkCachedData* SkYUVPlanesCache::FindAndRef(uint32_t genID,
+ SkYUVAPixmaps* pixmaps,
SkResourceCache* localCache) {
YUVValue result;
YUVPlanesKey key(genID);
@@ -78,12 +82,12 @@
return nullptr;
}
- *info = result.fInfo;
+ *pixmaps = result.fPixmaps;
return result.fData;
}
-void SkYUVPlanesCache::Add(uint32_t genID, SkCachedData* data, Info* info,
+void SkYUVPlanesCache::Add(uint32_t genID, SkCachedData* data, const SkYUVAPixmaps& pixmaps,
SkResourceCache* localCache) {
YUVPlanesKey key(genID);
- return CHECK_LOCAL(localCache, add, Add, new YUVPlanesRec(key, data, info));
+ return CHECK_LOCAL(localCache, add, Add, new YUVPlanesRec(key, data, pixmaps));
}
diff --git a/src/core/SkYUVPlanesCache.h b/src/core/SkYUVPlanesCache.h
index 356536a..dfe535f 100644
--- a/src/core/SkYUVPlanesCache.h
+++ b/src/core/SkYUVPlanesCache.h
@@ -8,42 +8,30 @@
#ifndef SkYUVPlanesCache_DEFINED
#define SkYUVPlanesCache_DEFINED
-#include "include/core/SkImageInfo.h"
-#include "include/core/SkYUVAIndex.h"
-#include "include/core/SkYUVASizeInfo.h"
-#include "src/core/SkCachedData.h"
+#include "include/core/SkTypes.h"
+class SkCachedData;
class SkResourceCache;
+class SkYUVAPixmaps;
class SkYUVPlanesCache {
public:
/**
- * The Info struct contains data about the 4 Y, U, V, and A planes of memory stored
- * contiguously, in that order, as a single block of memory within SkYUVPlanesCache.
- *
- * fSizeInfo: fWidth, fHeight, and fWidthBytes of each of the Y, U, V, and A planes.
- * fColorSpace: color space that will be used for the YUV -> RGB conversion.
- *
- * TODO: Replace this with SkYUVAPixmaps
- */
- struct Info {
- SkYUVASizeInfo fSizeInfo;
- SkYUVAIndex fYUVAIndices[SkYUVAIndex::kIndexCount];
- SkYUVColorSpace fColorSpace;
- SkPixmap fPlanes[SkYUVASizeInfo::kMaxCount];
- };
- /**
- * On success, return a ref to the SkCachedData that holds the pixels.
+ * On success, return a ref to the SkCachedData that holds the pixel data. The SkYUVAPixmaps
+ * contains a description of the YUVA data and has a SkPixmap for each plane that points
+ * into the SkCachedData.
*
* On failure, return nullptr.
*/
- static SkCachedData* FindAndRef(uint32_t genID, Info* info,
+ static SkCachedData* FindAndRef(uint32_t genID,
+ SkYUVAPixmaps* pixmaps,
SkResourceCache* localCache = nullptr);
/**
- * Add a pixelRef ID and its YUV planes data to the cache.
+ * Add a pixelRef ID and its YUV planes data to the cache. The SkYUVAPixmaps should contain
+ * SkPixmaps that store their pixel data in the SkCachedData.
*/
- static void Add(uint32_t genID, SkCachedData* data, Info* info,
+ static void Add(uint32_t genID, SkCachedData* data, const SkYUVAPixmaps& pixmaps,
SkResourceCache* localCache = nullptr);
};
diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp
index e231a4d..2c381c8 100644
--- a/src/image/SkImage_Lazy.cpp
+++ b/src/image/SkImage_Lazy.cpp
@@ -261,50 +261,39 @@
GrSurfaceProxyView SkImage_Lazy::textureProxyViewFromPlanes(GrRecordingContext* ctx,
SkBudgeted budgeted) const {
- SkYUVASizeInfo yuvSizeInfo;
- SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount];
- SkYUVColorSpace yuvColorSpace;
- SkPixmap planes[SkYUVASizeInfo::kMaxCount];
-
SkYUVAPixmapInfo::SupportedDataTypes supportedDataTypes(*ctx);
- sk_sp<SkCachedData> dataStorage =
- this->getPlanes(supportedDataTypes, &yuvSizeInfo, yuvaIndices, &yuvColorSpace, planes);
+ SkYUVAPixmaps yuvaPixmaps;
+ sk_sp<SkCachedData> dataStorage = this->getPlanes(supportedDataTypes, &yuvaPixmaps);
if (!dataStorage) {
return {};
}
GrSurfaceProxyView yuvViews[SkYUVASizeInfo::kMaxCount];
- for (int i = 0; i < SkYUVASizeInfo::kMaxCount; ++i) {
- if (yuvSizeInfo.fSizes[i].isEmpty()) {
- SkASSERT(!yuvSizeInfo.fWidthBytes[i]);
- continue;
- }
-
- int componentWidth = yuvSizeInfo.fSizes[i].fWidth;
- int componentHeight = yuvSizeInfo.fSizes[i].fHeight;
+ for (int i = 0; i < yuvaPixmaps.numPlanes(); ++i) {
// If the sizes of the components are not all the same we choose to create exact-match
// textures for the smaller ones rather than add a texture domain to the draw.
// TODO: revisit this decision to improve texture reuse?
- SkBackingFit fit =
- (componentWidth != yuvSizeInfo.fSizes[0].fWidth) ||
- (componentHeight != yuvSizeInfo.fSizes[0].fHeight)
- ? SkBackingFit::kExact : SkBackingFit::kApprox;
+ SkBackingFit fit = yuvaPixmaps.plane(i).dimensions() == this->dimensions()
+ ? SkBackingFit::kApprox
+ : SkBackingFit::kExact;
// We grab a ref to cached yuv data. When the SkBitmap we create below goes away it will
- // call the YUVGen_DataReleaseProc which will release this ref.
+ // call releaseProc which will release this ref.
// DDL TODO: Currently we end up creating a lazy proxy that will hold onto a ref to the
// SkImage in its lambda. This means that we'll keep the ref on the YUV data around for the
// life time of the proxy and not just upload. For non-DDL draws we should look into
// releasing this SkImage after uploads (by deleting the lambda after instantiation).
- dataStorage->ref();
auto releaseProc = [](void*, void* data) {
- SkCachedData* cachedData = static_cast<SkCachedData*>(data);
+ auto cachedData = static_cast<SkCachedData*>(data);
SkASSERT(cachedData);
cachedData->unref();
};
SkBitmap bitmap;
- bitmap.installPixels(planes[i].info(), planes[i].writable_addr(),
- yuvSizeInfo.fWidthBytes[i], releaseProc, dataStorage.get());
+ bitmap.installPixels(yuvaPixmaps.plane(i).info(),
+ yuvaPixmaps.plane(i).writable_addr(),
+ yuvaPixmaps.plane(i).rowBytes(),
+ releaseProc,
+ SkRef(dataStorage.get()));
bitmap.setImmutable();
GrBitmapTextureMaker maker(ctx, bitmap, fit);
@@ -313,8 +302,6 @@
if (!yuvViews[i]) {
return {};
}
-
- SkASSERT(yuvViews[i].proxy()->dimensions() == yuvSizeInfo.fSizes[i]);
}
// TODO: investigate preallocating mip maps here
@@ -326,10 +313,15 @@
return {};
}
+ SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount];
+ SkAssertResult(yuvaPixmaps.toYUVAIndices(yuvaIndices));
GrPaint paint;
- const auto& caps = *ctx->priv().caps();
- std::unique_ptr<GrFragmentProcessor> yuvToRgbProcessor = GrYUVtoRGBEffect::Make(
- yuvViews, yuvaIndices, yuvColorSpace, GrSamplerState::Filter::kNearest, caps);
+ std::unique_ptr<GrFragmentProcessor> yuvToRgbProcessor =
+ GrYUVtoRGBEffect::Make(yuvViews,
+ yuvaIndices,
+ yuvaPixmaps.yuvaInfo().yuvColorSpace(),
+ GrSamplerState::Filter::kNearest,
+ *ctx->priv().caps());
// The pixels after yuv->rgb will be in the generator's color space.
// If onMakeColorTypeAndColorSpace has been called then this will not match this image's
@@ -353,7 +345,9 @@
paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
const SkRect r = SkRect::Make(this->dimensions());
- SkMatrix m = SkEncodedOriginToMatrix(yuvSizeInfo.fOrigin, this->width(), this->height());
+ SkMatrix m = SkEncodedOriginToMatrix(yuvaPixmaps.yuvaInfo().origin(),
+ this->width(),
+ this->height());
renderTargetContext->drawRect(nullptr, std::move(paint), GrAA::kNo, m, r);
SkASSERT(renderTargetContext->asTextureProxy());
@@ -362,79 +356,31 @@
sk_sp<SkCachedData> SkImage_Lazy::getPlanes(
const SkYUVAPixmapInfo::SupportedDataTypes& supportedDataTypes,
- SkYUVASizeInfo* yuvaSizeInfo,
- SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
- SkYUVColorSpace* yuvColorSpace,
- SkPixmap planes[SkYUVASizeInfo::kMaxCount]) const {
+ SkYUVAPixmaps* yuvaPixmaps) const {
ScopedGenerator generator(fSharedGenerator);
- SkYUVPlanesCache::Info yuvInfo;
- sk_sp<SkCachedData> data(SkYUVPlanesCache::FindAndRef(generator->uniqueID(), &yuvInfo));
+ sk_sp<SkCachedData> data(SkYUVPlanesCache::FindAndRef(generator->uniqueID(), yuvaPixmaps));
- // Try the new more descriptive SkImageGenerator/SkCodec YUVA interface.
- if (SkYUVAPixmapInfo yuvaPixmapInfo;
- !data && generator->queryYUVAInfo(supportedDataTypes, &yuvaPixmapInfo) &&
- yuvaPixmapInfo.yuvaInfo().dimensions() == this->dimensions()) {
- data.reset(SkResourceCache::NewCachedData(yuvaPixmapInfo.computeTotalBytes()));
- auto pixmaps = SkYUVAPixmaps::FromExternalMemory(yuvaPixmapInfo, data->writable_data());
- SkASSERT(pixmaps.isValid());
- if (generator->getYUVAPlanes(pixmaps) &&
- pixmaps.toLegacy(&yuvInfo.fSizeInfo, yuvInfo.fYUVAIndices)) {
- yuvInfo.fColorSpace = yuvaPixmapInfo.yuvColorSpace();
- std::copy_n(pixmaps.planes().data(), SkYUVAPixmapInfo::kMaxPlanes, yuvInfo.fPlanes);
- // Decoding is done, cache the resulting YUV planes
- SkYUVPlanesCache::Add(this->uniqueID(), data.get(), &yuvInfo);
- } else {
- data.reset();
- }
+ if (data) {
+ SkASSERT(yuvaPixmaps->isValid());
+ SkASSERT(yuvaPixmaps->yuvaInfo().dimensions() == this->dimensions());
+ return data;
}
-
- // Try the legacy SkImageGenerator/SkCodec YUVA interface.
- if (!data) {
- // Fetch yuv plane sizes for memory allocation.
- if (!generator->queryYUVA8(&yuvInfo.fSizeInfo,
- yuvInfo.fYUVAIndices,
- &yuvInfo.fColorSpace)) {
- return nullptr;
- }
-
- // Allocate the memory for YUVA
- size_t totalSize(0);
- for (int i = 0; i < SkYUVASizeInfo::kMaxCount; i++) {
- SkASSERT((yuvInfo.fSizeInfo.fWidthBytes[i] && yuvInfo.fSizeInfo.fSizes[i].fHeight) ||
- (!yuvInfo.fSizeInfo.fWidthBytes[i] && !yuvInfo.fSizeInfo.fSizes[i].fHeight));
-
- totalSize += yuvInfo.fSizeInfo.fWidthBytes[i] * yuvInfo.fSizeInfo.fSizes[i].fHeight;
- }
-
- data.reset(SkResourceCache::NewCachedData(totalSize));
- char* addr = static_cast<char*>(data->writable_data());
-
- void* planePtrs[SkYUVASizeInfo::kMaxCount] = {};
- for (int i = 0; i < SkYUVASizeInfo::kMaxCount; ++i) {
- if (yuvInfo.fSizeInfo.fWidthBytes[i]) {
- auto info = SkImageInfo::MakeA8(yuvInfo.fSizeInfo.fSizes[i]);
- planePtrs[i] = addr;
- yuvInfo.fPlanes[i].reset(info, addr, yuvInfo.fSizeInfo.fWidthBytes[i]);
- addr += yuvInfo.fPlanes[i].rowBytes() * yuvInfo.fPlanes[i].height();
- }
- }
- // Get the YUV planes.
- if (!generator->getYUVA8Planes(yuvInfo.fSizeInfo, yuvInfo.fYUVAIndices, planePtrs)) {
- return nullptr;
- }
- // Decoding is done, cache the resulting YUV planes
- SkYUVPlanesCache::Add(this->uniqueID(), data.get(), &yuvInfo);
- }
-
- if (!data) {
+ SkYUVAPixmapInfo yuvaPixmapInfo;
+ if (!generator->queryYUVAInfo(supportedDataTypes, &yuvaPixmapInfo) ||
+ yuvaPixmapInfo.yuvaInfo().dimensions() != this->dimensions()) {
return nullptr;
}
-
- *yuvaSizeInfo = yuvInfo.fSizeInfo;
- std::copy_n(yuvInfo.fYUVAIndices, SkYUVAIndex::kIndexCount, yuvaIndices);
- *yuvColorSpace = yuvInfo.fColorSpace;
- std::copy_n(yuvInfo.fPlanes, SkYUVASizeInfo::kMaxCount, planes);
+ data.reset(SkResourceCache::NewCachedData(yuvaPixmapInfo.computeTotalBytes()));
+ SkYUVAPixmaps tempPixmaps = SkYUVAPixmaps::FromExternalMemory(yuvaPixmapInfo,
+ data->writable_data());
+ SkASSERT(tempPixmaps.isValid());
+ if (!generator->getYUVAPlanes(tempPixmaps)) {
+ return nullptr;
+ }
+ // Decoding is done, cache the resulting YUV planes
+ *yuvaPixmaps = tempPixmaps;
+ SkYUVPlanesCache::Add(this->uniqueID(), data.get(), *yuvaPixmaps);
return data;
}
diff --git a/src/image/SkImage_Lazy.h b/src/image/SkImage_Lazy.h
index b01799f..67e39c3 100644
--- a/src/image/SkImage_Lazy.h
+++ b/src/image/SkImage_Lazy.h
@@ -70,10 +70,7 @@
void addUniqueIDListener(sk_sp<SkIDChangeListener>) const;
#if SK_SUPPORT_GPU
sk_sp<SkCachedData> getPlanes(const SkYUVAPixmapInfo::SupportedDataTypes& supportedDataTypes,
- SkYUVASizeInfo* yuvaSizeInfo,
- SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
- SkYUVColorSpace* yuvColorSpace,
- SkPixmap planes[SkYUVASizeInfo::kMaxCount]) const;
+ SkYUVAPixmaps* pixmaps) const;
GrSurfaceProxyView textureProxyViewFromPlanes(GrRecordingContext*, SkBudgeted) const;
#endif
diff --git a/tests/ImageGeneratorTest.cpp b/tests/ImageGeneratorTest.cpp
index c33ab96..cd8526d 100644
--- a/tests/ImageGeneratorTest.cpp
+++ b/tests/ImageGeneratorTest.cpp
@@ -62,33 +62,18 @@
DEF_TEST(ImageGenerator, reporter) {
MyImageGenerator ig;
- SkYUVASizeInfo sizeInfo;
- sizeInfo.fSizes[0] = SkISize::Make(200, 200);
- sizeInfo.fSizes[1] = SkISize::Make(100, 100);
- sizeInfo.fSizes[2] = SkISize::Make( 50, 50);
- sizeInfo.fSizes[3] = SkISize::Make( 25, 25);
- sizeInfo.fWidthBytes[0] = 0;
- sizeInfo.fWidthBytes[1] = 0;
- sizeInfo.fWidthBytes[2] = 0;
- sizeInfo.fWidthBytes[3] = 0;
- void* planes[4] = { nullptr };
- SkYUVAIndex yuvaIndices[4];
- SkYUVColorSpace colorSpace;
+ SkYUVAPixmapInfo yuvaPixmapInfo;
// Check that the YUV decoding API does not cause any crashes
- ig.queryYUVA8(&sizeInfo, yuvaIndices, nullptr);
- ig.queryYUVA8(&sizeInfo, yuvaIndices, &colorSpace);
- sizeInfo.fWidthBytes[0] = 250;
- sizeInfo.fWidthBytes[1] = 250;
- sizeInfo.fWidthBytes[2] = 250;
- sizeInfo.fWidthBytes[3] = 250;
- yuvaIndices[0] = { 0, SkColorChannel::kR };
- yuvaIndices[1] = { 1, SkColorChannel::kR };
- yuvaIndices[2] = { 2, SkColorChannel::kR };
- yuvaIndices[3] = { 3, SkColorChannel::kR };
- int dummy;
- planes[0] = planes[1] = planes[2] = planes[3] = &dummy;
- ig.getYUVA8Planes(sizeInfo, yuvaIndices, planes);
+ ig.queryYUVAInfo(SkYUVAPixmapInfo::SupportedDataTypes::All(), &yuvaPixmapInfo);
+ SkYUVAInfo yuvaInfo({250, 250},
+ SkYUVAInfo::PlanarConfig::kY_UV_420,
+ kJPEG_Full_SkYUVColorSpace);
+ yuvaPixmapInfo = SkYUVAPixmapInfo(yuvaInfo,
+ SkYUVAPixmapInfo::DataType::kUnorm8,
+ /*rowBytes[]*/ nullptr);
+ SkYUVAPixmaps yuvaPixmaps = SkYUVAPixmaps::Allocate(yuvaPixmapInfo);
+ ig.getYUVAPlanes(yuvaPixmaps);
// Suppressed due to https://code.google.com/p/skia/issues/detail?id=4339
if (false) {
diff --git a/tests/YUVCacheTest.cpp b/tests/YUVCacheTest.cpp
index a0a4160..95794f8 100644
--- a/tests/YUVCacheTest.cpp
+++ b/tests/YUVCacheTest.cpp
@@ -5,6 +5,8 @@
* found in the LICENSE file.
*/
+#include "include/core/SkYUVAInfo.h"
+#include "include/core/SkYUVAPixmaps.h"
#include "src/core/SkCachedData.h"
#include "src/core/SkResourceCache.h"
#include "src/core/SkYUVPlanesCache.h"
@@ -31,47 +33,46 @@
DEF_TEST(YUVPlanesCache, reporter) {
SkResourceCache cache(1024);
- SkYUVPlanesCache::Info yuvInfo;
- for (int i = 0; i < SkYUVASizeInfo::kMaxCount; i++) {
- yuvInfo.fSizeInfo.fSizes[i].fWidth = 20 * (i + 1);
- yuvInfo.fSizeInfo.fSizes[i].fHeight = 10 * (i + 1);
- yuvInfo.fSizeInfo.fWidthBytes[i] = 80 * (i + 1);
- }
-
- for (int i = 0; i < SkYUVAIndex::kIndexCount; ++i) {
- yuvInfo.fYUVAIndices[i].fIndex = -1;
- yuvInfo.fYUVAIndices[i].fChannel = SkColorChannel::kR;
- }
- yuvInfo.fColorSpace = kRec601_SkYUVColorSpace;
-
+ SkYUVAInfo yuvaInfo({5, 5},
+ SkYUVAInfo::PlanarConfig::kY_U_V_420,
+ kRec601_Limited_SkYUVColorSpace);
+ SkYUVAPixmapInfo yuvaPixmapInfo(yuvaInfo,
+ SkYUVAPixmapInfo::DataType::kUnorm8,
+ /*rowBytes[]*/ nullptr);
+ SkYUVAPixmaps yuvaPixmaps;
const uint32_t genID = 12345678;
- SkCachedData* data = SkYUVPlanesCache::FindAndRef(genID, &yuvInfo, &cache);
- REPORTER_ASSERT(reporter, nullptr == data);
+ SkCachedData* data = SkYUVPlanesCache::FindAndRef(genID, &yuvaPixmaps, &cache);
+ REPORTER_ASSERT(reporter, !data);
- size_t size = 256;
+ size_t size = yuvaPixmapInfo.computeTotalBytes();
data = cache.newCachedData(size);
memset(data->writable_data(), 0xff, size);
- SkYUVPlanesCache::Add(genID, data, &yuvInfo, &cache);
+ SkPixmap pmaps[SkYUVAInfo::kMaxPlanes];
+ yuvaPixmapInfo.initPixmapsFromSingleAllocation(data->writable_data(), pmaps);
+ yuvaPixmaps = SkYUVAPixmaps::FromExternalPixmaps(yuvaInfo, pmaps);
+
+ SkYUVPlanesCache::Add(genID, data, yuvaPixmaps, &cache);
check_data(reporter, data, 2, kInCache, kLocked);
data->unref();
check_data(reporter, data, 1, kInCache, kUnlocked);
- SkYUVPlanesCache::Info yuvInfoRead;
- data = SkYUVPlanesCache::FindAndRef(genID, &yuvInfoRead, &cache);
+ SkYUVAPixmaps yuvaPixmapsRead;
+ data = SkYUVPlanesCache::FindAndRef(genID, &yuvaPixmapsRead, &cache);
REPORTER_ASSERT(reporter, data);
REPORTER_ASSERT(reporter, data->size() == size);
- REPORTER_ASSERT(reporter, yuvInfo.fSizeInfo == yuvInfoRead.fSizeInfo);
+ REPORTER_ASSERT(reporter, yuvaPixmapsRead.yuvaInfo() == yuvaPixmaps.yuvaInfo());
- for (int i = 0; i < SkYUVAIndex::kIndexCount; ++i) {
- REPORTER_ASSERT(reporter, yuvInfo.fYUVAIndices[i] == yuvInfoRead.fYUVAIndices[i]);
+ for (int i = 0; i < yuvaPixmaps.numPlanes(); ++i) {
+ REPORTER_ASSERT(reporter, yuvaPixmaps.plane(i).info() == yuvaPixmapsRead.plane(i).info());
+ REPORTER_ASSERT(reporter, yuvaPixmaps.plane(i).addr() == yuvaPixmapsRead.plane(i).addr());
+ REPORTER_ASSERT(reporter, yuvaPixmaps.plane(i).rowBytes() ==
+ yuvaPixmapsRead.plane(i).rowBytes());
}
- REPORTER_ASSERT(reporter, yuvInfo.fColorSpace == yuvInfoRead.fColorSpace);
-
check_data(reporter, data, 2, kInCache, kLocked);
cache.purgeAll();