Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(859)

Unified Diff: src/core/SkCanvas.cpp

Issue 2155063002: use special-image for imagefilters and save/restore layer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/core/SkCanvas.cpp
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 60bda8d36a8786c0db64a45aa966f05d37db3c6c..6bc6a0f9a7dac71602c66813f018d1b24d9da9a8 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1453,18 +1453,19 @@ void SkCanvas::internalDrawDevice(SkBaseDevice* srcDev, int x, int y, const SkPa
}
LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type)
+
while (iter.next()) {
SkBaseDevice* dstDev = iter.fDevice;
paint = &looper.paint();
SkImageFilter* filter = paint->getImageFilter();
SkIPoint pos = { x - iter.getX(), y - iter.getY() };
robertphillips 2016/07/18 17:01:58 Why not just call drawSpecial in both cases ?
reed1 2016/07/18 22:06:07 PDFDevice doesn't return a special (he will have r
if (filter) {
- const SkBitmap& srcBM = srcDev->accessBitmap(false);
- dstDev->drawSpriteWithFilter(iter, srcBM, pos.x(), pos.y(), *paint);
+ dstDev->drawSpecial(iter, srcDev->asSpecial().get(), pos.x(), pos.y(), *paint);
} else {
dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint);
}
}
+
LOOPER_END
}
@@ -2312,15 +2313,16 @@ void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const S
paint = lazy.init();
}
+ sk_sp<SkSpecialImage> special;
bool drawAsSprite = this->canDrawBitmapAsSprite(x, y, image->width(), image->height(),
*paint);
if (drawAsSprite && paint->getImageFilter()) {
- SkBitmap bitmap;
- if (!as_IB(image)->asBitmapForImageFilters(&bitmap)) {
+ // Until imagefilters are updated, they cannot handle any src type but N32...
+ if (!as_IB(image)->canBeImageFiltered()) {
drawAsSprite = false;
- } else{
- // Until imagefilters are updated, they cannot handle any src type but N32...
- if (bitmap.info().colorType() != kN32_SkColorType || bitmap.info().gammaCloseToSRGB()) {
+ } else {
+ special = this->getDevice()->makeSpecial(image);
+ if (!special) {
drawAsSprite = false;
}
}
@@ -2331,14 +2333,11 @@ void SkCanvas::onDrawImage(const SkImage* image, SkScalar x, SkScalar y, const S
while (iter.next()) {
const SkPaint& pnt = looper.paint();
robertphillips 2016/07/18 17:01:58 ditch drawAsSprite and just use special here ?
reed1 2016/07/19 15:07:41 Done.
if (drawAsSprite && pnt.getImageFilter()) {
- SkBitmap bitmap;
- if (as_IB(image)->asBitmapForImageFilters(&bitmap)) {
- SkPoint pt;
- iter.fMatrix->mapXY(x, y, &pt);
- iter.fDevice->drawSpriteWithFilter(iter, bitmap,
- SkScalarRoundToInt(pt.fX),
- SkScalarRoundToInt(pt.fY), pnt);
- }
+ SkPoint pt;
+ iter.fMatrix->mapXY(x, y, &pt);
+ iter.fDevice->drawSpecial(iter, special.get(),
+ SkScalarRoundToInt(pt.fX),
+ SkScalarRoundToInt(pt.fY), pnt);
} else {
iter.fDevice->drawImage(iter, image, x, y, pnt);
}
@@ -2401,12 +2400,18 @@ void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, cons
bounds = &storage;
}
+ sk_sp<SkSpecialImage> special;
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().gammaCloseToSRGB()) {
drawAsSprite = false;
+ } else {
+ special = this->getDevice()->makeSpecial(bitmap);
robertphillips 2016/07/18 17:01:58 I think we don't need the following if block
+ if (!special) {
+ drawAsSprite = false;
+ }
}
}
@@ -2414,17 +2419,17 @@ void SkCanvas::onDrawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, cons
while (iter.next()) {
const SkPaint& pnt = looper.paint();
- if (drawAsSprite && pnt.getImageFilter()) {
+ if (special) {
SkPoint pt;
iter.fMatrix->mapXY(x, y, &pt);
- iter.fDevice->drawSpriteWithFilter(iter, bitmap,
- SkScalarRoundToInt(pt.fX),
- SkScalarRoundToInt(pt.fY), pnt);
+ iter.fDevice->drawSpecial(iter, special.get(),
+ SkScalarRoundToInt(pt.fX),
+ SkScalarRoundToInt(pt.fY), pnt);
} else {
iter.fDevice->drawBitmap(iter, bitmap, matrix, looper.paint());
}
}
-
+
LOOPER_END
}

Powered by Google App Engine
This is Rietveld 408576698