diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-02 13:56:39 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-02 13:56:39 +0000 |
commit | bcb42aecf1bdb9ae80d766d203b4f636b954cf03 (patch) | |
tree | dfd351e5a83a420732c97c46150e20bdf0723cd1 /bench | |
parent | 63e9627fca441ae7117eb3a06b978470cebed84c (diff) |
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
Diffstat (limited to 'bench')
-rw-r--r-- | bench/CmapBench.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
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"); ) + |