Index: src/gpu/SkGpuDevice.cpp |
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
index 9760968e54970f8259fda84585b560b4575ac9b2..2aa16e4d8d9c7cbaaa2df625abd59a772f6aad23 100644 |
--- a/src/gpu/SkGpuDevice.cpp |
+++ b/src/gpu/SkGpuDevice.cpp |
@@ -7,41 +7,40 @@ |
#include "SkGpuDevice.h" |
-#include "effects/GrBicubicEffect.h" |
-#include "effects/GrDashingEffect.h" |
-#include "effects/GrTextureDomain.h" |
-#include "effects/GrSimpleTextureEffect.h" |
- |
-#include "GrContext.h" |
#include "GrBitmapTextContext.h" |
+#include "GrContext.h" |
#include "GrDistanceFieldTextContext.h" |
+#include "GrGpu.h" |
+#include "GrGpuResourcePriv.h" |
#include "GrLayerHoister.h" |
#include "GrRecordReplaceDraw.h" |
#include "GrStrokeInfo.h" |
#include "GrTracing.h" |
-#include "GrGpu.h" |
- |
-#include "SkGrTexturePixelRef.h" |
- |
#include "SkCanvasPriv.h" |
#include "SkDeviceImageFilterProxy.h" |
#include "SkDrawProcs.h" |
+#include "SkErrorInternals.h" |
#include "SkGlyphCache.h" |
+#include "SkGrTexturePixelRef.h" |
#include "SkImageFilter.h" |
#include "SkLayerInfo.h" |
#include "SkMaskFilter.h" |
#include "SkPathEffect.h" |
#include "SkPicture.h" |
#include "SkPictureData.h" |
-#include "SkRecord.h" |
#include "SkRRect.h" |
+#include "SkRecord.h" |
#include "SkStroke.h" |
#include "SkSurface.h" |
+#include "SkSurface_Gpu.h" |
#include "SkTLazy.h" |
#include "SkUtils.h" |
#include "SkVertState.h" |
#include "SkXfermode.h" |
-#include "SkErrorInternals.h" |
+#include "effects/GrBicubicEffect.h" |
+#include "effects/GrDashingEffect.h" |
+#include "effects/GrSimpleTextureEffect.h" |
+#include "effects/GrTextureDomain.h" |
#if SK_SUPPORT_GPU |
@@ -164,9 +163,8 @@ SkGpuDevice::SkGpuDevice(GrRenderTarget* rt, const SkSurfaceProps* props, unsign |
fTextContext = fContext->createTextContext(fRenderTarget, this->getLeakyProperties(), useDFT); |
} |
-SkGpuDevice* SkGpuDevice::Create(GrContext* context, SkSurface::Budgeted budgeted, |
- const SkImageInfo& origInfo, int sampleCount, |
- const SkSurfaceProps* props, unsigned flags) { |
+GrRenderTarget* SkGpuDevice::CreateRenderTarget(GrContext* context, SkSurface::Budgeted budgeted, |
+ const SkImageInfo& origInfo, int sampleCount) { |
if (kUnknown_SkColorType == origInfo.colorType() || |
origInfo.width() < 0 || origInfo.height() < 0) { |
return NULL; |
@@ -195,13 +193,24 @@ SkGpuDevice* SkGpuDevice::Create(GrContext* context, SkSurface::Budgeted budgete |
desc.fHeight = info.height(); |
desc.fConfig = SkImageInfo2GrPixelConfig(info); |
desc.fSampleCnt = sampleCount; |
+ GrTexture* texture = context->createTexture(desc, SkToBool(budgeted), NULL, 0); |
+ if (NULL == texture) { |
+ return NULL; |
+ } |
+ SkASSERT(NULL != texture->asRenderTarget()); |
+ return texture->asRenderTarget(); |
+} |
- SkAutoTUnref<GrTexture> texture(context->createTexture(desc, SkToBool(budgeted), NULL, 0)); |
- if (!texture) { |
+SkGpuDevice* SkGpuDevice::Create(GrContext* context, SkSurface::Budgeted budgeted, |
+ const SkImageInfo& info, int sampleCount, |
+ const SkSurfaceProps* props, unsigned flags) { |
+ |
+ SkAutoTUnref<GrRenderTarget> rt(CreateRenderTarget(context, budgeted, info, sampleCount)); |
+ if (NULL == rt) { |
return NULL; |
} |
- return SkNEW_ARGS(SkGpuDevice, (texture->asRenderTarget(), props, flags)); |
+ return SkNEW_ARGS(SkGpuDevice, (rt, props, flags)); |
} |
SkGpuDevice::~SkGpuDevice() { |
@@ -302,6 +311,38 @@ void SkGpuDevice::clearAll() { |
fNeedClear = false; |
} |
+void SkGpuDevice::replaceRenderTarget(bool shouldRetainContent) { |
+ // Caller must have accessed the render target, because it knows the rt must be replaced. |
+ SkASSERT(!fNeedClear); |
+ |
+ SkSurface::Budgeted budgeted = |
+ fRenderTarget->resourcePriv().isBudgeted() ? SkSurface::kYes_Budgeted |
+ : SkSurface::kNo_Budgeted; |
+ |
+ SkAutoTUnref<GrRenderTarget> newRT(CreateRenderTarget( |
+ fRenderTarget->getContext(), budgeted, this->imageInfo(), fRenderTarget->numSamples())); |
+ |
+ if (NULL == newRT) { |
+ return; |
+ } |
+ |
+ if (shouldRetainContent) { |
+ if (fRenderTarget->wasDestroyed()) { |
+ return; |
+ } |
+ this->context()->copySurface(newRT, fRenderTarget); |
+ } |
+ |
+ SkASSERT(fRenderTarget != newRT); |
+ |
+ fRenderTarget->unref(); |
+ fRenderTarget = newRT.detach(); |
+ |
+ SkASSERT(fRenderTarget->surfacePriv().info() == fLegacyBitmap.info()); |
+ SkPixelRef* pr = SkNEW_ARGS(SkGrPixelRef, (fRenderTarget->surfacePriv().info(), fRenderTarget)); |
+ fLegacyBitmap.setPixelRef(pr)->unref(); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
SK_COMPILE_ASSERT(SkShader::kNone_BitmapType == 0, shader_type_mismatch); |