aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shaders/SkImageShader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shaders/SkImageShader.cpp')
-rw-r--r--src/shaders/SkImageShader.cpp46
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;
};