/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "Benchmark.h" #include "SkCanvas.h" #include "SkPaint.h" #include "SkTypeface.h" enum { NGLYPHS = 100 }; static SkTypeface::Encoding paint2Encoding(const SkPaint& paint) { SkPaint::TextEncoding enc = paint.getTextEncoding(); SkASSERT(SkPaint::kGlyphID_TextEncoding != enc); return (SkTypeface::Encoding)enc; } typedef void (*TypefaceProc)(int loops, const SkPaint&, const void* text, size_t len, int glyphCount); static void containsText_proc(int loops, const SkPaint& paint, const void* text, size_t len, int glyphCount) { for (int i = 0; i < loops; ++i) { paint.containsText(text, len); } } static void textToGlyphs_proc(int loops, const SkPaint& paint, const void* text, size_t len, int glyphCount) { uint16_t glyphs[NGLYPHS]; SkASSERT(glyphCount <= NGLYPHS); for (int i = 0; i < loops; ++i) { paint.textToGlyphs(text, len, glyphs); } } static void charsToGlyphs_proc(int loops, const SkPaint& paint, const void* text, size_t len, int glyphCount) { SkTypeface::Encoding encoding = paint2Encoding(paint); uint16_t glyphs[NGLYPHS]; SkASSERT(glyphCount <= NGLYPHS); SkTypeface* face = paint.getTypeface(); for (int i = 0; i < loops; ++i) { face->charsToGlyphs(text, encoding, glyphs, glyphCount); } } static void charsToGlyphsNull_proc(int loops, const SkPaint& paint, const void* text, size_t len, int glyphCount) { SkTypeface::Encoding encoding = paint2Encoding(paint); SkTypeface* face = paint.getTypeface(); for (int i = 0; i < loops; ++i) { face->charsToGlyphs(text, encoding, nullptr, glyphCount); } } class CMAPBench : public Benchmark { TypefaceProc fProc; SkString fName; char fText[NGLYPHS]; SkPaint fPaint; public: CMAPBench(TypefaceProc proc, const char name[]) { fProc = proc; fName.printf("cmap_%s", name); for (int i = 0; i < NGLYPHS; ++i) { // we're jamming values into utf8, so we must keep it legal utf8 fText[i] = 'A' + (i & 31); } fPaint.setTypeface(SkTypeface::MakeDefault()); } protected: const char* onGetName() override { return fName.c_str(); } void onDraw(int loops, SkCanvas* canvas) override { fProc(loops, fPaint, fText, sizeof(fText), NGLYPHS); } private: typedef Benchmark INHERITED; }; ////////////////////////////////////////////////////////////////////////////// DEF_BENCH( return new CMAPBench(containsText_proc, "paint_containsText"); ) DEF_BENCH( return new CMAPBench(textToGlyphs_proc, "paint_textToGlyphs"); ) DEF_BENCH( return new CMAPBench(charsToGlyphs_proc, "face_charsToGlyphs"); ) DEF_BENCH( return new CMAPBench(charsToGlyphsNull_proc, "face_charsToGlyphs_null"); )