| Index: skia/ext/benchmarking_canvas.cc
|
| diff --git a/skia/ext/benchmarking_canvas.cc b/skia/ext/benchmarking_canvas.cc
|
| index 0dd6949d5caf7b5a34cb45cd629e651441628821..dbe851ab7118c6222009f8842696f2eb19ed9cfd 100644
|
| --- a/skia/ext/benchmarking_canvas.cc
|
| +++ b/skia/ext/benchmarking_canvas.cc
|
| @@ -8,8 +8,10 @@
|
| #include "skia/ext/benchmarking_canvas.h"
|
| #include "third_party/skia/include/core/SkColorFilter.h"
|
| #include "third_party/skia/include/core/SkImageFilter.h"
|
| +#include "third_party/skia/include/core/SkTLazy.h"
|
| #include "third_party/skia/include/core/SkPicture.h"
|
| #include "third_party/skia/include/core/SkRegion.h"
|
| +#include "third_party/skia/include/core/SkString.h"
|
| #include "third_party/skia/include/core/SkTextBlob.h"
|
| #include "third_party/skia/include/core/SkXfermode.h"
|
|
|
| @@ -406,6 +408,47 @@ scoped_ptr<base::Value> AsListValue(const T array[], size_t count) {
|
| return val.Pass();
|
| }
|
|
|
| +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)
|
| + };
|
| +
|
| + size_t 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 < SK_ARRAY_COUNT(gTable));
|
| +
|
| + return gTable[idx];
|
| + }
|
| +
|
| + Factory getFactory() const override { return NULL; }
|
| +#ifndef SK_IGNORE_TO_STRING
|
| + void toString(SkString* str) const override { str->set("OverdrawXfermode"); }
|
| +#endif
|
| +};
|
| +
|
| } // namespace
|
|
|
| namespace skia {
|
| @@ -416,7 +459,10 @@ public:
|
| const SkPaint* paint = nullptr)
|
| : canvas_(canvas)
|
| , op_record_(new base::DictionaryValue())
|
| - , op_params_(new base::ListValue()) {
|
| + , op_params_(new base::ListValue())
|
| + // AutoOp objects are always scoped within draw call frames,
|
| + // so the paint is guaranteed to be valid for their lifetime.
|
| + , paint_(paint) {
|
|
|
| DCHECK(canvas);
|
| DCHECK(op_name);
|
| @@ -427,6 +473,14 @@ public:
|
| if (paint)
|
| this->addParam("paint", AsValue(*paint));
|
|
|
| + if (canvas->flags_ & kOverdrawVisualization_Flag) {
|
| + DCHECK(canvas->overdraw_xfermode_);
|
| +
|
| + paint_ = paint ? filtered_paint_.set(*paint) : filtered_paint_.init();
|
| + filtered_paint_.get()->setXfermode(canvas->overdraw_xfermode_.get());
|
| + filtered_paint_.get()->setAntiAlias(false);
|
| + }
|
| +
|
| start_ticks_ = base::TimeTicks::Now();
|
| }
|
|
|
| @@ -444,11 +498,16 @@ public:
|
| op_params_->Append(param.release());
|
| }
|
|
|
| + const SkPaint* paint() const { return paint_; }
|
| +
|
| private:
|
| BenchmarkingCanvas* canvas_;
|
| base::DictionaryValue* op_record_;
|
| base::ListValue* op_params_;
|
| base::TimeTicks start_ticks_;
|
| +
|
| + const SkPaint* paint_;
|
| + SkTLazy<SkPaint> filtered_paint_;
|
| };
|
|
|
| BenchmarkingCanvas::BenchmarkingCanvas(SkCanvas* canvas, unsigned flags)
|
| @@ -456,6 +515,9 @@ BenchmarkingCanvas::BenchmarkingCanvas(SkCanvas* canvas, unsigned flags)
|
| canvas->imageInfo().height())
|
| , flags_(flags) {
|
| addCanvas(canvas);
|
| +
|
| + if (flags & kOverdrawVisualization_Flag)
|
| + overdraw_xfermode_ = AdoptRef(new OverdrawXfermode);
|
| }
|
|
|
| BenchmarkingCanvas::~BenchmarkingCanvas() {
|
| @@ -493,12 +555,10 @@ SkCanvas::SaveLayerStrategy BenchmarkingCanvas::willSaveLayer(const SkRect* rect
|
| AutoOp op(this, "SaveLayer", paint);
|
| if (rect)
|
| op.addParam("bounds", AsValue(*rect));
|
| - if (paint)
|
| - op.addParam("paint", AsValue(*paint));
|
| if (flags)
|
| op.addParam("flags", AsValue(flags));
|
|
|
| - return INHERITED::willSaveLayer(rect, paint, flags);
|
| + return INHERITED::willSaveLayer(rect, op.paint(), flags);
|
| }
|
|
|
| void BenchmarkingCanvas::willRestore() {
|
| @@ -566,7 +626,7 @@ void BenchmarkingCanvas::onClipRegion(const SkRegion& region,
|
| void BenchmarkingCanvas::onDrawPaint(const SkPaint& paint) {
|
| AutoOp op(this, "DrawPaint", &paint);
|
|
|
| - INHERITED::onDrawPaint(paint);
|
| + INHERITED::onDrawPaint(*op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawPoints(PointMode mode, size_t count,
|
| @@ -575,28 +635,28 @@ void BenchmarkingCanvas::onDrawPoints(PointMode mode, size_t count,
|
| op.addParam("mode", AsValue(mode));
|
| op.addParam("points", AsListValue(pts, count));
|
|
|
| - INHERITED::onDrawPoints(mode, count, pts, paint);
|
| + INHERITED::onDrawPoints(mode, count, pts, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
|
| AutoOp op(this, "DrawRect", &paint);
|
| op.addParam("rect", AsValue(rect));
|
|
|
| - INHERITED::onDrawRect(rect, paint);
|
| + INHERITED::onDrawRect(rect, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
|
| AutoOp op(this, "DrawOval", &paint);
|
| op.addParam("rect", AsValue(rect));
|
|
|
| - INHERITED::onDrawOval(rect, paint);
|
| + INHERITED::onDrawOval(rect, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
|
| AutoOp op(this, "DrawRRect", &paint);
|
| op.addParam("rrect", AsValue(rrect));
|
|
|
| - INHERITED::onDrawRRect(rrect, paint);
|
| + INHERITED::onDrawRRect(rrect, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
|
| @@ -605,14 +665,14 @@ void BenchmarkingCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner
|
| op.addParam("outer", AsValue(outer));
|
| op.addParam("inner", AsValue(inner));
|
|
|
| - INHERITED::onDrawDRRect(outer, inner, paint);
|
| + INHERITED::onDrawDRRect(outer, inner, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
|
| AutoOp op(this, "DrawPath", &paint);
|
| op.addParam("path", AsValue(path));
|
|
|
| - INHERITED::onDrawPath(path, paint);
|
| + INHERITED::onDrawPath(path, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawPicture(const SkPicture* picture,
|
| @@ -624,7 +684,7 @@ void BenchmarkingCanvas::onDrawPicture(const SkPicture* picture,
|
| if (matrix)
|
| op.addParam("matrix", AsValue(*matrix));
|
|
|
| - INHERITED::drawPicture(picture, matrix, paint);
|
| + INHERITED::onDrawPicture(picture, matrix, op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawBitmap(const SkBitmap& bitmap,
|
| @@ -636,7 +696,7 @@ void BenchmarkingCanvas::onDrawBitmap(const SkBitmap& bitmap,
|
| op.addParam("left", AsValue(left));
|
| op.addParam("top", AsValue(top));
|
|
|
| - INHERITED::onDrawBitmap(bitmap, left, top, paint);
|
| + INHERITED::onDrawBitmap(bitmap, left, top, op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawBitmapRect(const SkBitmap& bitmap,
|
| @@ -650,7 +710,7 @@ void BenchmarkingCanvas::onDrawBitmapRect(const SkBitmap& bitmap,
|
| op.addParam("src", AsValue(*src));
|
| op.addParam("dst", AsValue(dst));
|
|
|
| - INHERITED::onDrawBitmapRect(bitmap, src, dst, paint, flags);
|
| + INHERITED::onDrawBitmapRect(bitmap, src, dst, op.paint(), flags);
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawImage(const SkImage* image,
|
| @@ -663,7 +723,7 @@ void BenchmarkingCanvas::onDrawImage(const SkImage* image,
|
| op.addParam("left", AsValue(left));
|
| op.addParam("top", AsValue(top));
|
|
|
| - INHERITED::onDrawImage(image, left, top, paint);
|
| + INHERITED::onDrawImage(image, left, top, op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawImageRect(const SkImage* image, const SkRect* src,
|
| @@ -675,7 +735,7 @@ void BenchmarkingCanvas::onDrawImageRect(const SkImage* image, const SkRect* src
|
| op.addParam("src", AsValue(*src));
|
| op.addParam("dst", AsValue(dst));
|
|
|
| - INHERITED::onDrawImageRect(image, src, dst, paint);
|
| + INHERITED::onDrawImageRect(image, src, dst, op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawBitmapNine(const SkBitmap& bitmap,
|
| @@ -687,7 +747,7 @@ void BenchmarkingCanvas::onDrawBitmapNine(const SkBitmap& bitmap,
|
| op.addParam("center", AsValue(SkRect::Make(center)));
|
| op.addParam("dst", AsValue(dst));
|
|
|
| - INHERITED::onDrawBitmapNine(bitmap, center, dst, paint);
|
| + INHERITED::onDrawBitmapNine(bitmap, center, dst, op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawSprite(const SkBitmap& bitmap, int left, int top,
|
| @@ -697,7 +757,7 @@ void BenchmarkingCanvas::onDrawSprite(const SkBitmap& bitmap, int left, int top,
|
| op.addParam("left", AsValue(SkIntToScalar(left)));
|
| op.addParam("top", AsValue(SkIntToScalar(top)));
|
|
|
| - INHERITED::onDrawSprite(bitmap, left, top, paint);
|
| + INHERITED::onDrawSprite(bitmap, left, top, op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawText(const void* text, size_t byteLength,
|
| @@ -708,7 +768,7 @@ void BenchmarkingCanvas::onDrawText(const void* text, size_t byteLength,
|
| op.addParam("x", AsValue(x));
|
| op.addParam("y", AsValue(y));
|
|
|
| - INHERITED::onDrawText(text, byteLength, x, y, paint);
|
| + INHERITED::onDrawText(text, byteLength, x, y, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawPosText(const void* text, size_t byteLength,
|
| @@ -719,7 +779,7 @@ void BenchmarkingCanvas::onDrawPosText(const void* text, size_t byteLength,
|
| op.addParam("count", AsValue(SkIntToScalar(count)));
|
| op.addParam("pos", AsListValue(pos, count));
|
|
|
| - INHERITED::onDrawPosText(text, byteLength, pos, paint);
|
| + INHERITED::onDrawPosText(text, byteLength, pos, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawPosTextH(const void* text, size_t byteLength,
|
| @@ -732,7 +792,7 @@ void BenchmarkingCanvas::onDrawPosTextH(const void* text, size_t byteLength,
|
| op.addParam("count", AsValue(SkIntToScalar(count)));
|
| op.addParam("pos", AsListValue(xpos, count));
|
|
|
| - INHERITED::onDrawPosTextH(text, byteLength, xpos, constY, paint);
|
| + INHERITED::onDrawPosTextH(text, byteLength, xpos, constY, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawTextOnPath(const void* text, size_t byteLength,
|
| @@ -744,7 +804,7 @@ void BenchmarkingCanvas::onDrawTextOnPath(const void* text, size_t byteLength,
|
| if (matrix)
|
| op.addParam("matrix", AsValue(*matrix));
|
|
|
| - INHERITED::onDrawTextOnPath(text, byteLength, path, matrix, paint);
|
| + INHERITED::onDrawTextOnPath(text, byteLength, path, matrix, *op.paint());
|
| }
|
|
|
| void BenchmarkingCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
|
| @@ -755,7 +815,7 @@ void BenchmarkingCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkSc
|
| op.addParam("x", AsValue(x));
|
| op.addParam("y", AsValue(y));
|
|
|
| - INHERITED::onDrawTextBlob(blob, x, y, paint);
|
| + INHERITED::onDrawTextBlob(blob, x, y, *op.paint());
|
| }
|
|
|
| } // namespace skia
|
|
|