1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright 2011 Google Inc. 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Use of this source code is governed by a BSD-style license that can be 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * found in the LICENSE file. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "Benchmark.h" 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkCanvas.h" 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkColor.h" 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkPaint.h" 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkPicture.h" 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkPictureRecorder.h" 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkPoint.h" 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkRect.h" 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "SkString.h" 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// This is designed to emulate about 4 screens of textual content 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass PicturePlaybackBench : public Benchmark { 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic: 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski PicturePlaybackBench(const char name[]) { 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski fName.printf("picture_playback_%s", name); 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski fPictureWidth = SkIntToScalar(PICTURE_WIDTH); 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski fPictureHeight = SkIntToScalar(PICTURE_HEIGHT); 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski fTextSize = SkIntToScalar(TEXT_SIZE); 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski enum { 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski PICTURE_WIDTH = 1000, 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski PICTURE_HEIGHT = 4000, 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski TEXT_SIZE = 10 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprotected: 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual const char* onGetName() { 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return fName.c_str(); 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 386381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath 396381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath virtual void onDraw(const int loops, SkCanvas* canvas) { 406381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkPictureRecorder recorder; 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkCanvas* pCanvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT, NULL, 0); 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski this->recordCanvas(pCanvas); 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const SkPoint translateDelta = getTranslateDelta(loops); 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (int i = 0; i < loops; i++) { 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski picture->playback(canvas); 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski canvas->translate(translateDelta.fX, translateDelta.fY); 516381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath } 526381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath } 536381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath 546381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath virtual void recordCanvas(SkCanvas* canvas) = 0; 556381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath virtual SkPoint getTranslateDelta(int N) { 566381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath SkIPoint canvasSize = onGetSize(); 576381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath return SkPoint::Make(SkIntToScalar((PICTURE_WIDTH - canvasSize.fX)/N), 586381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath SkIntToScalar((PICTURE_HEIGHT- canvasSize.fY)/N)); 596381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath } 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkString fName; 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkScalar fPictureWidth; 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkScalar fPictureHeight; 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkScalar fTextSize; 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate: 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski typedef Benchmark INHERITED; 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 696381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath 706381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamathclass TextPlaybackBench : public PicturePlaybackBench { 716381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamathpublic: 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski TextPlaybackBench() : INHERITED("drawText") { } 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprotected: 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE { 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkPaint paint; 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski paint.setTextSize(fTextSize); 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski paint.setColor(SK_ColorBLACK); 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const char* text = "Hamburgefons"; 8047cd8e921db73e894f94ec4729ade90da50996f5Chris Craik size_t len = strlen(text); 8147cd8e921db73e894f94ec4729ade90da50996f5Chris Craik const SkScalar textWidth = paint.measureText(text, len); 8247cd8e921db73e894f94ec4729ade90da50996f5Chris Craik 8347cd8e921db73e894f94ec4729ade90da50996f5Chris Craik for (SkScalar x = 0; x < fPictureWidth; x += textWidth) { 8447cd8e921db73e894f94ec4729ade90da50996f5Chris Craik for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) { 8547cd8e921db73e894f94ec4729ade90da50996f5Chris Craik canvas->drawText(text, len, x, y, paint); 8677b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik } 8747cd8e921db73e894f94ec4729ade90da50996f5Chris Craik } 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate: 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski typedef PicturePlaybackBench INHERITED; 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 92859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck 93859e19f97d481bf07c768087d8eb3031fac77aadJohn Reckclass PosTextPlaybackBench : public PicturePlaybackBench { 94859e19f97d481bf07c768087d8eb3031fac77aadJohn Reckpublic: 95859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck PosTextPlaybackBench(bool drawPosH) 96859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck : INHERITED(drawPosH ? "drawPosTextH" : "drawPosText") 97859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck , fDrawPosH(drawPosH) { } 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprotected: 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual void recordCanvas(SkCanvas* canvas) SK_OVERRIDE { 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkPaint paint; 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski paint.setTextSize(fTextSize); 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski paint.setColor(SK_ColorBLACK); 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const char* text = "Hamburgefons"; 105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski size_t len = strlen(text); 106859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck const SkScalar textWidth = paint.measureText(text, len); 107859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck 108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkScalar* adv = new SkScalar[len]; 109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski paint.getTextWidths(text, len, adv); 110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (SkScalar x = 0; x < fPictureWidth; x += textWidth) { 112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) { 113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkPoint* pos = new SkPoint[len]; 115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski SkScalar advX = 0; 116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (size_t i = 0; i < len; i++) { 118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (fDrawPosH) 119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski pos[i].set(x + advX, y); 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski else 121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski pos[i].set(x + advX, y + i); 122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski advX += adv[i]; 123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski canvas->drawPosText(text, len, pos, paint); 126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski delete[] pos; 127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski delete[] adv; 130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate: 132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool fDrawPosH; 133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski typedef PicturePlaybackBench INHERITED; 134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/////////////////////////////////////////////////////////////////////////////// 138859e19f97d481bf07c768087d8eb3031fac77aadJohn Reck 139859e19f97d481bf07c768087d8eb3031fac77aadJohn ReckDEF_BENCH( return new TextPlaybackBench(); ) 140282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiDEF_BENCH( return new PosTextPlaybackBench(true); ) 141282e181b58cf72b6ca770dc7ca5f91f135444502Adam LesinskiDEF_BENCH( return new PosTextPlaybackBench(false); ) 142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski