Chromium Code Reviews| Index: skia/ext/benchmarking_canvas.cc |
| diff --git a/skia/ext/benchmarking_canvas.cc b/skia/ext/benchmarking_canvas.cc |
| index 2af0d1a956ae58292ffe33461c97c39cdde30afd..b2c17288282de130441dd1b17b21e326d08aa681 100644 |
| --- a/skia/ext/benchmarking_canvas.cc |
| +++ b/skia/ext/benchmarking_canvas.cc |
| @@ -6,10 +6,13 @@ |
| #include "base/strings/stringprintf.h" |
| #include "base/time/time.h" |
| #include "skia/ext/benchmarking_canvas.h" |
| +#include "skia/ext/refptr.h" |
| #include "third_party/skia/include/core/SkColorFilter.h" |
| +#include "third_party/skia/include/core/SkDrawFilter.h" |
| #include "third_party/skia/include/core/SkImageFilter.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 +409,54 @@ 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) |
| + }; |
| + |
|
robertphillips
2015/03/10 17:23:41
// TODO: seems like there should be a far faster w
f(malita)
2015/03/10 22:28:32
Refactored to use interpolation instead of table l
|
| + for (size_t i = 0; i < SK_ARRAY_COUNT(gTable) - 1; ++i) { |
| + if (gTable[i] == dst) { |
| + return gTable[i + 1]; |
| + } |
| + } |
| + |
| + return gTable[SK_ARRAY_COUNT(gTable) - 1]; |
| + } |
| + |
| + Factory getFactory() const override { return NULL; } |
| +#ifndef SK_IGNORE_TO_STRING |
| + void toString(SkString* str) const override { str->set("OverdrawXfermode"); } |
| +#endif |
|
robertphillips
2015/03/10 17:23:41
private:
typedef SkXfermode INHERITED;
?
f(malita)
2015/03/10 22:28:32
Done.
|
| +}; |
| + |
| +class OverdrawFilter : public SkDrawFilter { |
| +public: |
| + OverdrawFilter() { fXferMode = skia::AdoptRef(new OverdrawXfermode); } |
| + |
| + bool filter(SkPaint* p, Type) override { |
| + p->setXfermode(fXferMode.get()); |
| + return true; |
| + } |
| + |
| +private: |
| + typedef SkDrawFilter INHERITED; |
| + |
| + skia::RefPtr<SkXfermode> fXferMode; |
| +}; |
| + |
| } // namespace |
| namespace skia { |
| @@ -456,6 +507,11 @@ BenchmarkingCanvas::BenchmarkingCanvas(SkCanvas* canvas, unsigned flags) |
| canvas->imageInfo().height()) |
| , flags_(flags) { |
| addCanvas(canvas); |
| + |
| + if (flags & kOverdrawVisualization_Flag) { |
| + skia::RefPtr<SkDrawFilter> draw_filter = skia::AdoptRef(new OverdrawFilter); |
| + this->setDrawFilter(draw_filter.get()); |
| + } |
| } |
| BenchmarkingCanvas::~BenchmarkingCanvas() { |