diff options
author | Leon Scroggins III <scroggo@google.com> | 2016-12-19 15:04:06 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2016-12-21 19:12:51 +0000 |
commit | 20a7ecc49b9fe22b1a44629d717d1a51746773ef (patch) | |
tree | b500d8c1f59930023f130507d92d77be6471b7e1 /src/codec/SkCodecImageGenerator.cpp | |
parent | c292b5fa323ecb46bc1977f0fd14224953d8caff (diff) |
Implement scaling in SkCodecImageGenerator
Plumb calls down to SkCodec.
Add a gm
Change-Id: I16da24eb739295ab72f487df02f19968151443f3
Reviewed-on: https://skia-review.googlesource.com/6287
Reviewed-by: Matt Sarett <msarett@google.com>
Commit-Queue: Leon Scroggins <scroggo@google.com>
Diffstat (limited to 'src/codec/SkCodecImageGenerator.cpp')
-rw-r--r-- | src/codec/SkCodecImageGenerator.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/codec/SkCodecImageGenerator.cpp b/src/codec/SkCodecImageGenerator.cpp index 447332b2c7..fcbd7c3cac 100644 --- a/src/codec/SkCodecImageGenerator.cpp +++ b/src/codec/SkCodecImageGenerator.cpp @@ -47,6 +47,43 @@ bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, s } } +bool SkCodecImageGenerator::onComputeScaledDimensions(SkScalar scale, SupportedSizes* sizes) { + SkASSERT(scale > 0 && scale <= 1); + const auto size = fCodec->getScaledDimensions(SkScalarToFloat(scale)); + if (size == this->getInfo().dimensions()) { + return false; + } + + // FIXME: Make SkCodec's API return two potential sizes, like this one. For now, set them both + // to be the same. + sizes->fSizes[0] = sizes->fSizes[1] = size; + return true; +} + +bool SkCodecImageGenerator::onGenerateScaledPixels(const SkPixmap& pixmap) { + SkPMColor colorStorage[256]; + int colorCount = 256; + const auto result = fCodec->getPixels(pixmap.info(), pixmap.writable_addr(), + pixmap.rowBytes(), nullptr, colorStorage, &colorCount); + switch (result) { + case SkCodec::kSuccess: + case SkCodec::kIncompleteInput: + break; + default: + return false; + } + + if (pixmap.colorType() == kIndex_8_SkColorType) { + // SkPixmap does not take ownership, so we need to hang onto this. + // FIXME: With a better API on SkCodec, the SkCodec could share its SkColorTable. + fColorTable.reset(new SkColorTable(colorStorage, colorCount)); + const_cast<SkPixmap&>(pixmap).reset(pixmap.info(), pixmap.addr(), pixmap.rowBytes(), + fColorTable.get()); + } + return true; +} + + bool SkCodecImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const { return fCodec->queryYUV8(sizeInfo, colorSpace); |