Chromium Code Reviews| Index: bench/ColorProfileBench.cpp |
| diff --git a/bench/ColorProfileBench.cpp b/bench/ColorProfileBench.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..684695a4084c275f3077b47835402732db8b4071 |
| --- /dev/null |
| +++ b/bench/ColorProfileBench.cpp |
| @@ -0,0 +1,112 @@ |
| +/* |
| + * Copyright 2014 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| +#include "Benchmark.h" |
| +#include "SkCanvas.h" |
| +#include "SkColorProfileFilter.h" |
| +#include "SkGradientShader.h" |
| + |
| +class ColorProfileBench : public Benchmark { |
| + SkISize fSize; |
| + int fCubeDimension; |
| + SkData* fCubeData; |
| + SkBitmap fBitmap; |
| + |
| +public: |
| + ColorProfileBench() |
| + : fCubeDimension(0) |
| + , fCubeData(NULL) { |
| + fSize = SkISize::Make(2880, 1800); // 2014 Macbook Pro resolution |
| + } |
| + |
| + ~ColorProfileBench() { |
| + SkSafeUnref(fCubeData); |
| + } |
| + |
| +protected: |
| + virtual const char* onGetName() SK_OVERRIDE { |
| + return "colorprofile"; |
| + } |
| + |
| + virtual void onPreDraw() SK_OVERRIDE { |
| + if (!SkToBool(fCubeData)) { |
| + this->makeCubeData(); |
| + this->make_bitmap(); |
| + } |
| + } |
| + |
| + virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { |
| + this->test(loops, canvas, 0, 0); |
| + } |
| + |
| + virtual SkIPoint onGetSize() SK_OVERRIDE { |
| + return SkIPoint::Make(fSize.width(), fSize.height()); |
| + } |
| + |
| +private: |
| + static SkShader* MakeLinear(const SkISize& size) { |
| + const SkPoint pts[2] = { |
| + { 0, 0 }, |
| + { SkIntToScalar(size.width()), SkIntToScalar(size.height()) } |
| + }; |
| + static const SkColor colors[] = { SK_ColorYELLOW, SK_ColorBLUE }; |
| + return SkGradientShader::CreateLinear( |
| + pts, colors, NULL, 2, SkShader::kRepeat_TileMode, 0, &SkMatrix::I()); |
| + } |
| + |
| + void make_bitmap() { |
| + fBitmap.allocN32Pixels(fSize.width(), fSize.height()); |
| + SkCanvas canvas(fBitmap); |
|
Stephen White
2014/10/06 16:40:40
Probably not a huge deal, but this will create a r
sugoi1
2014/10/06 17:18:41
Acknowledged. Since we don't know which mode we're
|
| + canvas.clear(0x00000000); |
| + SkPaint paint; |
| + paint.setAntiAlias(true); |
| + SkShader* shader = MakeLinear(fSize); |
| + paint.setShader(shader); |
| + SkRect r = { 0, 0, SkIntToScalar(fSize.width()), SkIntToScalar(fSize.height()) }; |
| + canvas.drawRect(r, paint); |
| + shader->unref(); |
| + } |
| + |
| + void makeCubeData() { |
| + fCubeDimension = 32; |
| + fCubeData = SkData::NewUninitialized(sizeof(SkColor) * |
| + fCubeDimension * fCubeDimension * fCubeDimension); |
| + SkColor* pixels = (SkColor*)(fCubeData->writable_data()); |
| + SkAutoMalloc lutMemory(fCubeDimension); |
| + uint8_t* lut = (uint8_t*)lutMemory.get(); |
| + const int maxIndex = fCubeDimension - 1; |
| + for (int i = 0; i < fCubeDimension; ++i) { |
| + // Make an invert lut, but the content of |
| + // the lut shouldn't affect performance. |
| + lut[i] = ((maxIndex - i) * 255) / maxIndex; |
| + } |
| + for (int r = 0; r < fCubeDimension; ++r) { |
| + for (int g = 0; g < fCubeDimension; ++g) { |
| + for (int b = 0; b < fCubeDimension; ++b) { |
| + pixels[(fCubeDimension * ((fCubeDimension * b) + g)) + r] = |
| + SkColorSetARGB(0xFF, lut[r], lut[g], lut[b]); |
| + } |
| + } |
| + } |
| + } |
| + |
| + void test(const int loops, SkCanvas* canvas, int x, int y) { |
| + SkAutoTUnref<SkColorFilter> colorProfile( |
| + SkColorProfileFilter::Create(fCubeData, fCubeDimension)); |
| + SkPaint paint; |
| + paint.setColorFilter(colorProfile); |
| + |
| + for (int i = 0; i < loops; i++) { |
| + canvas->drawBitmap(fBitmap, 0, 0, &paint); |
| + } |
| + } |
| + |
| + typedef Benchmark INHERITED; |
| +}; |
| + |
| +/////////////////////////////////////////////////////////////////////////////// |
| + |
| +DEF_BENCH( return new ColorProfileBench(); ) |