blob: 725f85b99733d8d4ac125ab64eafdf134c57c49e [file] [log] [blame]
* Copyright 2018 Google Inc.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
#include <vector>
#include "bench/Benchmark.h"
#include "include/core/SkFont.h"
#include "include/core/SkTypeface.h"
#include "src/core/SkUtils.h"
#include "src/utils/SkUTF.h"
// From Project Guttenberg. This is UTF-8 text.
static const char* atext[] = {
"Call me Ishmael. Some years ago--never mind how",
"long precisely --having little or no money in my purse, and nothing particular",
"to interest me on shore, I thought I would sail about a little and see the",
"watery part of the world. It is a way I have of driving off the spleen, and",
"regulating the circulation. Whenever I find myself growing grim about the",
"mouth; whenever it is a damp, drizzly November in my soul; whenever I find",
"myself involuntarily pausing before coffin warehouses, and bringing up the",
"rear of every funeral I meet; and especially whenever my hypos get such an",
"upper hand of me, that it requires a strong moral principle to prevent me",
"from deliberately stepping into the street, and methodically knocking",
"people's hats off--then, I account it high time to get to sea as soon as I can.",
"This is my substitute for pistol and ball. With a philosophical flourish",
"Cato throws himself upon his sword; I quietly take to the ship. There is",
"nothing surprising in this. If they but knew it, almost all men in their",
"degree, some time or other, cherish very nearly the same feelings towards the",
"ocean with me. There now is your insular city of the Manhattoes, belted round",
"by wharves as Indian isles by coral reefs--commerce surrounds it with her surf.",
"Right and left, the streets take you waterward. Its extreme down-town is",
"the battery, where that noble mole is washed by waves, and cooled by",
"breezes, which a few hours previous were out of sight of land. Look at the",
"crowds of water-gazers there. Circumambulate the city of a dreamy Sabbath",
"afternoon. Go from Corlears Hook to Coenties Slip, and from thence, by",
"Whitehall northward. What do you see?--Posted like silent sentinels all",
"around the town, stand thousands upon thousands of mortal men fixed in ocean",
"reveries. Some leaning against the spiles; some seated upon the pier-heads;",
"some looking over the bulwarks glasses!",
"of ships from China; some high aloft in the rigging, as if striving to get a",
"still better seaward peep. But these are all landsmen; of week days pent up",
"in lath and plaster--tied to counters, nailed to benches, clinched to desks.",
"How then is this? Are the green fields gone? What do they here? But look!",
"here come more crowds, pacing straight for the water, and seemingly bound for",
"a dive. Strange! Nothing will content them but the extremest limit of the",
"land; loitering under the shady lee of yonder warehouses will not suffice.",
"No. They must get just as nigh the water as they possibly can without falling",
"in. And there they stand--miles of them--leagues. Inlanders all, they come",
"from lanes and alleys, streets and avenues, --north, east, south, and west.",
"Yet here they all unite. Tell me, does the magnetic virtue of the needles of",
"the compasses of all those ships attract them thither? Once more. Say, you",
"are in the country; in some high land of lakes. Take almost any path you",
"please, and ten to one it carries you down in a dale, and leaves you there",
"by a pool in the stream. There is magic in it. Let the most absent-minded",
"of men be plunged in his deepest reveries--stand that man on his legs, set his",
"feet a-going, and he will infallibly lead you to water, if water there be in",
"all that region. Should you ever be athirst in the great American desert,",
"try this experiment, if your caravan happen to be supplied with a metaphysical",
"professor. Yes, as every one knows, meditation and water are wedded for ever.",
"But here is an artist. He desires to paint you the dreamiest, shadiest,",
"quietest, most enchanting bit of romantic landscape in all the valley of the",
"Saco. What is the chief element he employs? There stand his trees, each with",
"a hollow trunk, as if a hermit and a crucifix were within; and here sleeps",
"his meadow, and there sleep his cattle; and up from yonder cottage goes a",
"sleepy smoke. Deep into distant woodlands winds a mazy way, reaching to",
"overlapping spurs of mountains bathed in their hill-side blue. But though",
"the picture lies thus tranced, and though this pine-tree shakes down its sighs",
"like leaves upon this shepherd's head, yet all were vain, unless the",
"shepherd's eye were fixed upon the magic stream before him. Go visit the",
"Prairies in June,",
"when for scores on scores of miles you wade knee-deep among Tiger-lilies--what",
"is the one charm wanting? --Water --there is not a drop of water there! Were",
"Niagara but a cataract of sand, would you travel your thousand miles to see",
"it? Why did the poor poet of Tennessee, upon suddenly receiving two handfuls",
"of silver, deliberate whether to buy him a coat, which he sadly needed, or",
"invest his money in a pedestrian trip to Rockaway Beach? Why is almost every",
"robust healthy boy with a robust healthy soul in him, at some time or other",
"crazy to go to sea? Why upon your first voyage as a passenger, did you",
"yourself feel such a mystical vibration, when first told that you and your",
"ship were now out of sight of land? Why did the old Persians hold the sea",
"holy? Why did the Greeks give it a separate deity, and own brother of Jove?",
"Surely all this is not without meaning. And still deeper the meaning of that",
"story of Narcissus, who because he could not grasp the tormenting, mild image",
"he saw in the fountain, plunged into it and was drowned. But that same",
"image, we ourselves see in all rivers and oceans. It is the image of the",
"ungraspable phantom of life; and this is the key to it all. Now, when I say",
"that I am in the habit of going to sea whenever I begin to grow hazy about the",
"eyes, and begin to be over conscious of my lungs, I do not mean to have it",
"inferred that I ever go to sea as a passenger. For to go as a passenger you",
"must needs have a purse, and a purse is but a rag unless you have something",
"in it. Besides, passengers get sea-sick --grow quarrelsome --don't sleep of",
"nights --do not enjoy themselves much, as a general thing; --no, I never go as a",
"passenger; nor, though I am something of a salt, do I ever go to sea as a",
"Commodore, or a Captain, or a Cook. I abandon the glory and distinction of",
"such offices to those who like them. For my part, I abominate all honorable",
"respectable toils, trials, and tribulations of every kind whatsoever. It is",
"quite as much as I can do to take care of myself, without taking care of",
"ships, barques, brigs, schooners, and what not. And as for going as cook, --",
"though I confess there is considerable glory in that, a cook being a sort of",
"officer on ship-board --yet, somehow, I never fancied broiling fowls; --though",
"once broiled, judiciously buttered, and judgmatically salted and peppered,",
"there is no one who will",
"speak more respectfully, not to say reverentially, of a broiled fowl than I",
"will. It is out of the idolatrous dotings of the old Egyptians upon broiled",
"ibis and roasted river horse, that you see the mummies of those creatures in",
"their huge bake-houses the pyramids. No, when I go to sea, I go as a simple",
"sailor, right before the mast, plumb down into the forecastle, aloft there",
"to the royal mast-head. True, they rather order me about some, and make me",
"jump from spar to spar, like a grasshopper in a May meadow. And at first,",
"this sort of thing is unpleasant enough. It touches one's sense of honor,",
"particularly if you come of an old established family in the land, the van",
"Rensselaers, or Randolphs, or Hardicanutes. And more than all, if just",
"previous to putting your hand into the tar-pot, you have been lording it as a",
"country schoolmaster, making the tallest boys stand in awe of you. The",
"transition is a keen one, I assure you, from the schoolmaster to a sailor,",
"and requires a strong decoction of Seneca and the Stoics to enable you to grin",
"and bear it. But even this wears off in time. What of it, if some old hunks",
"of a sea-captain orders me to get a broom and sweep down the decks? What does",
"that indignity amount to, weighed, I mean, in the scales of the New",
"Testament? Do you think the archangel Gabriel thinks anything the less of me,",
"because I promptly and respectfully obey that old hunks in that particular",
"instance? Who aint a slave? Tell me that. Well, then, however the old",
"sea-captains may order me about--however they may thump and punch me about, I",
"have the satisfaction of knowing that it is all right; that everybody else",
"is one way or other served in much the same way -- either in a physical or",
"metaphysical point of view, that is; and so the universal thump is passed",
"round, and all hands should rub each other's shoulder-blades, and be",
"content. Again, I always go to sea as a sailor, because they make a point of",
"paying me for my trouble, whereas they never pay passengers a single penny",
"that I ever heard of. On the contrary, passengers themselves must pay. And",
"there is all the difference in the world between paying and being paid. The",
"act of paying is perhaps the most uncomfortable infliction that the two",
"orchard thieves entailed upon us."
static const char* ctext[] = {
"胡秀才告狀鳴冤 施賢臣得夢訪案",
"  話說江都縣有一秀才,姓胡,名登舉。他的父母為人所殺,頭顱不見。胡登舉合家",
"  跑到縣衙,正遇升堂,就進去喊冤。走至堂上,打了一躬,手舉呈詞,口稱:「父",
"  施公看罷,不由點頭,暗暗吃驚,想道:「夤夜入院,非奸即盜。胡翰林夫婦年老",
"  且說施公吩咐速去知會四衙,往胡家驗屍呈報,把呈詞收入袖內,吩咐退堂。進內",
"  這九黃、七豬,是兩個人名,還是兩個物名,現在何處?求老爺吩咐明白,小的們",
"  施公一連五日,假裝有恙,並未升堂。到了第六日,一早吩咐點鼓升堂,坐下。衙",
"  施公聞言,激惱成怒,喝叫左右拉下,每人打十五大板。不容分說,只打的哀求不",
class UtfToGlyph : public Benchmark {
UtfToGlyph(SkTextEncoding encoding, const char* (*text), int lineCount, const char* name)
: fEncoding{encoding}
, fText{text}
, fLineCount{lineCount}
, fName{name} { }
const char* onGetName() override {
return fName;
bool isSuitableFor(Backend backend) override {
return backend == kNonRendering_Backend;
void onDelayedSetup() override {
int maxGlyphs = 0;
for (int i = 0; i < fLineCount; i++) {
maxGlyphs = std::max(maxGlyphs, fLines.back()->glyphCount);
fGlyphIds.insert(fGlyphIds.begin(), maxGlyphs, 0);
fTypeface = SkTypeface::MakeFromName("monospace", SkFontStyle());
void onDraw(int loops, SkCanvas* canvas) override {
SkFont font(fTypeface);
// Do more loops to reduce variance.
for (int i = 0; i < loops * 3; ++i) {
for (auto& line : fLines) {
font.textToGlyphs(line->, line->utf.size(), fEncoding,, line->glyphCount);
struct Line {
int glyphCount = 0;
std::vector<char> utf;
std::unique_ptr<Line> convertLine(int lineIndex) {
std::unique_ptr<Line> result = std::make_unique<Line>();
const char* cursor = fText[lineIndex];
size_t len = strlen(cursor);
const char* end = cursor + len;
result->glyphCount = SkUTF::CountUTF8(cursor, len);
std::vector<char>& bytes = result->utf;
while (cursor < end) {
SkUnichar u = SkUTF::NextUTF8(&cursor, end);
switch (fEncoding) {
case SkTextEncoding::kUTF8: {
char buffer[SkUTF::kMaxBytesInUTF8Sequence];
size_t count = SkUTF::ToUTF8(u, buffer);
result->utf.insert(bytes.end(), buffer, buffer + count);
case SkTextEncoding::kUTF16: {
uint16_t buffer[2];
size_t count = SkUTF::ToUTF16(u, buffer);
result->utf.insert(bytes.end(), (char *)buffer, (char *)buffer + count * 2);
case SkTextEncoding::kUTF32: {
result->utf.insert(bytes.end(), (char*) &u, (char*) &u + 4);
SK_ABORT("Bad encoding");
return result;
SkTextEncoding fEncoding;
std::vector<std::unique_ptr<Line>> fLines;
std::vector<SkGlyphID> fGlyphIds;
sk_sp<SkTypeface> fTypeface;
const char** fText;
int fLineCount;
const char* fName;
DEF_BENCH(return new UtfToGlyph(SkTextEncoding::kUTF32, ctext, std::size(ctext),
DEF_BENCH(return new UtfToGlyph(SkTextEncoding::kUTF16, ctext, std::size(ctext),
DEF_BENCH(return new UtfToGlyph(SkTextEncoding::kUTF8, ctext, std::size(ctext),
DEF_BENCH(return new UtfToGlyph(SkTextEncoding::kUTF32, atext, std::size(atext),
DEF_BENCH(return new UtfToGlyph(SkTextEncoding::kUTF16, atext, std::size(atext),
DEF_BENCH(return new UtfToGlyph(SkTextEncoding::kUTF8, atext, std::size(atext),