From b2004f76e2ac8395ca93dfa444011120e3223197 Mon Sep 17 00:00:00 2001 From: Matt Sarett Date: Thu, 18 May 2017 09:26:50 -0400 Subject: Fix SkImage::onMakeColorSpace() for subset lazy images Bug: 723149 Change-Id: Ib56a77958fc1b7e026ee5ca98a46e8f014fe75d4 Reviewed-on: https://skia-review.googlesource.com/17309 Reviewed-by: Brian Osman Commit-Queue: Matt Sarett --- src/image/SkImage_Lazy.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src') 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(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 gen) : fGenerator(std::move(gen)) { @@ -596,7 +599,8 @@ sk_sp SkImage_Lazy::onMakeColorSpace(sk_sp 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_Lazy::onMakeColorSpace(sk_sp target, } dst.setImmutable(); - return SkImage::MakeFromBitmap(dst); + sk_sp 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::MakeFromGenerator(std::unique_ptr generator, -- cgit v1.2.3