1bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com/* 2bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com * Copyright 2013 Google Inc. 3bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com * 4bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com * Use of this source code is governed by a BSD-style license that can be 5bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com * found in the LICENSE file. 6bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com */ 7bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 9bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com#include "SkCanvas.h" 10bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com#include "SkPaint.h" 11bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com#include "SkTypeface.h" 12bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 13bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comenum { 14bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com NGLYPHS = 100 15bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}; 16bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 17bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comstatic SkTypeface::Encoding paint2Encoding(const SkPaint& paint) { 18bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com SkPaint::TextEncoding enc = paint.getTextEncoding(); 19bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com SkASSERT(SkPaint::kGlyphID_TextEncoding != enc); 20bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com return (SkTypeface::Encoding)enc; 21bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com} 22bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 23c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comtypedef void (*TypefaceProc)(int loops, const SkPaint&, const void* text, size_t len, 24bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com int glyphCount); 25bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 26c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comstatic void containsText_proc(int loops, const SkPaint& paint, const void* text, size_t len, 27bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com int glyphCount) { 28c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com for (int i = 0; i < loops; ++i) { 29bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com paint.containsText(text, len); 30bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com } 31bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com} 32bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 33c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comstatic void textToGlyphs_proc(int loops, const SkPaint& paint, const void* text, size_t len, 34bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com int glyphCount) { 35bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com uint16_t glyphs[NGLYPHS]; 36bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com SkASSERT(glyphCount <= NGLYPHS); 37bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 38c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com for (int i = 0; i < loops; ++i) { 39bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com paint.textToGlyphs(text, len, glyphs); 40bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com } 41bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com} 42bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 43c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comstatic void charsToGlyphs_proc(int loops, const SkPaint& paint, const void* text, 44bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com size_t len, int glyphCount) { 45bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com SkTypeface::Encoding encoding = paint2Encoding(paint); 46bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com uint16_t glyphs[NGLYPHS]; 47bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com SkASSERT(glyphCount <= NGLYPHS); 4898a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com 49bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com SkTypeface* face = paint.getTypeface(); 50c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com for (int i = 0; i < loops; ++i) { 51bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com face->charsToGlyphs(text, encoding, glyphs, glyphCount); 52bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com } 53bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com} 54bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 55c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.comstatic void charsToGlyphsNull_proc(int loops, const SkPaint& paint, const void* text, 56231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com size_t len, int glyphCount) { 57231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com SkTypeface::Encoding encoding = paint2Encoding(paint); 5898a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com 59231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com SkTypeface* face = paint.getTypeface(); 60c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com for (int i = 0; i < loops; ++i) { 61231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com face->charsToGlyphs(text, encoding, NULL, glyphCount); 62231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com } 63231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com} 64231129753cdbefbfa026d4c14b260aece973b4e9reed@google.com 65f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass CMAPBench : public Benchmark { 66bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com TypefaceProc fProc; 67bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com SkString fName; 68bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com char fText[NGLYPHS]; 69bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com SkPaint fPaint; 70bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 71bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.compublic: 72410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com CMAPBench(TypefaceProc proc, const char name[]) { 73bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com fProc = proc; 74bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com fName.printf("cmap_%s", name); 7598a196770cc7b9914ad68367c5b06829a5e0b440skia.committer@gmail.com 76bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com for (int i = 0; i < NGLYPHS; ++i) { 772d903aea532c7103ea0892f8f9d6ab44a2a2b754reed@google.com // we're jamming values into utf8, so we must keep it legal utf8 782d903aea532c7103ea0892f8f9d6ab44a2a2b754reed@google.com fText[i] = 'A' + (i & 31); 79bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com } 80bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com fPaint.setTypeface(SkTypeface::RefDefault())->unref(); 81bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com } 82bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 83bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comprotected: 8436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 85bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com return fName.c_str(); 86bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com } 87bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 8836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas* canvas) override { 893361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org fProc(loops, fPaint, fText, sizeof(fText), NGLYPHS); 90bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com } 91bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 92bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.comprivate: 93bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 94f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 95bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com}; 96bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 97bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com////////////////////////////////////////////////////////////////////////////// 98bcb42aecf1bdb9ae80d766d203b4f636b954cf03reed@google.com 99410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CMAPBench(containsText_proc, "paint_containsText"); ) 100410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CMAPBench(textToGlyphs_proc, "paint_textToGlyphs"); ) 101410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CMAPBench(charsToGlyphs_proc, "face_charsToGlyphs"); ) 102410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CMAPBench(charsToGlyphsNull_proc, "face_charsToGlyphs_null"); ) 103