Chromium Code Reviews| Index: src/image/SkSurface_Raster.cpp |
| =================================================================== |
| --- src/image/SkSurface_Raster.cpp (revision 8402) |
| +++ src/image/SkSurface_Raster.cpp (working copy) |
| @@ -25,7 +25,7 @@ |
| virtual SkImage* onNewImageShapshot() SK_OVERRIDE; |
| virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, |
| const SkPaint*) SK_OVERRIDE; |
| - virtual void onCopyOnWrite(SkImage*, SkCanvas*) SK_OVERRIDE; |
| + virtual void onCopyOnWrite(SkImage*, SkCanvas*, bool overwrite) SK_OVERRIDE; |
| private: |
| SkBitmap fBitmap; |
| @@ -124,12 +124,20 @@ |
| return SkNewImageFromBitmap(fBitmap, fWeOwnThePixels); |
| } |
| -void SkSurface_Raster::onCopyOnWrite(SkImage* image, SkCanvas* canvas) { |
| +void SkSurface_Raster::onCopyOnWrite(SkImage* image, SkCanvas* canvas, bool overwrite) { |
| // are we sharing pixelrefs with the image? |
| if (SkBitmapImageGetPixelRef(image) == fBitmap.pixelRef()) { |
| SkASSERT(fWeOwnThePixels); |
| - SkBitmap prev(fBitmap); |
| - prev.deepCopyTo(&fBitmap, prev.config()); |
| + if (!overwrite) { |
| + SkBitmap prev(fBitmap); |
| + prev.deepCopyTo(&fBitmap, prev.config()); |
| + } else { |
| + SkBitmap newBitmap; |
| + newBitmap.setConfig(fBitmap.getConfig(), fBitmap.width(), fBitmap.height(), |
| + fBitmap.rowBytes()); |
| + newBitmap.allocPixels(); |
| + fBitmap.swap(newBitmap); |
| + } |
| // Now fBitmap is a deep copy of itself (and therefore different from |
|
Stephen White
2013/03/26 20:51:44
Nit: this comment is not strictly true anymore, s
|
| // what is being used by the image. Next we update the canvas to use |
| // this as its backend, so we can't modify the image's pixels anymore. |