diff --git a/src/effects/SkToSRGBColorFilter.cpp b/src/effects/SkToSRGBColorFilter.cpp index 4b5558da76..b24ca8dcc8 100644 --- a/src/effects/SkToSRGBColorFilter.cpp +++ b/src/effects/SkToSRGBColorFilter.cpp @@ -53,6 +53,6 @@ void SkToSRGBColorFilter::flatten(SkWriteBuffer& buffer) const { std::unique_ptr SkToSRGBColorFilter::asFragmentProcessor( GrContext*, const GrColorSpaceInfo&) const { return GrColorSpaceXformEffect::Make(fSrcColorSpace.get(), kPremul_SkAlphaType, - sk_srgb_singleton()); + sk_srgb_singleton(), kPremul_SkAlphaType); } #endif diff --git a/src/gpu/GrColorSpaceXform.cpp b/src/gpu/GrColorSpaceXform.cpp index f7b924a641..fdcc0cde82 100644 --- a/src/gpu/GrColorSpaceXform.cpp +++ b/src/gpu/GrColorSpaceXform.cpp @@ -144,9 +144,10 @@ GrFragmentProcessor::OptimizationFlags GrColorSpaceXformEffect::OptFlags( std::unique_ptr GrColorSpaceXformEffect::Make(SkColorSpace* src, SkAlphaType srcAT, - SkColorSpace* dst) { + SkColorSpace* dst, + SkAlphaType dstAT) { auto xform = GrColorSpaceXform::Make(src, srcAT, - dst, kPremul_SkAlphaType); + dst, dstAT); if (!xform) { return nullptr; } diff --git a/src/gpu/GrColorSpaceXform.h b/src/gpu/GrColorSpaceXform.h index d824dcd55b..4542d5cb72 100644 --- a/src/gpu/GrColorSpaceXform.h +++ b/src/gpu/GrColorSpaceXform.h @@ -52,7 +52,7 @@ public: * Returns a fragment processor that converts the input's color space from src to dst. */ static std::unique_ptr Make(SkColorSpace* src, SkAlphaType srcAT, - SkColorSpace* dst); + SkColorSpace* dst, SkAlphaType dstAT); /** * Returns a fragment processor that calls the passed in fragment processor, and then converts diff --git a/src/gpu/GrYUVProvider.cpp b/src/gpu/GrYUVProvider.cpp index a5b71dd651..f5bc7ea6e8 100644 --- a/src/gpu/GrYUVProvider.cpp +++ b/src/gpu/GrYUVProvider.cpp @@ -141,7 +141,8 @@ sk_sp GrYUVProvider::refAsTextureProxy(GrContext* ctx, const GrS // If the caller expects the pixels in a different color space than the one from the image, // apply a color conversion to do this. std::unique_ptr colorConversionProcessor = - GrColorSpaceXformEffect::Make(srcColorSpace, kPremul_SkAlphaType, dstColorSpace); + GrColorSpaceXformEffect::Make(srcColorSpace, kOpaque_SkAlphaType, + dstColorSpace, kOpaque_SkAlphaType); if (colorConversionProcessor) { paint.addColorFragmentProcessor(std::move(colorConversionProcessor)); } diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index 00b71174f6..509f607f9d 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -300,8 +300,7 @@ bool SkImage::isAlphaOnly() const { } sk_sp SkImage::makeColorSpace(sk_sp target) const { - SkColorSpaceTransferFn fn; - if (!target || !target->isNumericalTransferFn(&fn)) { + if (!target) { return nullptr; } @@ -313,11 +312,8 @@ sk_sp SkImage::makeColorSpace(sk_sp target) const { return sk_ref_sp(const_cast(this)); } - // TODO: Re-visit this! Keep existing color type? - SkColorType targetColorType = kN32_SkColorType; - // TODO: We might consider making this a deferred conversion? - return as_IB(this)->onMakeColorSpace(std::move(target), targetColorType); + return as_IB(this)->onMakeColorSpace(std::move(target)); } sk_sp SkImage::makeNonTextureImage() const { diff --git a/src/image/SkImage_Base.h b/src/image/SkImage_Base.h index 3adf51e40a..2682d32e46 100644 --- a/src/image/SkImage_Base.h +++ b/src/image/SkImage_Base.h @@ -93,7 +93,7 @@ public: virtual bool onPinAsTexture(GrContext*) const { return false; } virtual void onUnpinAsTexture(GrContext*) const {} - virtual sk_sp onMakeColorSpace(sk_sp, SkColorType) const = 0; + virtual sk_sp onMakeColorSpace(sk_sp) const = 0; protected: SkImage_Base(int width, int height, uint32_t uniqueID); diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index 5e81474e4f..c2bfeac8ba 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -1012,17 +1012,9 @@ bool SkImage::MakeBackendTextureFromSkImage(GrContext* ctx, /////////////////////////////////////////////////////////////////////////////////////////////////// -sk_sp SkImage_Gpu::onMakeColorSpace(sk_sp target, SkColorType) const { - sk_sp srcSpace = fColorSpace; - if (!fColorSpace) { - if (target->isSRGB()) { - return sk_ref_sp(const_cast((SkImage*)this)); - } - - srcSpace = SkColorSpace::MakeSRGB(); - } - - auto xform = GrColorSpaceXformEffect::Make(srcSpace.get(), this->alphaType(), target.get()); +sk_sp SkImage_Gpu::onMakeColorSpace(sk_sp target) const { + auto xform = GrColorSpaceXformEffect::Make(fColorSpace.get(), this->alphaType(), + target.get(), this->alphaType()); if (!xform) { return sk_ref_sp(const_cast(this)); } @@ -1048,13 +1040,10 @@ sk_sp SkImage_Gpu::onMakeColorSpace(sk_sp target, SkColor return nullptr; } - SkAlphaType newAlphaType = (kUnpremul_SkAlphaType == fAlphaType) ? kPremul_SkAlphaType - : fAlphaType; // MDB: this call is okay bc we know 'renderTargetContext' was exact return sk_make_sp(fContext, kNeedNewImageUniqueID, - newAlphaType, renderTargetContext->asTextureProxyRef(), + fAlphaType, renderTargetContext->asTextureProxyRef(), std::move(target), fBudgeted); - } bool SkImage_Gpu::onIsValid(GrContext* context) const { diff --git a/src/image/SkImage_Gpu.h b/src/image/SkImage_Gpu.h index b7febb5008..1a7f32353b 100644 --- a/src/image/SkImage_Gpu.h +++ b/src/image/SkImage_Gpu.h @@ -59,7 +59,7 @@ public: sk_sp refColorSpace() { return fColorSpace; } - sk_sp onMakeColorSpace(sk_sp, SkColorType) const override; + sk_sp onMakeColorSpace(sk_sp) const override; typedef ReleaseContext TextureContext; typedef void (*TextureFulfillProc)(TextureContext textureContext, GrBackendTexture* outTexture); diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp index 6aa0ca0549..9a7beadc2f 100644 --- a/src/image/SkImage_Lazy.cpp +++ b/src/image/SkImage_Lazy.cpp @@ -311,8 +311,7 @@ sk_sp SkImage_Lazy::onMakeSubset(const SkIRect& subset) const { return validator ? sk_sp(new SkImage_Lazy(&validator)) : nullptr; } -sk_sp SkImage_Lazy::onMakeColorSpace(sk_sp target, - SkColorType targetColorType) const { +sk_sp SkImage_Lazy::onMakeColorSpace(sk_sp target) const { SkAutoExclusive autoAquire(fOnMakeColorSpaceMutex); if (target && fOnMakeColorSpaceTarget && SkColorSpace::Equals(target.get(), fOnMakeColorSpaceTarget.get())) { diff --git a/src/image/SkImage_Lazy.h b/src/image/SkImage_Lazy.h index 433817ea31..f32ef899f8 100644 --- a/src/image/SkImage_Lazy.h +++ b/src/image/SkImage_Lazy.h @@ -61,7 +61,7 @@ public: sk_sp onMakeSubset(const SkIRect&) const override; bool getROPixels(SkBitmap*, SkColorSpace* dstColorSpace, CachingHint) const override; bool onIsLazyGenerated() const override { return true; } - sk_sp onMakeColorSpace(sk_sp, SkColorType) const override; + sk_sp onMakeColorSpace(sk_sp) const override; bool onIsValid(GrContext*) const override; diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index 859014f398..ac3ddb7a8a 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -110,7 +110,7 @@ public: SkASSERT(bitmapMayBeMutable || fBitmap.isImmutable()); } - sk_sp onMakeColorSpace(sk_sp, SkColorType) const override; + sk_sp onMakeColorSpace(sk_sp) const override; bool onIsValid(GrContext* context) const override { return true; } @@ -341,8 +341,7 @@ bool SkImage_Raster::onAsLegacyBitmap(SkBitmap* bitmap) const { /////////////////////////////////////////////////////////////////////////////// -sk_sp SkImage_Raster::onMakeColorSpace(sk_sp target, - SkColorType targetColorType) const { +sk_sp SkImage_Raster::onMakeColorSpace(sk_sp target) const { SkPixmap src; SkAssertResult(fBitmap.peekPixels(&src)); @@ -355,7 +354,7 @@ sk_sp SkImage_Raster::onMakeColorSpace(sk_sp target, src.setColorSpace(SkColorSpace::MakeSRGB()); } - SkImageInfo dstInfo = fBitmap.info().makeColorType(targetColorType).makeColorSpace(target); + SkImageInfo dstInfo = fBitmap.info().makeColorSpace(target); SkBitmap dst; dst.allocPixels(dstInfo);