SampleFontCache.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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 "include/core/SkCanvas.h"
  8. #include "include/core/SkGraphics.h"
  9. #include "include/utils/SkRandom.h"
  10. #include "samplecode/Sample.h"
  11. #include <pthread.h>
  12. static void call_measure() {
  13. SkPaint paint;
  14. uint16_t text[32];
  15. SkRandom rand;
  16. paint.setAntiAlias(true);
  17. paint.setTextEncoding(SkTextEncoding::kUTF16);
  18. for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
  19. text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
  20. for (int i = 9; i < 36; i++) {
  21. SkFontMetrics m;
  22. paint.setTextSize(SkIntToScalar(i));
  23. paint.getFontMetrics(&m);
  24. paint.measureText(text, sizeof(text));
  25. }
  26. }
  27. static void call_draw(SkCanvas* canvas) {
  28. SkPaint paint;
  29. uint16_t text[32];
  30. SkRandom rand;
  31. paint.setAntiAlias(true);
  32. paint.setTextEncoding(SkTextEncoding::kUTF16);
  33. for (int j = 0; j < SK_ARRAY_COUNT(text); j++)
  34. text[j] = (uint16_t)((rand.nextU() & 0xFF) + 32);
  35. SkScalar x = SkIntToScalar(10);
  36. SkScalar y = SkIntToScalar(20);
  37. canvas->drawColor(SK_ColorWHITE);
  38. for (int i = 9; i < 36; i++)
  39. {
  40. SkFontMetrics m;
  41. paint.setTextSize(SkIntToScalar(i));
  42. paint.getFontMetrics(&m);
  43. canvas->drawText(text, sizeof(text), x, y, paint);
  44. y += m.fDescent - m.fAscent;
  45. }
  46. }
  47. static bool gDone;
  48. static void* measure_proc(void* context) {
  49. while (!gDone) {
  50. call_measure();
  51. }
  52. return nullptr;
  53. }
  54. static void* draw_proc(void* context) {
  55. SkBitmap* bm = (SkBitmap*)context;
  56. SkCanvas canvas(*bm);
  57. while (!gDone) {
  58. call_draw(&canvas);
  59. }
  60. return nullptr;
  61. }
  62. class FontCacheView : public Sample {
  63. public:
  64. enum { N = 4 };
  65. pthread_t fMThreads[N];
  66. pthread_t fDThreads[N];
  67. SkBitmap fBitmaps[N];
  68. FontCacheView() {
  69. gDone = false;
  70. for (int i = 0; i < N; i++) {
  71. int status;
  72. status = pthread_create(&fMThreads[i], nullptr, measure_proc, nullptr);
  73. SkASSERT(0 == status);
  74. fBitmaps[i].allocPixels(SkImageInfo::Make(320, 240,
  75. kRGB_565_SkColorType,
  76. kOpaque_SkAlphaType));
  77. status = pthread_create(&fDThreads[i], nullptr, draw_proc, &fBitmaps[i]);
  78. SkASSERT(0 == status);
  79. }
  80. this->setBGColor(0xFFDDDDDD);
  81. }
  82. virtual ~FontCacheView() {
  83. gDone = true;
  84. for (int i = 0; i < N; i++) {
  85. void* ret;
  86. int status = pthread_join(fMThreads[i], &ret);
  87. SkASSERT(0 == status);
  88. status = pthread_join(fDThreads[i], &ret);
  89. SkASSERT(0 == status);
  90. }
  91. }
  92. protected:
  93. SkString name() override { return SkString("FontCache"); }
  94. virtual void onDrawContent(SkCanvas* canvas) {
  95. SkScalar x = 0;
  96. SkScalar y = 0;
  97. for (int i = 0; i < N; i++) {
  98. canvas->drawBitmap(fBitmaps[i], x, y);
  99. x += SkIntToScalar(fBitmaps[i].width());
  100. }
  101. this->inval(nullptr);
  102. }
  103. private:
  104. typedef Sample INHERITED;
  105. };
  106. //////////////////////////////////////////////////////////////////////////////
  107. static Sample* MyFactory() { return new FontCacheView; }
  108. static SampleRegister reg(MyFactory);