| Index: src/gpu/SkGpuDevice.cpp
|
| diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
|
| index 0912b3d28e3f4475568ff3bc4f9901dd3a549fb0..8197d2a0e8acd74b2433f87930185fee81aa2365 100644
|
| --- a/src/gpu/SkGpuDevice.cpp
|
| +++ b/src/gpu/SkGpuDevice.cpp
|
| @@ -607,10 +607,9 @@ bool draw_with_mask_filter(GrContext* context, const SkPath& devPath,
|
| desc.fHeight = dstM.fBounds.height();
|
| desc.fConfig = kAlpha_8_GrPixelConfig;
|
|
|
| - GrAutoScratchTexture ast(context, desc);
|
| - GrTexture* texture = ast.texture();
|
| -
|
| - if (NULL == texture) {
|
| + SkAutoTUnref<GrTexture> texture(
|
| + context->refScratchTexture(desc, GrContext::kApprox_ScratchTexMatch));
|
| + if (!texture) {
|
| return false;
|
| }
|
| texture->writePixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig,
|
| @@ -621,20 +620,18 @@ bool draw_with_mask_filter(GrContext* context, const SkPath& devPath,
|
| return draw_mask(context, maskRect, grp, texture);
|
| }
|
|
|
| -// Create a mask of 'devPath' and place the result in 'mask'. Return true on
|
| -// success; false otherwise.
|
| -bool create_mask_GPU(GrContext* context,
|
| - const SkRect& maskRect,
|
| - const SkPath& devPath,
|
| - const GrStrokeInfo& strokeInfo,
|
| - bool doAA,
|
| - GrAutoScratchTexture* mask,
|
| - int SampleCnt) {
|
| +// Create a mask of 'devPath' and place the result in 'mask'.
|
| +GrTexture* create_mask_GPU(GrContext* context,
|
| + const SkRect& maskRect,
|
| + const SkPath& devPath,
|
| + const GrStrokeInfo& strokeInfo,
|
| + bool doAA,
|
| + int sampleCnt) {
|
| GrTextureDesc desc;
|
| desc.fFlags = kRenderTarget_GrTextureFlagBit;
|
| desc.fWidth = SkScalarCeilToInt(maskRect.width());
|
| desc.fHeight = SkScalarCeilToInt(maskRect.height());
|
| - desc.fSampleCnt = doAA ? SampleCnt : 0;
|
| + desc.fSampleCnt = doAA ? sampleCnt : 0;
|
| // We actually only need A8, but it often isn't supported as a
|
| // render target so default to RGBA_8888
|
| desc.fConfig = kRGBA_8888_GrPixelConfig;
|
| @@ -644,15 +641,14 @@ bool create_mask_GPU(GrContext* context,
|
| desc.fConfig = kAlpha_8_GrPixelConfig;
|
| }
|
|
|
| - mask->set(context, desc);
|
| - if (NULL == mask->texture()) {
|
| - return false;
|
| + GrTexture* mask = context->refScratchTexture(desc,GrContext::kApprox_ScratchTexMatch);
|
| + if (NULL == mask) {
|
| + return NULL;
|
| }
|
|
|
| - GrTexture* maskTexture = mask->texture();
|
| SkRect clipRect = SkRect::MakeWH(maskRect.width(), maskRect.height());
|
|
|
| - GrContext::AutoRenderTarget art(context, maskTexture->asRenderTarget());
|
| + GrContext::AutoRenderTarget art(context, mask->asRenderTarget());
|
| GrContext::AutoClip ac(context, clipRect);
|
|
|
| context->clear(NULL, 0x0, true);
|
| @@ -676,7 +672,7 @@ bool create_mask_GPU(GrContext* context,
|
| translate.setTranslate(-maskRect.fLeft, -maskRect.fTop);
|
| am.set(context, translate);
|
| context->drawPath(tempPaint, devPath, strokeInfo);
|
| - return true;
|
| + return mask;
|
| }
|
|
|
| SkBitmap wrap_texture(GrTexture* texture) {
|
| @@ -771,25 +767,16 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath,
|
| return;
|
| }
|
|
|
| - GrAutoScratchTexture mask;
|
|
|
| - if (create_mask_GPU(fContext, maskRect, *devPathPtr, strokeInfo,
|
| - grPaint.isAntiAlias(), &mask, fRenderTarget->numSamples())) {
|
| + SkAutoTUnref<GrTexture> mask(create_mask_GPU(fContext, maskRect, *devPathPtr,
|
| + strokeInfo, grPaint.isAntiAlias(),
|
| + fRenderTarget->numSamples()));
|
| + if (mask) {
|
| GrTexture* filtered;
|
|
|
| - if (paint.getMaskFilter()->filterMaskGPU(mask.texture(),
|
| - ctm, maskRect, &filtered, true)) {
|
| + if (paint.getMaskFilter()->filterMaskGPU(mask, ctm, maskRect, &filtered, true)) {
|
| // filterMaskGPU gives us ownership of a ref to the result
|
| SkAutoTUnref<GrTexture> atu(filtered);
|
| -
|
| - // If the scratch texture that we used as the filter src also holds the filter
|
| - // result then we must detach so that this texture isn't recycled for a later
|
| - // draw.
|
| - if (filtered == mask.texture()) {
|
| - mask.detach();
|
| - filtered->unref(); // detach transfers GrAutoScratchTexture's ref to us.
|
| - }
|
| -
|
| if (draw_mask(fContext, maskRect, &grPaint, filtered)) {
|
| // This path is completely drawn
|
| return;
|
| @@ -1771,7 +1758,7 @@ SkBaseDevice* SkGpuDevice::onCreateDevice(const SkImageInfo& info, Usage usage)
|
| const GrContext::ScratchTexMatch match = (kSaveLayer_Usage == usage) ?
|
| GrContext::kApprox_ScratchTexMatch :
|
| GrContext::kExact_ScratchTexMatch;
|
| - texture.reset(fContext->lockAndRefScratchTexture(desc, match));
|
| + texture.reset(fContext->refScratchTexture(desc, match));
|
| #else
|
| texture.reset(fContext->createUncachedTexture(desc, NULL, 0));
|
| #endif
|
|
|