strokes.cpp revision 1cab2921ab279367f8206cdadc9259d12e603548
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