diff options
Diffstat (limited to 'src/core/SkCanvas.cpp')
-rw-r--r-- | src/core/SkCanvas.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 2667f8fed0..9f13a711c2 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1036,18 +1036,20 @@ void SkCanvas::DrawDeviceWithFilter(SkBaseDevice* src, const SkImageFilter* filt } } -static SkImageInfo make_layer_info(const SkImageInfo& prev, int w, int h, const SkPaint* paint) { +static SkImageInfo make_layer_info(const SkImageInfo& prev, int w, int h, bool isOpaque, + const SkPaint* paint) { // need to force L32 for now if we have an image filter. Once filters support other colortypes // e.g. sRGB or F16, we can remove this check // SRGBTODO: Can we remove this check now? const bool hasImageFilter = paint && paint->getImageFilter(); + SkAlphaType alphaType = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; if ((prev.bytesPerPixel() < 4) || hasImageFilter) { // force to L32 - return SkImageInfo::MakeN32Premul(w, h); + return SkImageInfo::MakeN32(w, h, alphaType); } else { // keep the same characteristics as the prev - return SkImageInfo::Make(w, h, prev.colorType(), kPremul_SkAlphaType, prev.refColorSpace()); + return SkImageInfo::Make(w, h, prev.colorType(), alphaType, prev.refColorSpace()); } } @@ -1105,10 +1107,12 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra return; } + bool isOpaque = SkToBool(saveLayerFlags & kIsOpaque_SaveLayerFlag); SkPixelGeometry geo = fProps.pixelGeometry(); if (paint) { // TODO: perhaps add a query to filters so we might preserve opaqueness... if (paint->getImageFilter() || paint->getColorFilter()) { + isOpaque = false; geo = kUnknown_SkPixelGeometry; } } @@ -1119,7 +1123,8 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra return; } - SkImageInfo info = make_layer_info(priorDevice->imageInfo(), ir.width(), ir.height(), paint); + SkImageInfo info = make_layer_info(priorDevice->imageInfo(), ir.width(), ir.height(), isOpaque, + paint); sk_sp<SkBaseDevice> newDevice; { |