diff options
author | reed <reed@google.com> | 2014-12-02 10:08:11 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-02 10:08:11 -0800 |
commit | 3729469d6a12266037b697c2192768545e097ab0 (patch) | |
tree | 3260a913c22c9cbf3a24e78ebfd45f1e73815e02 /src | |
parent | cc969c4dd936c97670788395c9cbee3f346e87d1 (diff) |
Change clear() to respect the clip
patch from issue 769703002 at patchset 1 (http://crrev.com/769703002#ps1)
BUG=skia:
Review URL: https://codereview.chromium.org/772533004
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkBitmapDevice.cpp | 4 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 8 | ||||
-rw-r--r-- | src/core/SkDevice.cpp | 5 | ||||
-rw-r--r-- | src/core/SkPictureRecord.cpp | 8 | ||||
-rw-r--r-- | src/core/SkPictureRecord.h | 1 | ||||
-rw-r--r-- | src/core/SkRecordDraw.cpp | 3 | ||||
-rw-r--r-- | src/core/SkRecordDraw.h | 29 | ||||
-rw-r--r-- | src/core/SkRecorder.cpp | 4 | ||||
-rw-r--r-- | src/core/SkRecorder.h | 1 | ||||
-rw-r--r-- | src/core/SkRecords.h | 1 | ||||
-rw-r--r-- | src/gpu/GrLayerHoister.cpp | 13 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 19 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.h | 4 | ||||
-rw-r--r-- | src/image/SkSurface_Gpu.cpp | 2 | ||||
-rw-r--r-- | src/pdf/SkPDFDevice.cpp | 14 | ||||
-rw-r--r-- | src/pipe/SkGPipeWrite.cpp | 15 | ||||
-rw-r--r-- | src/utils/SkDeferredCanvas.cpp | 12 | ||||
-rw-r--r-- | src/utils/SkGatherPixelRefsAndRects.h | 3 | ||||
-rw-r--r-- | src/utils/SkNWayCanvas.cpp | 7 | ||||
-rw-r--r-- | src/utils/SkPictureUtils.cpp | 4 | ||||
-rw-r--r-- | src/utils/debugger/SkDebugCanvas.cpp | 4 | ||||
-rw-r--r-- | src/utils/debugger/SkDebugCanvas.h | 2 |
22 files changed, 26 insertions, 137 deletions
diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp index 9df7c9b655..020f1da13b 100644 --- a/src/core/SkBitmapDevice.cpp +++ b/src/core/SkBitmapDevice.cpp @@ -127,10 +127,6 @@ void SkBitmapDevice::unlockPixels() { } } -void SkBitmapDevice::clear(SkColor color) { - fBitmap.eraseColor(color); -} - const SkBitmap& SkBitmapDevice::onAccessBitmap() { return fBitmap; } diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 25d15b450c..a6f263f517 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1706,14 +1706,6 @@ void SkCanvas::drawDRRect(const SkRRect& outer, const SkRRect& inner, // These are the virtual drawing methods ////////////////////////////////////////////////////////////////////////////// -void SkCanvas::clear(SkColor color) { - SkDrawIter iter(this); - this->predrawNotify(); - while (iter.next()) { - iter.fDevice->clear(color); - } -} - void SkCanvas::onDiscard() { if (fSurfaceBase) { fSurfaceBase->aboutToDraw(SkSurface::kDiscard_ContentChangeMode); diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index bc6c892079..570cea45e3 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -90,6 +90,11 @@ SkSurface* SkBaseDevice::newSurface(const SkImageInfo&, const SkSurfaceProps&) { const void* SkBaseDevice::peekPixels(SkImageInfo*, size_t*) { return NULL; } +// DEPRECATED : remove when chrome subclass have been updated to not override clear() +void SkBaseDevice::clear(SkColor color) { + SkFAIL("SkDevice::clear() should not be called"); +} + void SkBaseDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) { SkPath path; diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp index 0003658893..ac05e841d7 100644 --- a/src/core/SkPictureRecord.cpp +++ b/src/core/SkPictureRecord.cpp @@ -460,14 +460,6 @@ size_t SkPictureRecord::recordClipRegion(const SkRegion& region, SkRegion::Op op return offset; } -void SkPictureRecord::clear(SkColor color) { - // op + color - size_t size = 2 * kUInt32Size; - size_t initialOffset = this->addDraw(DRAW_CLEAR, &size); - this->addInt(color); - this->validate(initialOffset, size); -} - void SkPictureRecord::drawPaint(const SkPaint& paint) { // op + paint index size_t size = 2 * kUInt32Size; diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h index 8aee0a817a..2a3e4e1070 100644 --- a/src/core/SkPictureRecord.h +++ b/src/core/SkPictureRecord.h @@ -29,7 +29,6 @@ public: SkPictureRecord(const SkISize& dimensions, uint32_t recordFlags); virtual ~SkPictureRecord(); - virtual void clear(SkColor) SK_OVERRIDE; virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) SK_OVERRIDE; diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp index 4801f66713..c1fa0e8cc3 100644 --- a/src/core/SkRecordDraw.cpp +++ b/src/core/SkRecordDraw.cpp @@ -61,13 +61,12 @@ void SkRecordDraw(const SkRecord& record, void SkRecordPartialDraw(const SkRecord& record, SkCanvas* canvas, SkPicture const* const drawablePicts[], int drawableCount, - const SkRect& clearRect, unsigned start, unsigned stop, const SkMatrix& initialCTM) { SkAutoCanvasRestore saveRestore(canvas, true /*save now, restore at exit*/); stop = SkTMin(stop, record.count()); - SkRecords::PartialDraw draw(canvas, NULL, 0, clearRect, initialCTM); + SkRecords::Draw draw(canvas, drawablePicts, NULL, drawableCount, &initialCTM); for (unsigned i = start; i < stop; i++) { record.visit<void>(i, draw); } diff --git a/src/core/SkRecordDraw.h b/src/core/SkRecordDraw.h index e95123bbe6..509f5a6c72 100644 --- a/src/core/SkRecordDraw.h +++ b/src/core/SkRecordDraw.h @@ -29,15 +29,14 @@ void SkRecordDraw(const SkRecord&, SkCanvas*, SkPicture const* const drawablePic SkCanvasDrawable* const drawables[], int drawableCount, const SkBBoxHierarchy*, SkDrawPictureCallback*); -// Draw a portion of an SkRecord into an SkCanvas while replacing clears with drawRects. +// Draw a portion of an SkRecord into an SkCanvas. // When drawing a portion of an SkRecord the CTM on the passed in canvas must be // the composition of the replay matrix with the record-time CTM (for the portion // of the record that is being replayed). For setMatrix calls to behave correctly // the initialCTM parameter must set to just the replay matrix. void SkRecordPartialDraw(const SkRecord&, SkCanvas*, SkPicture const* const drawablePicts[], int drawableCount, - const SkRect&, unsigned start, unsigned stop, - const SkMatrix& initialCTM); + unsigned start, unsigned stop, const SkMatrix& initialCTM); namespace SkRecords { @@ -76,30 +75,6 @@ private: int fDrawableCount; }; -// Used by SkRecordPartialDraw. -class PartialDraw : public Draw { -public: - PartialDraw(SkCanvas* canvas, SkPicture const* const drawablePicts[], int drawableCount, - const SkRect& clearRect, const SkMatrix& initialCTM) - : INHERITED(canvas, drawablePicts, NULL, drawableCount, &initialCTM), fClearRect(clearRect) - {} - - // Same as Draw for all ops except Clear. - template <typename T> void operator()(const T& r) { - this->INHERITED::operator()(r); - } - void operator()(const Clear& c) { - SkPaint p; - p.setColor(c.color); - DrawRect drawRect(p, fClearRect); - this->INHERITED::operator()(drawRect); - } - -private: - const SkRect fClearRect; - typedef Draw INHERITED; -}; - } // namespace SkRecords #endif//SkRecordDraw_DEFINED diff --git a/src/core/SkRecorder.cpp b/src/core/SkRecorder.cpp index 5ba43099b7..04da7c440c 100644 --- a/src/core/SkRecorder.cpp +++ b/src/core/SkRecorder.cpp @@ -118,10 +118,6 @@ char* SkRecorder::copy(const char* src) { } -void SkRecorder::clear(SkColor color) { - APPEND(Clear, color); -} - void SkRecorder::drawPaint(const SkPaint& paint) { APPEND(DrawPaint, delay_copy(paint)); } diff --git a/src/core/SkRecorder.h b/src/core/SkRecorder.h index be67dddd2e..ff5c9ed96c 100644 --- a/src/core/SkRecorder.h +++ b/src/core/SkRecorder.h @@ -45,7 +45,6 @@ public: // Make SkRecorder forget entirely about its SkRecord*; all calls to SkRecorder will fail. void forgetRecord(); - void clear(SkColor) SK_OVERRIDE; void drawPaint(const SkPaint& paint) SK_OVERRIDE; void drawPoints(PointMode mode, size_t count, diff --git a/src/core/SkRecords.h b/src/core/SkRecords.h index 00332c341c..046626af4b 100644 --- a/src/core/SkRecords.h +++ b/src/core/SkRecords.h @@ -234,6 +234,7 @@ RECORD3(ClipRRect, SkIRect, devBounds, SkRRect, rrect, RegionOpAndAA, opAA); RECORD3(ClipRect, SkIRect, devBounds, SkRect, rect, RegionOpAndAA, opAA); RECORD3(ClipRegion, SkIRect, devBounds, SkRegion, region, SkRegion::Op, op); +// Picture version 37 was last to record this op-code; clear is now non-virtual RECORD1(Clear, SkColor, color); RECORD1(BeginCommentGroup, PODArray<char>, description); diff --git a/src/gpu/GrLayerHoister.cpp b/src/gpu/GrLayerHoister.cpp index 4e7836830c..e29e57e8a5 100644 --- a/src/gpu/GrLayerHoister.cpp +++ b/src/gpu/GrLayerHoister.cpp @@ -234,10 +234,6 @@ void GrLayerHoister::DrawLayersToAtlas(GrContext* context, SkCanvas* atlasCanvas = surface->getCanvas(); - SkPaint clearPaint; - clearPaint.setColor(SK_ColorTRANSPARENT); - clearPaint.setXfermode(SkXfermode::Create(SkXfermode::kSrc_Mode))->unref(); - for (int i = 0; i < atlased.count(); ++i) { const GrCachedLayer* layer = atlased[i].fLayer; const SkPicture* pict = atlased[i].fPicture; @@ -255,9 +251,7 @@ void GrLayerHoister::DrawLayersToAtlas(GrContext* context, SkIntToScalar(layer->rect().width()), SkIntToScalar(layer->rect().height())); atlasCanvas->clipRect(bound); - - // Since 'clear' doesn't respect the clip we need to draw a rect - atlasCanvas->drawRect(bound, clearPaint); + atlasCanvas->clear(0); // '-offset' maps the layer's top/left to the origin. // Since this layer is atlased, the top/left corner needs @@ -272,7 +266,7 @@ void GrLayerHoister::DrawLayersToAtlas(GrContext* context, SkRecordPartialDraw(*pict->fRecord.get(), atlasCanvas, pict->drawablePicts(), pict->drawableCount(), - bound, layer->start() + 1, layer->stop(), initialCTM); + layer->start() + 1, layer->stop(), initialCTM); atlasCanvas->restore(); } @@ -303,7 +297,6 @@ void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay SkIntToScalar(layer->rect().height())); layerCanvas->clipRect(bound); - layerCanvas->clear(SK_ColorTRANSPARENT); SkMatrix initialCTM; @@ -315,7 +308,7 @@ void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay SkRecordPartialDraw(*pict->fRecord.get(), layerCanvas, pict->drawablePicts(), pict->drawableCount(), - bound, layer->start()+1, layer->stop(), initialCTM); + layer->start()+1, layer->stop(), initialCTM); layerCanvas->flush(); } diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 9a78048aa7..e6c8343943 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -68,7 +68,7 @@ enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; #define DO_DEFERRED_CLEAR() \ do { \ if (fFlags & kNeedClear_Flag) { \ - this->clear(SK_ColorTRANSPARENT); \ + this->clearAll(); \ } \ } while (false) \ @@ -294,6 +294,14 @@ GrRenderTarget* SkGpuDevice::accessRenderTarget() { return fRenderTarget; } +void SkGpuDevice::clearAll() { + GrColor color = 0; + GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::clearAll", fContext); + SkIRect rect = SkIRect::MakeWH(this->width(), this->height()); + fContext->clear(&rect, color, true, fRenderTarget); + fFlags &= ~kNeedClear_Flag; +} + /////////////////////////////////////////////////////////////////////////////// SK_COMPILE_ASSERT(SkShader::kNone_BitmapType == 0, shader_type_mismatch); @@ -309,13 +317,6 @@ SK_COMPILE_ASSERT(SkShader::kLast_BitmapType == 6, shader_type_mismatch); /////////////////////////////////////////////////////////////////////////////// -void SkGpuDevice::clear(SkColor color) { - GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::clear", fContext); - SkIRect rect = SkIRect::MakeWH(this->width(), this->height()); - fContext->clear(&rect, SkColor2GrColor(color), true, fRenderTarget); - fFlags &= ~kNeedClear_Flag; -} - void SkGpuDevice::drawPaint(const SkDraw& draw, const SkPaint& paint) { CHECK_SHOULD_DRAW(draw, false); GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPaint", fContext); @@ -1481,7 +1482,7 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkBaseDevice* device, SkGpuDevice* dev = static_cast<SkGpuDevice*>(device); if (dev->fFlags & kNeedClear_Flag) { // TODO: could check here whether we really need to draw at all - dev->clear(0x0); + dev->clearAll(); } // drawDevice is defined to be in device coords. diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h index f7088e3fa3..2fb6de7eb8 100644 --- a/src/gpu/SkGpuDevice.h +++ b/src/gpu/SkGpuDevice.h @@ -65,13 +65,15 @@ public: GrContext* context() const { return fContext; } + // set all pixels to 0 + void clearAll(); + virtual GrRenderTarget* accessRenderTarget() SK_OVERRIDE; virtual SkImageInfo imageInfo() const SK_OVERRIDE { return fRenderTarget ? fRenderTarget->surfacePriv().info() : SkImageInfo::MakeUnknown(); } - virtual void clear(SkColor color) SK_OVERRIDE; virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE; virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count, const SkPoint[], const SkPaint& paint) SK_OVERRIDE; diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp index 9ac6d55340..848709445d 100644 --- a/src/image/SkSurface_Gpu.cpp +++ b/src/image/SkSurface_Gpu.cpp @@ -44,7 +44,7 @@ SkSurface_Gpu::SkSurface_Gpu(GrRenderTarget* renderTarget, const SkSurfaceProps* fDevice = SkGpuDevice::Create(renderTarget, this->props(), deviceFlags); if (kRGB_565_GrPixelConfig != renderTarget->config() && doClear) { - fDevice->clear(0x0); + fDevice->clearAll(); } } diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index fb8df838eb..6592ba0c68 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -801,20 +801,6 @@ void SkPDFDevice::cleanUp(bool clearFontUsage) { } } -void SkPDFDevice::clear(SkColor color) { - this->cleanUp(true); - this->init(); - - SkPaint paint; - paint.setColor(color); - paint.setStyle(SkPaint::kFill_Style); - SkMatrix identity; - identity.reset(); - ScopedContentEntry content(this, &fExistingClipStack, fExistingClipRegion, - identity, paint); - internalDrawPaint(paint, content.entry()); -} - void SkPDFDevice::drawPaint(const SkDraw& d, const SkPaint& paint) { SkPaint newPaint = paint; newPaint.setStyle(SkPaint::kFill_Style); diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp index 41b0234480..a5af6c7111 100644 --- a/src/pipe/SkGPipeWrite.cpp +++ b/src/pipe/SkGPipeWrite.cpp @@ -233,7 +233,6 @@ public: // overrides from SkCanvas virtual bool isDrawingToLayer() const SK_OVERRIDE; - virtual void clear(SkColor) SK_OVERRIDE; virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; virtual void drawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) SK_OVERRIDE; @@ -690,20 +689,6 @@ void SkGPipeCanvas::onClipRegion(const SkRegion& region, SkRegion::Op rgnOp) { /////////////////////////////////////////////////////////////////////////////// -void SkGPipeCanvas::clear(SkColor color) { - NOTIFY_SETUP(this); - unsigned flags = 0; - if (color) { - flags |= kClear_HasColor_DrawOpFlag; - } - if (this->needOpBytes(sizeof(SkColor))) { - this->writeOp(kDrawClear_DrawOp, flags, 0); - if (color) { - fWriter.write32(color); - } - } -} - void SkGPipeCanvas::drawPaint(const SkPaint& paint) { NOTIFY_SETUP(this); this->writePaint(paint); diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index 3c845b1d65..34b9146996 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -170,8 +170,6 @@ protected: // None of the following drawing methods should ever get called on the // deferred device - virtual void clear(SkColor color) SK_OVERRIDE - {SkASSERT(0);} virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE {SkASSERT(0);} virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, @@ -741,16 +739,6 @@ void SkDeferredCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) this->recordedDrawCommand(); } -void SkDeferredCanvas::clear(SkColor color) { - // purge pending commands - if (fDeferredDrawing) { - this->getDeferredDevice()->skipPendingCommands(); - } - - this->drawingCanvas()->clear(color); - this->recordedDrawCommand(); -} - void SkDeferredCanvas::drawPaint(const SkPaint& paint) { if (fDeferredDrawing && this->isFullFrame(NULL, &paint) && isPaintOpaque(&paint)) { diff --git a/src/utils/SkGatherPixelRefsAndRects.h b/src/utils/SkGatherPixelRefsAndRects.h index 4eeb56c14c..6e11fbe6d5 100644 --- a/src/utils/SkGatherPixelRefsAndRects.h +++ b/src/utils/SkGatherPixelRefsAndRects.h @@ -40,9 +40,6 @@ public: } protected: - virtual void clear(SkColor color) SK_OVERRIDE { - NothingToDo(); - } virtual void drawPaint(const SkDraw& draw, const SkPaint& paint) SK_OVERRIDE { SkBitmap bm; diff --git a/src/utils/SkNWayCanvas.cpp b/src/utils/SkNWayCanvas.cpp index a6722d8364..ddd9b927fd 100644 --- a/src/utils/SkNWayCanvas.cpp +++ b/src/utils/SkNWayCanvas.cpp @@ -134,13 +134,6 @@ void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { this->INHERITED::onClipRegion(deviceRgn, op); } -void SkNWayCanvas::clear(SkColor color) { - Iter iter(fList); - while (iter.next()) { - iter->clear(color); - } -} - void SkNWayCanvas::drawPaint(const SkPaint& paint) { Iter iter(fList); while (iter.next()) { diff --git a/src/utils/SkPictureUtils.cpp b/src/utils/SkPictureUtils.cpp index 7f9409adac..2c6b8f56b5 100644 --- a/src/utils/SkPictureUtils.cpp +++ b/src/utils/SkPictureUtils.cpp @@ -77,10 +77,6 @@ public: return false; } - virtual void clear(SkColor color) SK_OVERRIDE { - nothing_to_do(); - } - virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE { this->addBitmapFromPaint(paint); } diff --git a/src/utils/debugger/SkDebugCanvas.cpp b/src/utils/debugger/SkDebugCanvas.cpp index 95256e7d13..787cf89299 100644 --- a/src/utils/debugger/SkDebugCanvas.cpp +++ b/src/utils/debugger/SkDebugCanvas.cpp @@ -426,10 +426,6 @@ void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkPaint::Fil fTexOverrideFilter->setFilterLevel(level); } -void SkDebugCanvas::clear(SkColor color) { - this->addDrawCommand(new SkClearCommand(color)); -} - void SkDebugCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) { this->addDrawCommand(new SkClipPathCommand(path, op, kSoft_ClipEdgeStyle == edgeStyle)); } diff --git a/src/utils/debugger/SkDebugCanvas.h b/src/utils/debugger/SkDebugCanvas.h index bdd04aa2db..2c079bd4c3 100644 --- a/src/utils/debugger/SkDebugCanvas.h +++ b/src/utils/debugger/SkDebugCanvas.h @@ -158,8 +158,6 @@ public: // Inherited from SkCanvas //////////////////////////////////////////////////////////////////////////////// - virtual void clear(SkColor) SK_OVERRIDE; - virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) SK_OVERRIDE; |