aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-05-18 09:26:50 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-18 15:14:59 +0000
commitb2004f76e2ac8395ca93dfa444011120e3223197 (patch)
tree6e45cf2428acf6a7b5d58b1cb80909479d59204d /src/image
parentcfcb4afc693f0f050544dd0ad314a3505058c013 (diff)
Fix SkImage::onMakeColorSpace() for subset lazy images
Bug: 723149 Change-Id: Ib56a77958fc1b7e026ee5ca98a46e8f014fe75d4 Reviewed-on: https://skia-review.googlesource.com/17309 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src/image')
-rw-r--r--src/image/SkImage_Lazy.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp
index 7108a1a71e..980db1d63f 100644
--- a/src/image/SkImage_Lazy.cpp
+++ b/src/image/SkImage_Lazy.cpp
@@ -36,6 +36,9 @@ public:
return gen ? sk_sp<SharedGenerator>(new SharedGenerator(std::move(gen))) : nullptr;
}
+ // This is thread safe. It is a const field set in the constructor.
+ const SkImageInfo& getInfo() { return fGenerator->getInfo(); }
+
private:
explicit SharedGenerator(std::unique_ptr<SkImageGenerator> gen)
: fGenerator(std::move(gen)) {
@@ -596,7 +599,8 @@ sk_sp<SkImage> SkImage_Lazy::onMakeColorSpace(sk_sp<SkColorSpace> target,
SkColorType targetColorType,
SkTransferFunctionBehavior premulBehavior) const {
SkBitmap dst;
- SkImageInfo dstInfo = fInfo.makeColorType(targetColorType).makeColorSpace(target);
+ const SkImageInfo& genInfo = fSharedGenerator->getInfo();
+ SkImageInfo dstInfo = genInfo.makeColorType(targetColorType).makeColorSpace(target);
dst.allocPixels(dstInfo);
if (!this->directGeneratePixels(dstInfo, dst.getPixels(), dst.rowBytes(), 0, 0,
premulBehavior)) {
@@ -604,7 +608,15 @@ sk_sp<SkImage> SkImage_Lazy::onMakeColorSpace(sk_sp<SkColorSpace> target,
}
dst.setImmutable();
- return SkImage::MakeFromBitmap(dst);
+ sk_sp<SkImage> image = SkImage::MakeFromBitmap(dst);
+
+ if (genInfo.dimensions() != fInfo.dimensions()) {
+ // This image must be a subset.
+ image = image->makeSubset(SkIRect::MakeXYWH(fOrigin.fX, fOrigin.fY,
+ fInfo.width(), fInfo.height()));
+ }
+
+ return image;
}
sk_sp<SkImage> SkImage::MakeFromGenerator(std::unique_ptr<SkImageGenerator> generator,