diff options
Diffstat (limited to 'src/shaders/SkImageShader.cpp')
-rw-r--r-- | src/shaders/SkImageShader.cpp | 46 |
1 files changed, 16 insertions, 30 deletions
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp index 3e58782aee..1f77158206 100644 --- a/src/shaders/SkImageShader.cpp +++ b/src/shaders/SkImageShader.cpp @@ -31,30 +31,23 @@ static SkShader::TileMode optimize(SkShader::TileMode tm, int dimension) { #endif } -SkImageShader::SkImageShader(sk_sp<SkImage> img, - TileMode tmx, TileMode tmy, - const SkMatrix* localMatrix, - SkAlphaType outputAlphaType) - : INHERITED(localMatrix) +SkImageShader::SkImageShader(sk_sp<SkImage> img, TileMode tmx, TileMode tmy, const SkMatrix* matrix) + : INHERITED(matrix) , fImage(std::move(img)) , fTileModeX(optimize(tmx, fImage->width())) , fTileModeY(optimize(tmy, fImage->height())) - , fOutputAlphaType(outputAlphaType) {} -// fOutputAlphaType is always kPremul_SkAlphaType when an SkImageShader is constructed -// through public APIs that might lead to serialization, so we don't read or write it. - sk_sp<SkFlattenable> SkImageShader::CreateProc(SkReadBuffer& buffer) { const TileMode tx = (TileMode)buffer.readUInt(); const TileMode ty = (TileMode)buffer.readUInt(); - SkMatrix localMatrix; - buffer.readMatrix(&localMatrix); + SkMatrix matrix; + buffer.readMatrix(&matrix); sk_sp<SkImage> img = buffer.readImage(); if (!img) { return nullptr; } - return SkImageShader::Make(std::move(img), tx, ty, &localMatrix); + return SkImageShader::Make(std::move(img), tx, ty, &matrix); } void SkImageShader::flatten(SkWriteBuffer& buffer) const { @@ -62,7 +55,6 @@ void SkImageShader::flatten(SkWriteBuffer& buffer) const { buffer.writeUInt(fTileModeY); buffer.writeMatrix(this->getLocalMatrix()); buffer.writeImage(fImage.get()); - SkASSERT(fOutputAlphaType == kPremul_SkAlphaType); } bool SkImageShader::isOpaque() const { @@ -172,14 +164,13 @@ static bool bitmap_is_too_big(int w, int h) { return w > kMaxSize || h > kMaxSize; } -sk_sp<SkShader> SkImageShader::Make(sk_sp<SkImage> image, - TileMode tx, TileMode ty, - const SkMatrix* localMatrix, - SkAlphaType outputAlphaType) { +sk_sp<SkShader> SkImageShader::Make(sk_sp<SkImage> image, TileMode tx, TileMode ty, + const SkMatrix* localMatrix) { if (!image || bitmap_is_too_big(image->width(), image->height())) { return sk_make_sp<SkEmptyShader>(); + } else { + return sk_make_sp<SkImageShader>(image, tx, ty, localMatrix); } - return sk_sp<SkShader>{ new SkImageShader(image, tx,ty, localMatrix, outputAlphaType) }; } #ifndef SK_IGNORE_TO_STRING @@ -394,24 +385,19 @@ bool SkImageShader::onAppendStages(const StageRec& rec) const { auto append_misc = [&] { if (info.colorType() == kAlpha_8_SkColorType) { p->append(SkRasterPipeline::set_rgb, &misc->paint_color); + } + if (info.colorType() == kAlpha_8_SkColorType || + info.alphaType() == kUnpremul_SkAlphaType) { p->append(SkRasterPipeline::premul); - } else if (info.alphaType() == kUnpremul_SkAlphaType && - fOutputAlphaType == kPremul_SkAlphaType) { - p->append(SkRasterPipeline::premul); - } else if (info.alphaType() == kPremul_SkAlphaType && - fOutputAlphaType == kUnpremul_SkAlphaType) { - p->append(SkRasterPipeline::unpremul); } - - #if defined(SK_LEGACY_HIGH_QUALITY_SCALING_CLAMP) +#if defined(SK_LEGACY_HIGH_QUALITY_SCALING_CLAMP) if (quality > kLow_SkFilterQuality) { // Bicubic filtering naturally produces out of range values on both sides. p->append(SkRasterPipeline::clamp_0); - p->append(fOutputAlphaType == kPremul_SkAlphaType ? SkRasterPipeline::clamp_a - : SkRasterPipeline::clamp_1); + p->append(SkRasterPipeline::clamp_a); } - #endif - append_gamut_transform(p, alloc, info.colorSpace(), rec.fDstCS, fOutputAlphaType); +#endif + append_gamut_transform(p, alloc, info.colorSpace(), rec.fDstCS, kPremul_SkAlphaType); return true; }; |