Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2015 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 
      8 #include "Benchmark.h"
      9 #include "Resources.h"
     10 #include "SkCanvas.h"
     11 #include "SkPaint.h"
     12 #include "SkRandom.h"
     13 #include "SkStream.h"
     14 #include "SkString.h"
     15 #include "SkTemplates.h"
     16 #include "SkTextBlob.h"
     17 #include "SkTypeface.h"
     18 
     19 #include "sk_tool_utils.h"
     20 
     21 /*
     22  * A trivial test which benchmarks the performance of a textblob with a single run.
     23  */
     24 class TextBlobBench : public Benchmark {
     25 public:
     26     TextBlobBench() {}
     27 
     28 protected:
     29     void onDelayedSetup() override {
     30         fTypeface = sk_tool_utils::create_portable_typeface("serif", SkFontStyle());
     31         // make textblob
     32         SkPaint paint;
     33         paint.setTypeface(fTypeface);
     34         const char* text = "Hello blob!";
     35         SkTDArray<uint16_t> glyphs;
     36         size_t len = strlen(text);
     37         glyphs.append(paint.textToGlyphs(text, len, nullptr));
     38         paint.textToGlyphs(text, len, glyphs.begin());
     39 
     40         SkTextBlobBuilder builder;
     41 
     42         paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
     43         const SkTextBlobBuilder::RunBuffer& run = builder.allocRun(paint, glyphs.count(), 10, 10,
     44                                                                    nullptr);
     45         memcpy(run.glyphs, glyphs.begin(), glyphs.count() * sizeof(uint16_t));
     46 
     47         fBlob = builder.make();
     48     }
     49 
     50     const char* onGetName() override {
     51         return "TextBlobBench";
     52     }
     53 
     54     void onDraw(int loops, SkCanvas* canvas) override {
     55         SkPaint paint;
     56 
     57         // To ensure maximum caching, we just redraw the blob at the same place everytime
     58         for (int i = 0; i < loops; i++) {
     59             canvas->drawTextBlob(fBlob, 0, 0, paint);
     60         }
     61     }
     62 
     63 private:
     64 
     65     sk_sp<SkTextBlob>   fBlob;
     66     SkTDArray<uint16_t> fGlyphs;
     67     sk_sp<SkTypeface>   fTypeface;
     68 
     69     typedef Benchmark INHERITED;
     70 };
     71 
     72 DEF_BENCH( return new TextBlobBench(); )
     73