aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkCodecImageGenerator.cpp
diff options
context:
space:
mode:
authorGravatar Leon Scroggins III <scroggo@google.com>2016-12-19 15:04:06 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-12-21 19:12:51 +0000
commit20a7ecc49b9fe22b1a44629d717d1a51746773ef (patch)
treeb500d8c1f59930023f130507d92d77be6471b7e1 /src/codec/SkCodecImageGenerator.cpp
parentc292b5fa323ecb46bc1977f0fd14224953d8caff (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.cpp37
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);