11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "gm.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRandom.h"
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm {
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define W   400
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define H   400
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define N   50
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const SkScalar SW = SkIntToScalar(W);
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const SkScalar SH = SkIntToScalar(H);
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void rnd_rect(SkRect* r, SkPaint* paint, SkRandom& rand) {
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar x = rand.nextUScalar1() * W;
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar y = rand.nextUScalar1() * H;
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar w = rand.nextUScalar1() * (W >> 2);
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar h = rand.nextUScalar1() * (H >> 2);
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar hoffset = rand.nextSScalar1();
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar woffset = rand.nextSScalar1();
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    r->set(x, y, x + w, y + h);
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    r->offset(-w/2 + woffset, -h/2 + hoffset);
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint->setColor(rand.nextU());
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint->setAlpha(0xFF);
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass StrokesGM : public GM {
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    StrokesGM() {}
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkString onShortName() {
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkString("strokes_round");
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkISize onISize() {
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return make_isize(W, H*2);
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStyle(SkPaint::kStroke_Style);
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStrokeWidth(SkIntToScalar(9)/2);
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int y = 0; y < 2; y++) {
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            paint.setAntiAlias(!!y);
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkAutoCanvasRestore acr(canvas, true);
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(0, SH * y);
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->clipRect(SkRect::MakeLTRB(
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              SkIntToScalar(2), SkIntToScalar(2)
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              , SW - SkIntToScalar(2), SH - SkIntToScalar(2)
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              ));
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkRandom rand;
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            for (int i = 0; i < N; i++) {
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkRect r;
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rnd_rect(&r, &paint, rand);
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->drawOval(r, paint);
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rnd_rect(&r, &paint, rand);
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->drawRoundRect(r, r.width()/4, r.height()/4, paint);
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rnd_rect(&r, &paint, rand);
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GM INHERITED;
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass Strokes2GM : public GM {
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPath fPath;
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    Strokes2GM() {
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRandom rand;
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fPath.moveTo(0, 0);
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int i = 0; i < 13; i++) {
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkScalar x = rand.nextUScalar1() * (W >> 1);
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkScalar y = rand.nextUScalar1() * (H >> 1);
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fPath.lineTo(x, y);
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkString onShortName() {
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkString("strokes_poly");
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkISize onISize() {
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return make_isize(W, H*2);
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static void rotate(SkScalar angle, SkScalar px, SkScalar py, SkCanvas* canvas) {
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkMatrix matrix;
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        matrix.setRotate(angle, px, py);
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->concat(matrix);
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawColor(SK_ColorWHITE);
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStyle(SkPaint::kStroke_Style);
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStrokeWidth(SkIntToScalar(9)/2);
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int y = 0; y < 2; y++) {
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            paint.setAntiAlias(!!y);
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkAutoCanvasRestore acr(canvas, true);
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(0, SH * y);
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->clipRect(SkRect::MakeLTRB(SkIntToScalar(2),
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              SkIntToScalar(2),
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              SW - SkIntToScalar(2),
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              SH - SkIntToScalar(2)));
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkRandom rand;
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            for (int i = 0; i < N/2; i++) {
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkRect r;
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rnd_rect(&r, &paint, rand);
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rotate(SkIntToScalar(15), SW/2, SH/2, canvas);
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->drawPath(fPath, paint);
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GM INHERITED;
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//////////////////////////////////////////////////////////////////////////////
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* MyFactory(void*) { return new StrokesGM; }
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry reg(MyFactory);
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* MyFactory2(void*) { return new Strokes2GM; }
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry reg2(MyFactory2);
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
150