PremulAndUnpremulAlphaOpsBench.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright 2013 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "bench/Benchmark.h"
  8. #include "include/core/SkCanvas.h"
  9. #include "include/core/SkString.h"
  10. #include "tools/ToolUtils.h"
  11. class PremulAndUnpremulAlphaOpsBench : public Benchmark {
  12. enum {
  13. W = 256,
  14. H = 256,
  15. };
  16. SkBitmap fBmp1, fBmp2;
  17. public:
  18. PremulAndUnpremulAlphaOpsBench(SkColorType ct) {
  19. fColorType = ct;
  20. fName.printf("premul_and_unpremul_alpha_%s", ToolUtils::colortype_name(ct));
  21. }
  22. protected:
  23. const char* onGetName() override {
  24. return fName.c_str();
  25. }
  26. void onDelayedSetup() override {
  27. SkImageInfo info = SkImageInfo::Make(W, H, fColorType, kUnpremul_SkAlphaType);
  28. fBmp1.allocPixels(info); // used in writePixels
  29. for (int h = 0; h < H; ++h) {
  30. for (int w = 0; w < W; ++w) {
  31. // SkColor places A in the right slot for either RGBA or BGRA
  32. *fBmp1.getAddr32(w, h) = SkColorSetARGB(h & 0xFF, w & 0xFF, w & 0xFF, w & 0xFF);
  33. }
  34. }
  35. fBmp2.allocPixels(info); // used in readPixels()
  36. }
  37. void onDraw(int loops, SkCanvas* canvas) override {
  38. canvas->clear(SK_ColorBLACK);
  39. for (int loop = 0; loop < loops; ++loop) {
  40. // Unpremul -> Premul
  41. canvas->writePixels(fBmp1.info(), fBmp1.getPixels(), fBmp1.rowBytes(), 0, 0);
  42. // Premul -> Unpremul
  43. canvas->readPixels(fBmp2.info(), fBmp2.getPixels(), fBmp2.rowBytes(), 0, 0);
  44. }
  45. }
  46. private:
  47. SkColorType fColorType;
  48. SkString fName;
  49. typedef Benchmark INHERITED;
  50. };
  51. DEF_BENCH(return new PremulAndUnpremulAlphaOpsBench(kRGBA_8888_SkColorType));
  52. DEF_BENCH(return new PremulAndUnpremulAlphaOpsBench(kBGRA_8888_SkColorType));