BitmapRectBench.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * Copyright 2011 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/SkBitmap.h"
  9. #include "include/core/SkCanvas.h"
  10. #include "include/core/SkColorPriv.h"
  11. #include "include/core/SkPaint.h"
  12. #include "include/core/SkString.h"
  13. #include "include/private/SkTo.h"
  14. #include "include/utils/SkRandom.h"
  15. static void draw_into_bitmap(const SkBitmap& bm) {
  16. const int w = bm.width();
  17. const int h = bm.height();
  18. SkCanvas canvas(bm);
  19. SkPaint p;
  20. p.setAntiAlias(true);
  21. p.setColor(SK_ColorRED);
  22. canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
  23. SkIntToScalar(SkMin32(w, h))*3/8, p);
  24. SkRect r;
  25. r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
  26. p.setStyle(SkPaint::kStroke_Style);
  27. p.setStrokeWidth(SkIntToScalar(4));
  28. p.setColor(SK_ColorBLUE);
  29. canvas.drawRect(r, p);
  30. }
  31. /* Variants for bitmaprect
  32. src : entire bitmap, subset, fractional subset
  33. dst : same size as src, diff size
  34. paint : filter-p
  35. */
  36. class BitmapRectBench : public Benchmark {
  37. SkBitmap fBitmap;
  38. bool fSlightMatrix;
  39. uint8_t fAlpha;
  40. SkFilterQuality fFilterQuality;
  41. SkString fName;
  42. SkRect fSrcR, fDstR;
  43. static const int kWidth = 128;
  44. static const int kHeight = 128;
  45. public:
  46. BitmapRectBench(U8CPU alpha, SkFilterQuality filterQuality,
  47. bool slightMatrix) {
  48. fAlpha = SkToU8(alpha);
  49. fFilterQuality = filterQuality;
  50. fSlightMatrix = slightMatrix;
  51. fBitmap.setInfo(SkImageInfo::MakeN32Premul(kWidth, kHeight));
  52. }
  53. protected:
  54. const char* onGetName() override {
  55. fName.printf("bitmaprect_%02X_%sfilter_%s",
  56. fAlpha,
  57. kNone_SkFilterQuality == fFilterQuality ? "no" : "",
  58. fSlightMatrix ? "trans" : "identity");
  59. return fName.c_str();
  60. }
  61. void onDelayedSetup() override {
  62. fBitmap.allocPixels();
  63. fBitmap.setAlphaType(kOpaque_SkAlphaType);
  64. fBitmap.eraseColor(SK_ColorBLACK);
  65. draw_into_bitmap(fBitmap);
  66. fSrcR.iset(0, 0, kWidth, kHeight);
  67. fDstR.iset(0, 0, kWidth, kHeight);
  68. if (fSlightMatrix) {
  69. // want fractional translate
  70. fDstR.offset(SK_Scalar1 / 3, SK_Scalar1 * 5 / 7);
  71. // want enough to create a scale matrix, but not enough to scare
  72. // off our sniffer which tries to see if the matrix is "effectively"
  73. // translate-only.
  74. fDstR.fRight += SK_Scalar1 / (kWidth * 60);
  75. }
  76. }
  77. void onDraw(int loops, SkCanvas* canvas) override {
  78. SkRandom rand;
  79. SkPaint paint;
  80. this->setupPaint(&paint);
  81. paint.setFilterQuality(fFilterQuality);
  82. paint.setAlpha(fAlpha);
  83. for (int i = 0; i < loops; i++) {
  84. canvas->drawBitmapRect(fBitmap, fSrcR, fDstR, &paint,
  85. SkCanvas::kStrict_SrcRectConstraint);
  86. }
  87. }
  88. private:
  89. typedef Benchmark INHERITED;
  90. };
  91. DEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, false))
  92. DEF_BENCH(return new BitmapRectBench(0x80, kNone_SkFilterQuality, false))
  93. DEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, false))
  94. DEF_BENCH(return new BitmapRectBench(0x80, kLow_SkFilterQuality, false))
  95. DEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, true))
  96. DEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, true))