diff options
Diffstat (limited to 'src/core/SkCanvas.cpp')
-rw-r--r-- | src/core/SkCanvas.cpp | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 653f4b117f..f0476cd183 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1167,6 +1167,22 @@ static void draw_filter_into_device(SkBaseDevice* src, const SkImageFilter* filt c.drawBitmap(srcBM, x, y, &p); } +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 + const bool hasImageFilter = paint && paint->getImageFilter(); + + SkAlphaType alphaType = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; + if ((prev.bytesPerPixel() < 4) || hasImageFilter) { + // force to L32 + return SkImageInfo::MakeN32(w, h, alphaType); + } else { + // keep the same characteristics as the prev + return SkImageInfo::Make(w, h, prev.colorType(), alphaType, prev.profileType()); + } +} + void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy strategy) { const SkRect* bounds = rec.fBounds; const SkPaint* paint = rec.fPaint; @@ -1202,8 +1218,6 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra geo = kUnknown_SkPixelGeometry; } } - SkImageInfo info = SkImageInfo::MakeN32(ir.width(), ir.height(), - isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); SkBaseDevice* device = this->getTopDevice(); if (nullptr == device) { @@ -1211,6 +1225,9 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra return; } + SkImageInfo info = make_layer_info(device->imageInfo(), ir.width(), ir.height(), isOpaque, + paint); + bool forceSpriteOnRestore = false; { const bool preserveLCDText = kOpaque_SkAlphaType == info.alphaType() || @@ -2200,8 +2217,20 @@ void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const S paint = lazy.init(); } - const bool drawAsSprite = this->canDrawBitmapAsSprite(x, y, image->width(), image->height(), - *paint); + bool drawAsSprite = this->canDrawBitmapAsSprite(x, y, image->width(), image->height(), + *paint); + if (drawAsSprite && paint->getImageFilter()) { + SkBitmap bitmap; + if (!as_IB(image)->asBitmapForImageFilters(&bitmap)) { + drawAsSprite = false; + } else{ + // Until imagefilters are updated, they cannot handle any src type but N32... + if (bitmap.info().colorType() != kN32_SkColorType || bitmap.info().isSRGB()) { + drawAsSprite = false; + } + } + } + LOOPER_BEGIN_DRAWBITMAP(*paint, drawAsSprite, &bounds) while (iter.next()) { @@ -2277,8 +2306,15 @@ void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, cons bounds = &storage; } - const bool drawAsSprite = bounds && this->canDrawBitmapAsSprite(x, y, bitmap.width(), - bitmap.height(), *paint); + bool drawAsSprite = bounds && this->canDrawBitmapAsSprite(x, y, bitmap.width(), bitmap.height(), + *paint); + if (drawAsSprite && paint->getImageFilter()) { + // Until imagefilters are updated, they cannot handle any src type but N32... + if (bitmap.info().colorType() != kN32_SkColorType || bitmap.info().isSRGB()) { + drawAsSprite = false; + } + } + LOOPER_BEGIN_DRAWBITMAP(*paint, drawAsSprite, bounds) while (iter.next()) { |