diff options
author | 2012-10-09 22:30:18 +0000 | |
---|---|---|
committer | 2012-10-09 22:30:18 +0000 | |
commit | 3fffb2ee9fa01ae61efb2395973eb7575eda4c96 (patch) | |
tree | 22f3328eb4c6bca5cb87339d5a765630293f7aaf /src | |
parent | 5cd3656ed3676730b296722812f5924d06d0cc98 (diff) |
Reverting r5861 (remove gainfocus and setMatixClip) due to Chrome compilation issues
git-svn-id: http://skia.googlecode.com/svn/trunk@5871 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkCanvas.cpp | 20 | ||||
-rw-r--r-- | src/core/SkDevice.cpp | 4 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 85 | ||||
-rw-r--r-- | src/utils/SkDeferredCanvas.cpp | 3 |
4 files changed, 89 insertions, 23 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index b6d8c293cf..5e476c6c9e 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -124,6 +124,8 @@ struct DeviceCM { SkRegion::kDifference_Op); } + fDevice->setMatrixClip(*fMatrix, fClip.forceGetBW(), clipStack); + #ifdef SK_DEBUG if (!fClip.isEmpty()) { SkIRect deviceR; @@ -242,6 +244,7 @@ public: } // fCurrLayer may be NULL now + fCanvas->prepareForDeviceDraw(fDevice, *fMatrix, *fClip); return true; } return false; @@ -438,6 +441,7 @@ SkDevice* SkCanvas::init(SkDevice* device) { fBounder = NULL; fLocalBoundsCompareType.setEmpty(); fLocalBoundsCompareTypeDirty = true; + fLastDeviceToGainFocus = NULL; fDeviceCMDirty = false; fSaveLayerCount = 0; fMetaData = NULL; @@ -660,6 +664,15 @@ void SkCanvas::updateDeviceCMCache() { } } +void SkCanvas::prepareForDeviceDraw(SkDevice* device, const SkMatrix& matrix, + const SkRegion& clip) { + SkASSERT(device); + if (fLastDeviceToGainFocus != device) { + device->gainFocus(matrix, clip); + fLastDeviceToGainFocus = device; + } +} + /////////////////////////////////////////////////////////////////////////////// int SkCanvas::internalSave(SaveFlags flags) { @@ -846,6 +859,13 @@ void SkCanvas::internalRestore() { fDeviceCMDirty = true; fLocalBoundsCompareTypeDirty = true; + // Dirty this pointer to handle the case of a new device created at the same address as the + // device we are restoring from. E.g.: + // saveLayer (creates a device) + // drawSomething + // restore (deletes the device) + // saveLayer (oops new device at the same address) + fLastDeviceToGainFocus = NULL; fClipStack.restore(); // reserve our layer (if any) diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index 6d8958d804..7da9a6b442 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -122,6 +122,10 @@ void SkDevice::clear(SkColor color) { const SkBitmap& SkDevice::onAccessBitmap(SkBitmap* bitmap) {return *bitmap;} +void SkDevice::setMatrixClip(const SkMatrix& matrix, const SkRegion& region, + const SkClipStack& clipStack) { +} + bool SkDevice::canHandleImageFilter(SkImageFilter*) { return false; } diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index b168e57e63..9a495c9703 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -30,10 +30,12 @@ #define CHECK_SHOULD_DRAW(draw) \ do { \ if (gShouldDrawProc && !gShouldDrawProc()) return; \ - this->prepareDraw(draw); \ + this->prepareRenderTarget(draw); \ + GrAssert(!fNeedClear) \ } while (0) #else - #define CHECK_SHOULD_DRAW(draw) this->prepareDraw(draw) + #define CHECK_SHOULD_DRAW(draw) this->prepareRenderTarget(draw); \ + GrAssert(!fNeedClear) #endif // we use the same texture slot on GrPaint for bitmaps and shaders @@ -44,6 +46,7 @@ enum { kColorFilterTextureIdx = 1 }; + #define MAX_BLUR_SIGMA 4.0f // FIXME: This value comes from from SkBlurMaskFilter.cpp. // Should probably be put in a common header someplace. @@ -61,10 +64,11 @@ enum { // a sub region of a larger source image. #define COLOR_BLEED_TOLERANCE SkFloatToScalar(0.001f) -#define DO_DEFERRED_CLEAR() \ +#define DO_DEFERRED_CLEAR \ do { \ if (fNeedClear) { \ this->clear(0x0); \ + fNeedClear = false; \ } \ } while (false) \ @@ -178,6 +182,7 @@ SkGpuDevice::SkGpuDevice(GrContext* context, GrRenderTarget* renderTarget) void SkGpuDevice::initFromRenderTarget(GrContext* context, GrRenderTarget* renderTarget, bool cached) { + fNeedPrepareRenderTarget = false; fDrawProcs = NULL; fContext = context; @@ -209,6 +214,7 @@ SkGpuDevice::SkGpuDevice(GrContext* context, int height) : SkDevice(config, width, height, false /*isOpaque*/) { + fNeedPrepareRenderTarget = false; fDrawProcs = NULL; fContext = context; @@ -252,11 +258,9 @@ SkGpuDevice::~SkGpuDevice() { delete fDrawProcs; } - // The GrContext takes a ref on the target. We don't want to cause the render - // target to be unnecessarily kept alive. - if (fContext->getRenderTarget() == fRenderTarget) { - fContext->setRenderTarget(NULL); - } + // The SkGpuDevice gives the context the render target (e.g., in gainFocus) + // This call gives the context a chance to relinquish it + fContext->setRenderTarget(NULL); SkSafeUnref(fRenderTarget); fContext->unref(); @@ -265,8 +269,9 @@ SkGpuDevice::~SkGpuDevice() { /////////////////////////////////////////////////////////////////////////////// void SkGpuDevice::makeRenderTargetCurrent() { - DO_DEFERRED_CLEAR(); + DO_DEFERRED_CLEAR; fContext->setRenderTarget(fRenderTarget); + fNeedPrepareRenderTarget = true; } /////////////////////////////////////////////////////////////////////////////// @@ -303,7 +308,7 @@ GrPixelConfig config8888_to_grconfig_and_flags(SkCanvas::Config8888 config8888, bool SkGpuDevice::onReadPixels(const SkBitmap& bitmap, int x, int y, SkCanvas::Config8888 config8888) { - DO_DEFERRED_CLEAR(); + DO_DEFERRED_CLEAR; SkASSERT(SkBitmap::kARGB_8888_Config == bitmap.config()); SkASSERT(!bitmap.isNull()); SkASSERT(SkIRect::MakeWH(this->width(), this->height()).contains(SkIRect::MakeXYWH(x, y, bitmap.width(), bitmap.height()))); @@ -406,29 +411,64 @@ static void check_bounds(const GrClipData& clipData, /////////////////////////////////////////////////////////////////////////////// +static void set_matrix_and_clip(GrContext* context, const SkMatrix& matrix, + GrClipData& clipData, + const SkRegion& clipRegion, + const SkIPoint& origin, + int renderTargetWidth, int renderTargetHeight) { + context->setMatrix(matrix); + + clipData.fOrigin = origin; + +#ifdef SK_DEBUG + check_bounds(clipData, clipRegion, + renderTargetWidth, renderTargetHeight); +#endif + + context->setClip(&clipData); +} + // call this every draw call, to ensure that the context reflects our state, // and not the state from some other canvas/device -void SkGpuDevice::prepareDraw(const SkDraw& draw) { +void SkGpuDevice::prepareRenderTarget(const SkDraw& draw) { GrAssert(NULL != fClipData.fClipStack); - fContext->setRenderTarget(fRenderTarget); + if (fNeedPrepareRenderTarget || + fContext->getRenderTarget() != fRenderTarget) { + + fContext->setRenderTarget(fRenderTarget); + SkASSERT(draw.fClipStack && draw.fClipStack == fClipData.fClipStack); - SkASSERT(draw.fClipStack && draw.fClipStack == fClipData.fClipStack); + set_matrix_and_clip(fContext, *draw.fMatrix, + fClipData, *draw.fClip, this->getOrigin(), + fRenderTarget->width(), fRenderTarget->height()); + fNeedPrepareRenderTarget = false; + } +} - fContext->setMatrix(*draw.fMatrix); - fClipData.fOrigin = this->getOrigin(); +void SkGpuDevice::setMatrixClip(const SkMatrix& matrix, const SkRegion& clip, + const SkClipStack& clipStack) { + this->INHERITED::setMatrixClip(matrix, clip, clipStack); + // We don't need to set them now because the context may not reflect this device. + fNeedPrepareRenderTarget = true; +} -#ifdef SK_DEBUG - check_bounds(fClipData, *draw.fClip, fRenderTarget->width(), fRenderTarget->height()); -#endif +void SkGpuDevice::gainFocus(const SkMatrix& matrix, const SkRegion& clip) { - fContext->setClip(&fClipData); + GrAssert(NULL != fClipData.fClipStack); - DO_DEFERRED_CLEAR(); + fContext->setRenderTarget(fRenderTarget); + + this->INHERITED::gainFocus(matrix, clip); + + set_matrix_and_clip(fContext, matrix, fClipData, clip, this->getOrigin(), + fRenderTarget->width(), fRenderTarget->height()); + + DO_DEFERRED_CLEAR; } SkGpuRenderTarget* SkGpuDevice::accessRenderTarget() { - DO_DEFERRED_CLEAR(); + DO_DEFERRED_CLEAR; return (SkGpuRenderTarget*)fRenderTarget; } @@ -622,7 +662,6 @@ inline bool skPaint2GrPaintShader(SkGpuDevice* dev, /////////////////////////////////////////////////////////////////////////////// void SkGpuDevice::clear(SkColor color) { fContext->clear(NULL, color, fRenderTarget); - fNeedClear = false; } void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { @@ -1888,7 +1927,7 @@ bool SkGpuDevice::filterTextFlags(const SkPaint& paint, TextFlags* flags) { } void SkGpuDevice::flush() { - DO_DEFERRED_CLEAR(); + DO_DEFERRED_CLEAR; fContext->resolveRenderTarget(fRenderTarget); } diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index c3de393290..eaba50342e 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -268,6 +268,9 @@ protected: virtual bool filterTextFlags(const SkPaint& paint, TextFlags*) SK_OVERRIDE {return false;} + virtual void setMatrixClip(const SkMatrix&, const SkRegion&, + const SkClipStack&) SK_OVERRIDE + {} // None of the following drawing methods should ever get called on the // deferred device |