Index: src/image/SkSurface_Gpu.cpp |
=================================================================== |
--- src/image/SkSurface_Gpu.cpp (revision 8614) |
+++ src/image/SkSurface_Gpu.cpp (working copy) |
@@ -83,31 +83,24 @@ |
canvas->drawBitmap(fDevice->accessBitmap(false), x, y, paint); |
} |
-// Copy the contents of the SkGpuDevice into a new texture and give that |
-// texture to the SkImage. Note that this flushes the SkGpuDevice but |
+// Create a new SkGpuDevice and, if necessary, copy the contents of the old |
+// device into it. Note that this flushes the SkGpuDevice but |
// doesn't force an OpenGL flush. |
-void SkSurface_Gpu::onCopyOnWrite(SkImage* image, SkCanvas*) { |
+void SkSurface_Gpu::onCopyOnWrite(SkImage* image, SkCanvas* canvas) { |
GrRenderTarget* rt = (GrRenderTarget*) fDevice->accessRenderTarget(); |
// are we sharing our render target with the image? |
if (rt->asTexture() == SkTextureImageGetTexture(image)) { |
- GrTextureDesc desc; |
- // copyTexture requires a render target as the destination |
- desc.fFlags = kRenderTarget_GrTextureFlagBit; |
- desc.fWidth = fDevice->width(); |
- desc.fHeight = fDevice->height(); |
- desc.fConfig = SkBitmapConfig2GrPixelConfig(fDevice->config()); |
- desc.fSampleCnt = 0; |
- |
- SkAutoTUnref<GrTexture> tex(fDevice->context()->createUncachedTexture(desc, NULL, 0)); |
- if (NULL == tex) { |
- SkTextureImageSetTexture(image, NULL); |
- return; |
- } |
- |
- fDevice->context()->copyTexture(rt->asTexture(), tex->asRenderTarget()); |
- |
- SkTextureImageSetTexture(image, tex); |
+ SkGpuDevice* newDevice = static_cast<SkGpuDevice*>( |
+ fDevice->createCompatibleDevice(fDevice->config(), fDevice->width(), |
+ fDevice->height(), fDevice->isOpaque())); |
+ SkAutoTUnref<SkGpuDevice> aurd(newDevice); |
+ fDevice->context()->copyTexture(rt->asTexture(), |
+ (GrRenderTarget*)newDevice->accessRenderTarget()); |
+ SkASSERT(NULL != canvas); |
+ SkASSERT(canvas->getDevice() == fDevice); |
+ canvas->setDevice(newDevice); |
+ SkRefCnt_SafeAssign(fDevice, newDevice); |
} |
} |