TileBench.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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/SkBitmap.h"
  9. #include "include/core/SkCanvas.h"
  10. #include "include/core/SkShader.h"
  11. #include "include/core/SkString.h"
  12. static void create_gradient(SkBitmap* bm) {
  13. SkASSERT(1 == bm->width());
  14. const int height = bm->height();
  15. float deltaB = 255.0f / height;
  16. float blue = 255.0f;
  17. for (int y = 0; y < height; y++) {
  18. *bm->getAddr32(0, y) = SkColorSetRGB(0, 0, (U8CPU) blue);
  19. blue -= deltaB;
  20. }
  21. }
  22. // Test out the special case of a tiled 1xN texture. Test out opacity,
  23. // filtering and the different tiling modes
  24. class ConstXTileBench : public Benchmark {
  25. SkPaint fPaint;
  26. SkString fName;
  27. bool fDoFilter;
  28. bool fDoTrans;
  29. bool fDoScale;
  30. static const int kWidth = 1;
  31. static const int kHeight = 300;
  32. public:
  33. ConstXTileBench(SkTileMode xTile,
  34. SkTileMode yTile,
  35. bool doFilter,
  36. bool doTrans,
  37. bool doScale)
  38. : fDoFilter(doFilter)
  39. , fDoTrans(doTrans)
  40. , fDoScale(doScale) {
  41. SkBitmap bm;
  42. bm.allocN32Pixels(kWidth, kHeight, true);
  43. bm.eraseColor(SK_ColorWHITE);
  44. create_gradient(&bm);
  45. fPaint.setShader(bm.makeShader(xTile, yTile));
  46. fName.printf("constXTile_");
  47. static const char* gTileModeStr[kSkTileModeCount] = { "C", "R", "M", "D" };
  48. fName.append(gTileModeStr[(unsigned)xTile]);
  49. fName.append(gTileModeStr[(unsigned)yTile]);
  50. if (doFilter) {
  51. fName.append("_filter");
  52. }
  53. if (doTrans) {
  54. fName.append("_trans");
  55. }
  56. if (doScale) {
  57. fName.append("_scale");
  58. }
  59. }
  60. protected:
  61. virtual const char* onGetName() {
  62. return fName.c_str();
  63. }
  64. virtual void onDraw(int loops, SkCanvas* canvas) {
  65. SkPaint paint(fPaint);
  66. this->setupPaint(&paint);
  67. paint.setFilterQuality(fDoFilter ? kLow_SkFilterQuality
  68. : kNone_SkFilterQuality);
  69. if (fDoTrans) {
  70. paint.setColor(SkColorSetARGB(0x80, 0xFF, 0xFF, 0xFF));
  71. }
  72. SkRect r;
  73. if (fDoScale) {
  74. r = SkRect::MakeWH(SkIntToScalar(2 * 640), SkIntToScalar(2 * 480));
  75. canvas->scale(SK_ScalarHalf, SK_ScalarHalf);
  76. } else {
  77. r = SkRect::MakeWH(SkIntToScalar(640), SkIntToScalar(480));
  78. }
  79. SkPaint bgPaint;
  80. bgPaint.setColor(SK_ColorWHITE);
  81. for (int i = 0; i < loops; i++) {
  82. if (fDoTrans) {
  83. canvas->drawRect(r, bgPaint);
  84. }
  85. canvas->drawRect(r, paint);
  86. }
  87. }
  88. private:
  89. typedef Benchmark INHERITED;
  90. };
  91. // Scaled benches are trending towards free. Seems like caching.
  92. // TODO(mtklein, reed): fix and reenable
  93. //DEF_BENCH(return new ConstXTileBench(SkTileMode::kRepeat, SkTileMode::kRepeat, false, false, true))
  94. DEF_BENCH(return new ConstXTileBench(SkTileMode::kClamp, SkTileMode::kClamp, false, false, false))
  95. //DEF_BENCH(return new ConstXTileBench(SkTileMode::kMirror, SkTileMode::kMirror, false, false, true))
  96. DEF_BENCH(return new ConstXTileBench(SkTileMode::kRepeat, SkTileMode::kRepeat, true, false, false))
  97. //DEF_BENCH(return new ConstXTileBench(SkTileMode::kClamp, SkTileMode::kClamp, true, false, true))
  98. DEF_BENCH(return new ConstXTileBench(SkTileMode::kMirror, SkTileMode::kMirror, true, false, false))
  99. //DEF_BENCH(return new ConstXTileBench(SkTileMode::kRepeat, SkTileMode::kRepeat, false, true, true))
  100. DEF_BENCH(return new ConstXTileBench(SkTileMode::kClamp, SkTileMode::kClamp, false, true, false))
  101. //DEF_BENCH(return new ConstXTileBench(SkTileMode::kMirror, SkTileMode::kMirror, false, true, true))
  102. DEF_BENCH(return new ConstXTileBench(SkTileMode::kRepeat, SkTileMode::kRepeat, true, true, false))
  103. //DEF_BENCH(return new ConstXTileBench(SkTileMode::kClamp, SkTileMode::kClamp, true, true, true))
  104. DEF_BENCH(return new ConstXTileBench(SkTileMode::kMirror, SkTileMode::kMirror, true, true, false))