Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(637)

Unified Diff: skia/ext/benchmarking_canvas.cc

Issue 993893004: Add back overdraw visualization for Skia BenchmarkingCanvas (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: no need for SkScalar Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « skia/ext/benchmarking_canvas.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: skia/ext/benchmarking_canvas.cc
diff --git a/skia/ext/benchmarking_canvas.cc b/skia/ext/benchmarking_canvas.cc
index 2af0d1a956ae58292ffe33461c97c39cdde30afd..57bd70d027d0824ce8caaaa657bccc7c91cb5440 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,35 @@ scoped_ptr<base::Value> AsListValue(const T array[], size_t count) {
return val.Pass();
}
robertphillips 2015/03/11 14:07:47 // Comment maybe ? // This filter works by ...
f(malita) 2015/03/11 14:45:48 Switched back to the color-table approach.
+class OverdrawXfermode : public SkXfermode {
+public:
+ SkPMColor xferColor(SkPMColor, SkPMColor dst) const override {
+ // Interpolate between kStartColor & kEndColor,
+ // adding kRate weight for each overdraw.
+ const SkPMColor kStartColor = SkPackARGB32(0xFF, 0x80, 0x80, 0xFF);
+ const SkPMColor kEndColor = SkPackARGB32(0xFF, 0xFF, 0, 0);
+ const float kRate = 0.1f;
+
+ float weight = 0.f;
+ if (SkGetPackedR32(dst) >= SkGetPackedR16(kStartColor)) {
+ weight = (float)(SkGetPackedR32(dst) - SkGetPackedR32(kStartColor)) /
+ (SkGetPackedR32(kEndColor) - SkGetPackedR32(kStartColor));
+ weight = std::min(weight + kRate, 1.f);
+ }
+
+ return SkFourByteInterp(kEndColor, kStartColor,
+ SkScalarRoundToInt(weight * 255));
+ }
+
+ Factory getFactory() const override { return NULL; }
+#ifndef SK_IGNORE_TO_STRING
+ void toString(SkString* str) const override { str->set("OverdrawXfermode"); }
+#endif
+
+private:
+ typedef SkXfermode INHERITED;
+};
+
} // namespace
namespace skia {
@@ -416,7 +447,8 @@ public:
const SkPaint* paint = nullptr)
: canvas_(canvas)
, op_record_(new base::DictionaryValue())
- , op_params_(new base::ListValue()) {
+ , op_params_(new base::ListValue())
robertphillips 2015/03/11 14:07:47 What guarantees is the caller providing regarding
f(malita) 2015/03/11 14:45:48 AutoOp objects are always scoped within a given dr
+ , paint_(paint) {
DCHECK(canvas);
DCHECK(op_name);
@@ -424,9 +456,16 @@ public:
op_record_->SetString("cmd_string", op_name);
op_record_->Set("info", op_params_);
- if (paint)
+ if (paint) {
this->addParam("paint", AsValue(*paint));
robertphillips 2015/03/11 14:07:47 I think even if the op has no paint you need to cr
f(malita) 2015/03/11 14:45:48 Good catch, done.
+ if (canvas->flags_ & kOverdrawVisualization_Flag) {
+ DCHECK(canvas->overdraw_xfermode_);
+ paint_ = filtered_paint_.set(*paint);
+ filtered_paint_.get()->setXfermode(canvas->overdraw_xfermode_.get());
robertphillips 2015/03/11 14:07:47 Should disable AA in here too.
f(malita) 2015/03/11 14:45:49 Done.
+ }
+ }
+
start_ticks_ = base::TimeTicks::Now();
}
@@ -444,11 +483,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 +500,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 +540,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 +611,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 +620,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 +650,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 +669,7 @@ void BenchmarkingCanvas::onDrawPicture(const SkPicture* picture,
if (matrix)
op.addParam("matrix", AsValue(*matrix));
- INHERITED::onDrawPicture(picture, matrix, paint);
+ INHERITED::onDrawPicture(picture, matrix, op.paint());
}
void BenchmarkingCanvas::onDrawBitmap(const SkBitmap& bitmap,
@@ -636,7 +681,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 +695,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 +708,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 +720,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 +732,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 +742,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 +753,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 +764,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 +777,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 +789,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 +800,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
« no previous file with comments | « skia/ext/benchmarking_canvas.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698