Index: src/core/SkCanvas.cpp |
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
index a16a1a2c5e4a91573e91a9eca26c6a60ad2506c8..3734de1e2feb575e1dc6b451cbf8b7bb23077eae 100644 |
--- a/src/core/SkCanvas.cpp |
+++ b/src/core/SkCanvas.cpp |
@@ -80,12 +80,6 @@ bool SkCanvas::Internal_Private_GetTreatSpriteAsBitmap() { |
typedef SkTLazy<SkPaint> SkLazyPaint; |
-void SkCanvas::predrawNotify() { |
- if (fSurfaceBase) { |
- fSurfaceBase->aboutToDraw(SkSurface::kRetain_ContentChangeMode); |
- } |
-} |
- |
/////////////////////////////////////////////////////////////////////////////// |
static uint32_t filter_paint_flags(const SkSurfaceProps& props, uint32_t flags) { |
@@ -410,13 +404,11 @@ bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
////////// macros to place around the internal draw calls ////////////////// |
#define LOOPER_BEGIN_DRAWDEVICE(paint, type) \ |
- this->predrawNotify(); \ |
AutoDrawLooper looper(this, fProps, paint, true); \ |
while (looper.next(type)) { \ |
SkDrawIter iter(this); |
#define LOOPER_BEGIN(paint, type, bounds) \ |
- this->predrawNotify(); \ |
AutoDrawLooper looper(this, fProps, paint, false, bounds); \ |
while (looper.next(type)) { \ |
SkDrawIter iter(this); |
@@ -441,8 +433,6 @@ SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { |
fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, NULL, NULL, fConservativeRasterClip)); |
fMCRec->fTopLayer = fMCRec->fLayer; |
- fSurfaceBase = NULL; |
- |
fClipStack.reset(SkNEW(SkClipStack)); |
if (device) { |
@@ -718,9 +708,6 @@ bool SkCanvas::writePixels(const SkImageInfo& origInfo, const void* pixels, size |
// here x,y are either 0 or negative |
pixels = ((const char*)pixels - y * rowBytes - x * info.bytesPerPixel()); |
- // Tell our owning surface to bump its generation ID |
- this->predrawNotify(); |
- |
// The device can assert that the requested area is always contained in its bounds |
return device->writePixels(info, pixels, rowBytes, target.x(), target.y()); |
} |
@@ -1116,6 +1103,8 @@ void SkCanvas::internalDrawDevice(SkBaseDevice* srcDev, int x, int y, |
paint = &tmp; |
} |
+ SkAutoTUnref<SkImage> srcImage; |
+ |
LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type) |
while (iter.next()) { |
SkBaseDevice* dstDev = iter.fDevice; |
@@ -1126,17 +1115,36 @@ void SkCanvas::internalDrawDevice(SkBaseDevice* srcDev, int x, int y, |
SkDeviceImageFilterProxy proxy(dstDev, fProps); |
SkBitmap dst; |
SkIPoint offset = SkIPoint::Make(0, 0); |
- const SkBitmap& src = srcDev->accessBitmap(false); |
+ if (NULL == srcImage) { |
+ srcImage.reset(srcDev->newImageSnapshot()); |
+ if (NULL == srcImage) { |
+ return; |
+ } |
+ } |
SkMatrix matrix = *iter.fMatrix; |
matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y())); |
SkIRect clipBounds = SkIRect::MakeWH(srcDev->width(), srcDev->height()); |
SkAutoTUnref<SkImageFilter::Cache> cache(dstDev->getImageFilterCache()); |
SkImageFilter::Context ctx(matrix, clipBounds, cache.get()); |
- if (filter->filterImage(&proxy, src, ctx, &dst, &offset)) { |
- SkPaint tmpUnfiltered(*paint); |
- tmpUnfiltered.setImageFilter(NULL); |
- dstDev->drawSprite(iter, dst, pos.x() + offset.x(), pos.y() + offset.y(), |
- tmpUnfiltered); |
+ SkBitmap srcBitmap; // TODO: remove once filters accept SkImage |
+#if SK_SUPPORT_GPU |
+ // TODO: Gpu devices need bitmap that came from gpu, not through |
+ // getROPixels. Remove once filters accept SkImage. |
+ if (NULL != srcImage->getTexture()) { |
+ SkImageFilter::WrapTexture(srcImage->getTexture(), srcImage->width(), |
+ srcImage->height(), &srcBitmap); |
+ } else |
+#endif |
+ { |
+ as_IB(srcImage)->getROPixels(&srcBitmap); |
+ } |
+ if (!srcBitmap.empty()) { |
+ if (filter->filterImage(&proxy, srcBitmap, ctx, &dst, &offset)) { |
+ SkPaint tmpUnfiltered(*paint); |
+ tmpUnfiltered.setImageFilter(NULL); |
+ dstDev->drawSprite(iter, dst, pos.x() + offset.x(), pos.y() + offset.y(), |
+ tmpUnfiltered); |
+ } |
} |
} else { |
dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint); |
@@ -1718,8 +1726,8 @@ void SkCanvas::drawImageAsSprite(const SkImage& image, int left, int top, const |
////////////////////////////////////////////////////////////////////////////// |
void SkCanvas::onDiscard() { |
- if (fSurfaceBase) { |
- fSurfaceBase->aboutToDraw(SkSurface::kDiscard_ContentChangeMode); |
+ if (NULL != this->getDevice()) { |
+ this->getDevice()->discard(); |
} |
} |