aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-06-05 10:45:30 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-05 15:13:40 +0000
commitd3df9ec874b2668111b36ce0993d860b4f88c765 (patch)
tree693ad2138c2fe4facd362eee8289af1a811f60e3 /src
parentd81fed9ce2b9c8f2f227cf74c2578b90aafbe196 (diff)
SkImage::makeColorSpace(): Fix nullptr->sRGB bug with picture images
Bug: 729352 Change-Id: I5ad5e2121ce87dc154528bfd9ec0f3e9253ed792 Reviewed-on: https://skia-review.googlesource.com/18590 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/image/SkImage.cpp5
-rw-r--r--src/image/SkImage_Gpu.cpp16
-rw-r--r--src/image/SkImage_Raster.cpp12
3 files changed, 22 insertions, 11 deletions
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index 3e525b399c..858aa9b029 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -307,10 +307,9 @@ sk_sp<SkImage> SkImage::makeColorSpace(sk_sp<SkColorSpace> target,
}
// No need to create a new image if:
- // (1) The color spaces are equal (nullptr is considered to be sRGB).
+ // (1) The color spaces are equal.
// (2) The color type is kAlpha8.
- if ((!this->colorSpace() && target->isSRGB()) ||
- SkColorSpace::Equals(this->colorSpace(), target.get()) ||
+ if (SkColorSpace::Equals(this->colorSpace(), target.get()) ||
kAlpha_8_SkColorType == as_IB(this)->onImageInfo().colorType()) {
return sk_ref_sp(const_cast<SkImage*>(this));
}
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
index 660c31cfca..55ceba06d2 100644
--- a/src/image/SkImage_Gpu.cpp
+++ b/src/image/SkImage_Gpu.cpp
@@ -914,15 +914,23 @@ sk_sp<SkImage> SkImage::MakeTextureFromMipMap(GrContext* ctx, const SkImageInfo&
info.refColorSpace(), budgeted);
}
-sk_sp<SkImage> SkImage_Gpu::onMakeColorSpace(sk_sp<SkColorSpace> colorSpace, SkColorType,
+sk_sp<SkImage> SkImage_Gpu::onMakeColorSpace(sk_sp<SkColorSpace> target, SkColorType,
SkTransferFunctionBehavior premulBehavior) const {
if (SkTransferFunctionBehavior::kRespect == premulBehavior) {
// TODO: Implement this.
return nullptr;
}
- sk_sp<SkColorSpace> srcSpace = fColorSpace ? fColorSpace : SkColorSpace::MakeSRGB();
- auto xform = GrNonlinearColorSpaceXformEffect::Make(srcSpace.get(), colorSpace.get());
+ sk_sp<SkColorSpace> srcSpace = fColorSpace;
+ if (!fColorSpace) {
+ if (target->isSRGB()) {
+ return sk_ref_sp(const_cast<SkImage*>((SkImage*)this));
+ }
+
+ srcSpace = SkColorSpace::MakeSRGB();
+ }
+
+ auto xform = GrNonlinearColorSpaceXformEffect::Make(srcSpace.get(), target.get());
if (!xform) {
return sk_ref_sp(const_cast<SkImage_Gpu*>(this));
}
@@ -949,7 +957,7 @@ sk_sp<SkImage> SkImage_Gpu::onMakeColorSpace(sk_sp<SkColorSpace> colorSpace, SkC
// MDB: this call is okay bc we know 'renderTargetContext' was exact
return sk_make_sp<SkImage_Gpu>(fContext, kNeedNewImageUniqueID,
fAlphaType, renderTargetContext->asTextureProxyRef(),
- std::move(colorSpace), fBudgeted);
+ std::move(target), fBudgeted);
}
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
index e0d418a129..f4f1211eb5 100644
--- a/src/image/SkImage_Raster.cpp
+++ b/src/image/SkImage_Raster.cpp
@@ -348,18 +348,22 @@ bool SkImage_Raster::onAsLegacyBitmap(SkBitmap* bitmap, LegacyBitmapMode mode) c
sk_sp<SkImage> SkImage_Raster::onMakeColorSpace(sk_sp<SkColorSpace> target,
SkColorType targetColorType,
SkTransferFunctionBehavior premulBehavior) const {
- SkImageInfo dstInfo = fBitmap.info().makeColorType(targetColorType).makeColorSpace(target);
- SkBitmap dst;
- dst.allocPixels(dstInfo);
-
SkPixmap src;
SkAssertResult(fBitmap.peekPixels(&src));
// Treat nullptr srcs as sRGB.
if (!src.colorSpace()) {
+ if (target->isSRGB()) {
+ return sk_ref_sp(const_cast<SkImage*>((SkImage*)this));
+ }
+
src.setColorSpace(SkColorSpace::MakeSRGB());
}
+ SkImageInfo dstInfo = fBitmap.info().makeColorType(targetColorType).makeColorSpace(target);
+ SkBitmap dst;
+ dst.allocPixels(dstInfo);
+
SkAssertResult(dst.writePixels(src, 0, 0, premulBehavior));
dst.setImmutable();
return SkImage::MakeFromBitmap(dst);