1 2 /* 3 * Copyright 2015 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include "Benchmark.h" 10 #include "Resources.h" 11 #include "SkCanvas.h" 12 #include "SkPaint.h" 13 #include "SkRandom.h" 14 #include "SkStream.h" 15 #include "SkString.h" 16 #include "SkTemplates.h" 17 #include "SkTextBlob.h" 18 #include "SkTypeface.h" 19 20 #include "sk_tool_utils.h" 21 22 /* 23 * A trivial test which benchmarks the performance of a textblob with a single run. 24 */ 25 class TextBlobBench : public Benchmark { 26 public: TextBlobBench()27 TextBlobBench() 28 : fTypeface(sk_tool_utils::create_portable_typeface("Times", SkTypeface::kNormal)) { 29 // make textblob 30 SkPaint paint; 31 paint.setTypeface(fTypeface); 32 const char* text = "Hello blob!"; 33 SkTDArray<uint16_t> glyphs; 34 size_t len = strlen(text); 35 glyphs.append(paint.textToGlyphs(text, len, NULL)); 36 paint.textToGlyphs(text, len, glyphs.begin()); 37 38 SkTextBlobBuilder builder; 39 40 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 41 const SkTextBlobBuilder::RunBuffer& run = builder.allocRun(paint, glyphs.count(), 10, 10, 42 NULL); 43 memcpy(run.glyphs, glyphs.begin(), glyphs.count() * sizeof(uint16_t)); 44 45 fBlob.reset(builder.build()); 46 } 47 48 protected: onGetName()49 const char* onGetName() { 50 return "TextBlobBench"; 51 } 52 onDraw(const int loops,SkCanvas * canvas)53 void onDraw(const int loops, SkCanvas* canvas) { 54 SkPaint paint; 55 56 // To ensure maximum caching, we just redraw the blob at the same place everytime 57 for (int i = 0; i < loops; i++) { 58 canvas->drawTextBlob(fBlob, 0, 0, paint); 59 } 60 } 61 62 private: 63 64 SkAutoTUnref<const SkTextBlob> fBlob; 65 SkTDArray<uint16_t> fGlyphs; 66 SkAutoTUnref<SkTypeface> fTypeface; 67 68 typedef Benchmark INHERITED; 69 }; 70 71 DEF_BENCH( return new TextBlobBench(); ) 72