diff options
author | reed <reed@chromium.org> | 2014-12-02 19:40:18 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-02 19:40:18 -0800 |
commit | af641a1c10f176cb9617026d3cc93c117a85d13d (patch) | |
tree | d655e0b8250823136d12be8ac638f5b5c9208fdb /src | |
parent | 1962f521a239a86417509c0628a99ac0b5ba0bc2 (diff) |
Revert "Change clear() to respect the clip"
This reverts commit 3729469d6a12266037b697c2192768545e097ab0.
BUG=skia:
TBR=
Review URL: https://codereview.chromium.org/778563002
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, 137 insertions, 26 deletions
diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp index 020f1da13b..9df7c9b655 100644 --- a/src/core/SkBitmapDevice.cpp +++ b/src/core/SkBitmapDevice.cpp @@ -127,6 +127,10 @@ 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 a6f263f517..25d15b450c 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1706,6 +1706,14 @@ 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 570cea45e3..bc6c892079 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -90,11 +90,6 @@ 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 ac05e841d7..0003658893 100644 --- a/src/core/SkPictureRecord.cpp +++ b/src/core/SkPictureRecord.cpp @@ -460,6 +460,14 @@ 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 2a3e4e1070..8aee0a817a 100644 --- a/src/core/SkPictureRecord.h +++ b/src/core/SkPictureRecord.h @@ -29,6 +29,7 @@ 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 c1fa0e8cc3..4801f66713 100644 --- a/src/core/SkRecordDraw.cpp +++ b/src/core/SkRecordDraw.cpp @@ -61,12 +61,13 @@ 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::Draw draw(canvas, drawablePicts, NULL, drawableCount, &initialCTM); + SkRecords::PartialDraw draw(canvas, NULL, 0, clearRect, 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 509f5a6c72..e95123bbe6 100644 --- a/src/core/SkRecordDraw.h +++ b/src/core/SkRecordDraw.h @@ -29,14 +29,15 @@ 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. +// Draw a portion of an SkRecord into an SkCanvas while replacing clears with drawRects. // 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, - unsigned start, unsigned stop, const SkMatrix& initialCTM); + const SkRect&, unsigned start, unsigned stop, + const SkMatrix& initialCTM); namespace SkRecords { @@ -75,6 +76,30 @@ 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 04da7c440c..5ba43099b7 100644 --- a/src/core/SkRecorder.cpp +++ b/src/core/SkRecorder.cpp @@ -118,6 +118,10 @@ 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 ff5c9ed96c..be67dddd2e 100644 --- a/src/core/SkRecorder.h +++ b/src/core/SkRecorder.h @@ -45,6 +45,7 @@ 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 046626af4b..00332c341c 100644 --- a/src/core/SkRecords.h +++ b/src/core/SkRecords.h @@ -234,7 +234,6 @@ 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 e29e57e8a5..4e7836830c 100644 --- a/src/gpu/GrLayerHoister.cpp +++ b/src/gpu/GrLayerHoister.cpp @@ -234,6 +234,10 @@ 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; @@ -251,7 +255,9 @@ void GrLayerHoister::DrawLayersToAtlas(GrContext* context, SkIntToScalar(layer->rect().width()), SkIntToScalar(layer->rect().height())); atlasCanvas->clipRect(bound); - atlasCanvas->clear(0); + + // Since 'clear' doesn't respect the clip we need to draw a rect + atlasCanvas->drawRect(bound, clearPaint); // '-offset' maps the layer's top/left to the origin. // Since this layer is atlased, the top/left corner needs @@ -266,7 +272,7 @@ void GrLayerHoister::DrawLayersToAtlas(GrContext* context, SkRecordPartialDraw(*pict->fRecord.get(), atlasCanvas, pict->drawablePicts(), pict->drawableCount(), - layer->start() + 1, layer->stop(), initialCTM); + bound, layer->start() + 1, layer->stop(), initialCTM); atlasCanvas->restore(); } @@ -297,6 +303,7 @@ void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay SkIntToScalar(layer->rect().height())); layerCanvas->clipRect(bound); + layerCanvas->clear(SK_ColorTRANSPARENT); SkMatrix initialCTM; @@ -308,7 +315,7 @@ void GrLayerHoister::DrawLayers(GrContext* context, const SkTDArray<GrHoistedLay SkRecordPartialDraw(*pict->fRecord.get(), layerCanvas, pict->drawablePicts(), pict->drawableCount(), - layer->start()+1, layer->stop(), initialCTM); + bound, layer->start()+1, layer->stop(), initialCTM); layerCanvas->flush(); } diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 3a0d6f4e3a..3f08aa4def 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->clearAll(); \ + this->clear(SK_ColorTRANSPARENT); \ } \ } while (false) \ @@ -294,14 +294,6 @@ 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); @@ -317,6 +309,13 @@ 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); @@ -1515,7 +1514,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->clearAll(); + dev->clear(0x0); } // drawDevice is defined to be in device coords. diff --git a/src/gpu/SkGpuDevice.h b/src/gpu/SkGpuDevice.h index 2fb6de7eb8..f7088e3fa3 100644 --- a/src/gpu/SkGpuDevice.h +++ b/src/gpu/SkGpuDevice.h @@ -65,15 +65,13 @@ 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 848709445d..9ac6d55340 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->clearAll(); + fDevice->clear(0x0); } } diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index 6592ba0c68..fb8df838eb 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -801,6 +801,20 @@ 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 a5af6c7111..41b0234480 100644 --- a/src/pipe/SkGPipeWrite.cpp +++ b/src/pipe/SkGPipeWrite.cpp @@ -233,6 +233,7 @@ 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; @@ -689,6 +690,20 @@ 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 34b9146996..3c845b1d65 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -170,6 +170,8 @@ 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, @@ -739,6 +741,16 @@ 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 6e11fbe6d5..4eeb56c14c 100644 --- a/src/utils/SkGatherPixelRefsAndRects.h +++ b/src/utils/SkGatherPixelRefsAndRects.h @@ -40,6 +40,9 @@ 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 ddd9b927fd..a6722d8364 100644 --- a/src/utils/SkNWayCanvas.cpp +++ b/src/utils/SkNWayCanvas.cpp @@ -134,6 +134,13 @@ 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 2c6b8f56b5..7f9409adac 100644 --- a/src/utils/SkPictureUtils.cpp +++ b/src/utils/SkPictureUtils.cpp @@ -77,6 +77,10 @@ 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 787cf89299..95256e7d13 100644 --- a/src/utils/debugger/SkDebugCanvas.cpp +++ b/src/utils/debugger/SkDebugCanvas.cpp @@ -426,6 +426,10 @@ 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 2c079bd4c3..bdd04aa2db 100644 --- a/src/utils/debugger/SkDebugCanvas.h +++ b/src/utils/debugger/SkDebugCanvas.h @@ -158,6 +158,8 @@ public: // Inherited from SkCanvas //////////////////////////////////////////////////////////////////////////////// + virtual void clear(SkColor) SK_OVERRIDE; + virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) SK_OVERRIDE; |