14f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger/* 24f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * Copyright 2011 Google Inc. 34f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * 44f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 54f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * found in the LICENSE file. 64f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger */ 74f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkBenchmark.h" 84f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkCanvas.h" 94f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkColor.h" 104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkPaint.h" 114f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkPicture.h" 124f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkPoint.h" 134f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkRect.h" 144f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkString.h" 154f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 164f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger// This is designed to emulate about 4 screens of textual content 174f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 184f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerclass PicturePlaybackBench : public SkBenchmark { 204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerpublic: 214f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger PicturePlaybackBench(void* param, const char name[]) : INHERITED(param) { 224f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger fName.printf("picture_playback_%s", name); 234f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger fPictureWidth = SkIntToScalar(PICTURE_WIDTH); 244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger fPictureHeight = SkIntToScalar(PICTURE_HEIGHT); 254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger fTextSize = SkIntToScalar(TEXT_SIZE); 264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger enum { 294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger N = SkBENCHLOOP(1000), // number of times to playback the picture 304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger PICTURE_WIDTH = 1000, 314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger PICTURE_HEIGHT = 4000, 324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger TEXT_SIZE = 10 334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger }; 344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerprotected: 354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger virtual const char* onGetName() { 364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger return fName.c_str(); 374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger virtual void onDraw(SkCanvas* canvas) { 404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkPicture picture; 424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkCanvas* pCanvas = picture.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT); 444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger recordCanvas(pCanvas); 454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger picture.endRecording(); 464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger const SkPoint translateDelta = getTranslateDelta(); 484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger for (int i = 0; i < N; i++) { 504f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger picture.draw(canvas); 514f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger canvas->translate(translateDelta.fX, translateDelta.fY); 524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 534f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 544f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger virtual void recordCanvas(SkCanvas* canvas) = 0; 564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger virtual SkPoint getTranslateDelta() { 574f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkIPoint canvasSize = onGetSize(); 584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger return SkPoint::Make(SkIntToScalar((PICTURE_WIDTH - canvasSize.fX)/N), 594f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkIntToScalar((PICTURE_HEIGHT- canvasSize.fY)/N)); 604f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 614f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 624f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkString fName; 634f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkScalar fPictureWidth; 644f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkScalar fPictureHeight; 654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkScalar fTextSize; 664f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerprivate: 674f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger typedef SkBenchmark INHERITED; 684f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger}; 694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 704f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 714f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerclass TextPlaybackBench : public PicturePlaybackBench { 724f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerpublic: 734f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger TextPlaybackBench(void* param) : INHERITED(param, "drawText") { } 744f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerprotected: 754f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger virtual void recordCanvas(SkCanvas* canvas) { 764f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkPaint paint; 774f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger paint.setTextSize(fTextSize); 784f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger paint.setColor(SK_ColorBLACK); 794f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 804f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger const char* text = "Hamburgefons"; 814f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger size_t len = strlen(text); 824f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger const SkScalar textWidth = paint.measureText(text, len); 834f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 844f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger for (SkScalar x = 0; x < fPictureWidth; x += textWidth) { 854f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) { 864f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger canvas->drawText(text, len, x, y, paint); 874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 884f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerprivate: 914f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger typedef PicturePlaybackBench INHERITED; 924f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger}; 934f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 944f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerclass PosTextPlaybackBench : public PicturePlaybackBench { 954f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerpublic: 964f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger PosTextPlaybackBench(void* param, bool drawPosH) 974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger : INHERITED(param, drawPosH ? "drawPosTextH" : "drawPosText") 984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger , fDrawPosH(drawPosH) { } 994f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerprotected: 1004f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger virtual void recordCanvas(SkCanvas* canvas) { 1014f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkPaint paint; 1024f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger paint.setTextSize(fTextSize); 1034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger paint.setColor(SK_ColorBLACK); 1044f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1054f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger const char* text = "Hamburgefons"; 1064f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger size_t len = strlen(text); 1074f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger const SkScalar textWidth = paint.measureText(text, len); 1084f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1094f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkScalar* adv = new SkScalar[len]; 1104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger paint.getTextWidths(text, len, adv); 1114f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1124f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger for (SkScalar x = 0; x < fPictureWidth; x += textWidth) { 1134f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger for (SkScalar y = 0; y < fPictureHeight; y += fTextSize) { 1144f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1154f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkPoint* pos = new SkPoint[len]; 1164f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkScalar advX = 0; 1174f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1184f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger for (size_t i = 0; i < len; i++) { 1194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger if (fDrawPosH) 1204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger pos[i].set(x + advX, y); 1214f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger else 1224f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger pos[i].set(x + advX, y + SkIntToScalar(i)); 1234f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger advX += adv[i]; 1244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 1254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger canvas->drawPosText(text, len, pos, paint); 1274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger delete[] pos; 1284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 1294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 1304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger delete[] adv; 1314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 1324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerprivate: 1334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger bool fDrawPosH; 1344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger typedef PicturePlaybackBench INHERITED; 1354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger}; 1364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 1394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic SkBenchmark* Fact0(void* p) { return new TextPlaybackBench(p); } 1414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic SkBenchmark* Fact1(void* p) { return new PosTextPlaybackBench(p, true); } 1424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic SkBenchmark* Fact2(void* p) { return new PosTextPlaybackBench(p, false); } 1434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic BenchRegistry gReg0(Fact0); 1454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic BenchRegistry gReg1(Fact1); 1464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic BenchRegistry gReg2(Fact2); 1474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 148