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