From bcb42aecf1bdb9ae80d766d203b4f636b954cf03 Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Tue, 2 Jul 2013 13:56:39 +0000 Subject: add charsToGlyphs to SkTypeface Will disable new unittest until all backends are implemented. On Mac, new API is 4x faster than old paint one, so next CL I will reimplement the paint calls in terms of the new typeface call. R=eae@chromium.org Review URL: https://codereview.chromium.org/18083023 git-svn-id: http://skia.googlecode.com/svn/trunk@9860 2bbb7eff-a529-9590-31e7-b0007b416f81 --- bench/CmapBench.cpp | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 bench/CmapBench.cpp (limited to 'bench/CmapBench.cpp') diff --git a/bench/CmapBench.cpp b/bench/CmapBench.cpp new file mode 100644 index 0000000000..9697477850 --- /dev/null +++ b/bench/CmapBench.cpp @@ -0,0 +1,93 @@ +/* + * 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 "SkBenchmark.h" +#include "SkCanvas.h" +#include "SkPaint.h" +#include "SkTypeface.h" + +enum { + LOOP = SkBENCHLOOP(1000), + 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)(const SkPaint&, const void* text, size_t len, + int glyphCount); + +static void containsText_proc(const SkPaint& paint, const void* text, size_t len, + int glyphCount) { + for (int i = 0; i < LOOP; ++i) { + paint.containsText(text, len); + } +} + +static void textToGlyphs_proc(const SkPaint& paint, const void* text, size_t len, + int glyphCount) { + uint16_t glyphs[NGLYPHS]; + SkASSERT(glyphCount <= NGLYPHS); + + for (int i = 0; i < LOOP; ++i) { + paint.textToGlyphs(text, len, glyphs); + } +} + +static void charsToGlyphs_proc(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 < LOOP; ++i) { + face->charsToGlyphs(text, encoding, glyphs, glyphCount); + } +} + +class CMAPBench : public SkBenchmark { + TypefaceProc fProc; + SkString fName; + char fText[NGLYPHS]; + SkPaint fPaint; + +public: + CMAPBench(void* param, TypefaceProc proc, const char name[]) : SkBenchmark(param) { + fProc = proc; + fName.printf("cmap_%s", name); + + for (int i = 0; i < NGLYPHS; ++i) { + // we're just jamming values into utf8, so we must keep it legal + fText[i] = i; + } + fPaint.setTypeface(SkTypeface::RefDefault())->unref(); + } + +protected: + virtual const char* onGetName() SK_OVERRIDE { + return fName.c_str(); + } + + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { + fProc(fPaint, fText, sizeof(fText), NGLYPHS); + } + +private: + + typedef SkBenchmark INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +DEF_BENCH( return new CMAPBench(p, containsText_proc, "paint_containsText"); ) +DEF_BENCH( return new CMAPBench(p, textToGlyphs_proc, "paint_textToGlyphs"); ) +DEF_BENCH( return new CMAPBench(p, charsToGlyphs_proc, "face_charsToGlyphs"); ) + -- cgit v1.2.3