diff options
author | msarett <msarett@google.com> | 2016-01-22 14:46:42 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-22 14:46:42 -0800 |
commit | b714fb0199e8727ef2b6cddbee7eba6046f01554 (patch) | |
tree | 20c7f211949e24ed224901dcbf1e02c77b5da94b /src/codec/SkCodecImageGenerator.cpp | |
parent | 13aa1a5ad97156e35184970fc1ce1aaf3c50c91c (diff) |
Add getYUV8Planes() API to SkCodec
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1549473003
Review URL: https://codereview.chromium.org/1549473003
Diffstat (limited to 'src/codec/SkCodecImageGenerator.cpp')
-rw-r--r-- | src/codec/SkCodecImageGenerator.cpp | 61 |
1 files changed, 59 insertions, 2 deletions
diff --git a/src/codec/SkCodecImageGenerator.cpp b/src/codec/SkCodecImageGenerator.cpp index 2fef381ec1..e6e164ef61 100644 --- a/src/codec/SkCodecImageGenerator.cpp +++ b/src/codec/SkCodecImageGenerator.cpp @@ -16,10 +16,21 @@ SkImageGenerator* SkCodecImageGenerator::NewFromEncodedCodec(SkData* data) { return new SkCodecImageGenerator(codec, data); } +static SkImageInfo make_premul(const SkImageInfo& info) { + if (kUnpremul_SkAlphaType == info.alphaType()) { + return info.makeAlphaType(kPremul_SkAlphaType); + } + + return info; +} + SkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec, SkData* data) - : INHERITED(codec->getInfo()) + : INHERITED(make_premul(codec->getInfo())) , fCodec(codec) , fData(SkRef(data)) + , fYWidth(0) + , fUWidth(0) + , fVWidth(0) {} SkData* SkCodecImageGenerator::onRefEncodedData(SK_REFENCODEDDATA_CTXPARAM) { @@ -42,5 +53,51 @@ bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, s bool SkCodecImageGenerator::onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBytes[3], SkYUVColorSpace* colorSpace) { - return false; + // TODO (msarett): Change the YUV API in ImageGenerator to match SkCodec. + // This function is currently a hack to match the implementation + // in SkCodec with the old API. + SkCodec::YUVSizeInfo sizeInfo; + + // If planes is NULL, we just need to return the size. + if (nullptr == planes) { + bool result = fCodec->queryYUV8(&sizeInfo, colorSpace); + if (result) { + // Save the true widths + fYWidth = sizeInfo.fYSize.width(); + fUWidth = sizeInfo.fUSize.width(); + fVWidth = sizeInfo.fVSize.width(); + + // Set the sizes so that the client allocates enough memory + sizes[0].fWidth = (int) sizeInfo.fYWidthBytes; + sizes[0].fHeight = sizeInfo.fYSize.height(); + sizes[1].fWidth = (int) sizeInfo.fUWidthBytes; + sizes[1].fHeight = sizeInfo.fUSize.height(); + sizes[2].fWidth = (int) sizeInfo.fVWidthBytes; + sizes[2].fHeight = sizeInfo.fVSize.height(); + } + return result; + } + + // Set the sizeInfo with the true widths and heights + SkASSERT(fYWidth != 0 && fUWidth != 0 && fVWidth != 0); + sizeInfo.fYSize.set(fYWidth, sizes[0].height()); + sizeInfo.fUSize.set(fUWidth, sizes[1].height()); + sizeInfo.fVSize.set(fVWidth, sizes[2].height()); + + // Set the sizeInfo with the allocated widths + sizeInfo.fYWidthBytes = sizes[0].width(); + sizeInfo.fUWidthBytes = sizes[1].width(); + sizeInfo.fVWidthBytes = sizes[2].width(); + SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes); + if ((result == SkCodec::kSuccess || result == SkCodec::kIncompleteInput) && colorSpace) { + *colorSpace = kJPEG_SkYUVColorSpace; + } + + switch (result) { + case SkCodec::kSuccess: + case SkCodec::kIncompleteInput: + return true; + default: + return false; + } } |