| Index: src/utils/debugger/SkDebugCanvas.cpp
|
| diff --git a/src/utils/debugger/SkDebugCanvas.cpp b/src/utils/debugger/SkDebugCanvas.cpp
|
| index 6d186a7ee8b865d28580a2bd0ed5c82bad63b594..4b5e03bf1f7532bd014893e4d2e13a45e0ce9dd0 100644
|
| --- a/src/utils/debugger/SkDebugCanvas.cpp
|
| +++ b/src/utils/debugger/SkDebugCanvas.cpp
|
| @@ -10,19 +10,98 @@
|
| #include "SkColorPriv.h"
|
| #include "SkDebugCanvas.h"
|
| #include "SkDrawCommand.h"
|
| -#include "SkDrawFilter.h"
|
| #include "SkDevice.h"
|
| +#include "SkPaintFilterCanvas.h"
|
| #include "SkXfermode.h"
|
|
|
| +namespace {
|
| +
|
| +class OverdrawXfermode : public SkXfermode {
|
| +public:
|
| + SkPMColor xferColor(SkPMColor src, SkPMColor dst) const override {
|
| + // This table encodes the color progression of the overdraw visualization
|
| + static const SkPMColor gTable[] = {
|
| + SkPackARGB32(0x00, 0x00, 0x00, 0x00),
|
| + SkPackARGB32(0xFF, 128, 158, 255),
|
| + SkPackARGB32(0xFF, 170, 185, 212),
|
| + SkPackARGB32(0xFF, 213, 195, 170),
|
| + SkPackARGB32(0xFF, 255, 192, 127),
|
| + SkPackARGB32(0xFF, 255, 185, 85),
|
| + SkPackARGB32(0xFF, 255, 165, 42),
|
| + SkPackARGB32(0xFF, 255, 135, 0),
|
| + SkPackARGB32(0xFF, 255, 95, 0),
|
| + SkPackARGB32(0xFF, 255, 50, 0),
|
| + SkPackARGB32(0xFF, 255, 0, 0)
|
| + };
|
| +
|
| +
|
| + int idx;
|
| + if (SkColorGetR(dst) < 64) { // 0
|
| + idx = 0;
|
| + } else if (SkColorGetG(dst) < 25) { // 10
|
| + idx = 9; // cap at 9 for upcoming increment
|
| + } else if ((SkColorGetB(dst)+21)/42 > 0) { // 1-6
|
| + idx = 7 - (SkColorGetB(dst)+21)/42;
|
| + } else { // 7-9
|
| + idx = 10 - (SkColorGetG(dst)+22)/45;
|
| + }
|
| + ++idx;
|
| + SkASSERT(idx < (int)SK_ARRAY_COUNT(gTable));
|
| +
|
| + return gTable[idx];
|
| + }
|
| +
|
| + Factory getFactory() const override { return NULL; }
|
| +#ifndef SK_IGNORE_TO_STRING
|
| + virtual void toString(SkString* str) const override { str->set("OverdrawXfermode"); }
|
| +#endif
|
| +};
|
| +
|
| +class DebugPaintFilterCanvas : public SkPaintFilterCanvas {
|
| +public:
|
| + DebugPaintFilterCanvas(int width, int height, bool overdrawViz, bool overrideFilterQuality,
|
| + SkFilterQuality quality)
|
| + : INHERITED(width, height)
|
| + , fOverdrawXfermode(overdrawViz ? SkNEW(OverdrawXfermode) : NULL)
|
| + , fOverrideFilterQuality(overrideFilterQuality)
|
| + , fFilterQuality(quality) { }
|
| +
|
| +protected:
|
| + void onFilterPaint(SkPaint* paint, Type) const override {
|
| + if (NULL != fOverdrawXfermode.get()) {
|
| + paint->setAntiAlias(false);
|
| + paint->setXfermode(fOverdrawXfermode.get());
|
| + }
|
| +
|
| + if (fOverrideFilterQuality) {
|
| + paint->setFilterQuality(fFilterQuality);
|
| + }
|
| + }
|
| +
|
| + void onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) {
|
| + // We need to replay the picture onto this canvas in order to filter its internal paints.
|
| + this->SkCanvas::onDrawPicture(picture, matrix, paint);
|
| + }
|
| +
|
| +private:
|
| + SkAutoTUnref<SkXfermode> fOverdrawXfermode;
|
| +
|
| + bool fOverrideFilterQuality;
|
| + SkFilterQuality fFilterQuality;
|
| +
|
| + typedef SkPaintFilterCanvas INHERITED;
|
| +};
|
| +
|
| +}
|
| +
|
| SkDebugCanvas::SkDebugCanvas(int width, int height)
|
| : INHERITED(width, height)
|
| , fPicture(NULL)
|
| , fFilter(false)
|
| , fMegaVizMode(false)
|
| , fOverdrawViz(false)
|
| - , fOverdrawFilter(NULL)
|
| - , fOverrideTexFiltering(false)
|
| - , fTexOverrideFilter(NULL) {
|
| + , fOverrideFilterQuality(false)
|
| + , fFilterQuality(kNone_SkFilterQuality) {
|
| fUserMatrix.reset();
|
|
|
| // SkPicturePlayback uses the base-class' quickReject calls to cull clipped
|
| @@ -46,8 +125,6 @@ SkDebugCanvas::SkDebugCanvas(int width, int height)
|
|
|
| SkDebugCanvas::~SkDebugCanvas() {
|
| fCommandVector.deleteAll();
|
| - SkSafeUnref(fOverdrawFilter);
|
| - SkSafeUnref(fTexOverrideFilter);
|
| }
|
|
|
| void SkDebugCanvas::addDrawCommand(SkDrawCommand* command) {
|
| @@ -88,93 +165,6 @@ int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
|
| return layer;
|
| }
|
|
|
| -class OverdrawXfermode : public SkXfermode {
|
| -public:
|
| - SkPMColor xferColor(SkPMColor src, SkPMColor dst) const override {
|
| - // This table encodes the color progression of the overdraw visualization
|
| - static const SkPMColor gTable[] = {
|
| - SkPackARGB32(0x00, 0x00, 0x00, 0x00),
|
| - SkPackARGB32(0xFF, 128, 158, 255),
|
| - SkPackARGB32(0xFF, 170, 185, 212),
|
| - SkPackARGB32(0xFF, 213, 195, 170),
|
| - SkPackARGB32(0xFF, 255, 192, 127),
|
| - SkPackARGB32(0xFF, 255, 185, 85),
|
| - SkPackARGB32(0xFF, 255, 165, 42),
|
| - SkPackARGB32(0xFF, 255, 135, 0),
|
| - SkPackARGB32(0xFF, 255, 95, 0),
|
| - SkPackARGB32(0xFF, 255, 50, 0),
|
| - SkPackARGB32(0xFF, 255, 0, 0)
|
| - };
|
| -
|
| -
|
| - int idx;
|
| - if (SkColorGetR(dst) < 64) { // 0
|
| - idx = 0;
|
| - } else if (SkColorGetG(dst) < 25) { // 10
|
| - idx = 9; // cap at 9 for upcoming increment
|
| - } else if ((SkColorGetB(dst)+21)/42 > 0) { // 1-6
|
| - idx = 7 - (SkColorGetB(dst)+21)/42;
|
| - } else { // 7-9
|
| - idx = 10 - (SkColorGetG(dst)+22)/45;
|
| - }
|
| - ++idx;
|
| - SkASSERT(idx < (int)SK_ARRAY_COUNT(gTable));
|
| -
|
| - return gTable[idx];
|
| - }
|
| -
|
| - Factory getFactory() const override { return NULL; }
|
| -#ifndef SK_IGNORE_TO_STRING
|
| - virtual void toString(SkString* str) const override { str->set("OverdrawXfermode"); }
|
| -#endif
|
| -};
|
| -
|
| -class SkOverdrawFilter : public SkDrawFilter {
|
| -public:
|
| - SkOverdrawFilter() {
|
| - fXferMode = SkNEW(OverdrawXfermode);
|
| - }
|
| -
|
| - virtual ~SkOverdrawFilter() {
|
| - delete fXferMode;
|
| - }
|
| -
|
| - bool filter(SkPaint* p, Type) override {
|
| - p->setXfermode(fXferMode);
|
| - p->setAntiAlias(false);
|
| - return true;
|
| - }
|
| -
|
| -protected:
|
| - SkXfermode* fXferMode;
|
| -
|
| -private:
|
| - typedef SkDrawFilter INHERITED;
|
| -};
|
| -
|
| -// SkTexOverrideFilter modifies every paint to use the specified
|
| -// texture filtering mode
|
| -class SkTexOverrideFilter : public SkDrawFilter {
|
| -public:
|
| - SkTexOverrideFilter() : fFilterQuality(kNone_SkFilterQuality) {
|
| - }
|
| -
|
| - void setFilterQuality(SkFilterQuality filterQuality) {
|
| - fFilterQuality = filterQuality;
|
| - }
|
| -
|
| - bool filter(SkPaint* p, Type) override {
|
| - p->setFilterQuality(fFilterQuality);
|
| - return true;
|
| - }
|
| -
|
| -protected:
|
| - SkFilterQuality fFilterQuality;
|
| -
|
| -private:
|
| - typedef SkDrawFilter INHERITED;
|
| -};
|
| -
|
| class SkDebugClipVisitor : public SkCanvas::ClipVisitor {
|
| public:
|
| SkDebugClipVisitor(SkCanvas* canvas) : fCanvas(canvas) {}
|
| @@ -250,28 +240,9 @@ void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
|
| }
|
| this->applyUserTransform(canvas);
|
|
|
| - // The setting of the draw filter has to go here (rather than in
|
| - // SkRasterWidget) due to the canvas restores this class performs.
|
| - // Since the draw filter is stored in the layer stack if we
|
| - // call setDrawFilter on anything but the root layer odd things happen.
|
| - if (fOverdrawViz) {
|
| - if (NULL == fOverdrawFilter) {
|
| - fOverdrawFilter = new SkOverdrawFilter;
|
| - }
|
| -
|
| - if (fOverdrawFilter != canvas->getDrawFilter()) {
|
| - canvas->setDrawFilter(fOverdrawFilter);
|
| - }
|
| - } else if (fOverrideTexFiltering) {
|
| - if (NULL == fTexOverrideFilter) {
|
| - fTexOverrideFilter = new SkTexOverrideFilter;
|
| - }
|
| -
|
| - if (fTexOverrideFilter != canvas->getDrawFilter()) {
|
| - canvas->setDrawFilter(fTexOverrideFilter);
|
| - }
|
| - } else {
|
| - canvas->setDrawFilter(NULL);
|
| + if (fPaintFilterCanvas) {
|
| + fPaintFilterCanvas->addCanvas(canvas);
|
| + canvas = fPaintFilterCanvas.get();
|
| }
|
|
|
| if (fMegaVizMode) {
|
| @@ -342,6 +313,10 @@ void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
|
| }
|
|
|
| canvas->restoreToCount(saveCount);
|
| +
|
| + if (fPaintFilterCanvas) {
|
| + fPaintFilterCanvas->removeAll();
|
| + }
|
| }
|
|
|
| void SkDebugCanvas::deleteDrawCommandAt(int index) {
|
| @@ -379,13 +354,37 @@ SkTDArray <SkDrawCommand*>& SkDebugCanvas::getDrawCommands() {
|
| return fCommandVector;
|
| }
|
|
|
| +void SkDebugCanvas::updatePaintFilterCanvas() {
|
| + if (!fOverdrawViz && !fOverrideFilterQuality) {
|
| + fPaintFilterCanvas.reset(NULL);
|
| + return;
|
| + }
|
| +
|
| + const SkImageInfo info = this->imageInfo();
|
| + fPaintFilterCanvas.reset(SkNEW_ARGS(DebugPaintFilterCanvas, (info.width(),
|
| + info.height(),
|
| + fOverdrawViz,
|
| + fOverrideFilterQuality,
|
| + fFilterQuality)));
|
| +}
|
| +
|
| +void SkDebugCanvas::setOverdrawViz(bool overdrawViz) {
|
| + if (fOverdrawViz == overdrawViz) {
|
| + return;
|
| + }
|
| +
|
| + fOverdrawViz = overdrawViz;
|
| + this->updatePaintFilterCanvas();
|
| +}
|
| +
|
| void SkDebugCanvas::overrideTexFiltering(bool overrideTexFiltering, SkFilterQuality quality) {
|
| - if (NULL == fTexOverrideFilter) {
|
| - fTexOverrideFilter = new SkTexOverrideFilter;
|
| + if (fOverrideFilterQuality == overrideTexFiltering && fFilterQuality == quality) {
|
| + return;
|
| }
|
|
|
| - fOverrideTexFiltering = overrideTexFiltering;
|
| - fTexOverrideFilter->setFilterQuality(quality);
|
| + fOverrideFilterQuality = overrideTexFiltering;
|
| + fFilterQuality = quality;
|
| + this->updatePaintFilterCanvas();
|
| }
|
|
|
| void SkDebugCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
|
|
|