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 */ 887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "gm.h" 987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkPicture.h" 1087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkRectShape.h" 1187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkGroupShape.h" 1287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 1387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergertypedef SkScalar (*MakePathProc)(SkPath*); 1487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 1587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_frame(SkPath* path) { 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect r = { SkIntToScalar(10), SkIntToScalar(10), 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIntToScalar(630), SkIntToScalar(470) }; 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path->addRoundRect(r, SkIntToScalar(15), SkIntToScalar(15)); 1987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 2087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkPaint paint; 2187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger paint.setStyle(SkPaint::kStroke_Style); 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStrokeWidth(SkIntToScalar(5)); 2387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger paint.getFillPath(*path, path); 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return SkIntToScalar(15); 2587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger} 2687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 2787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_triangle(SkPath* path) { 2887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger static const int gCoord[] = { 2987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 10, 20, 15, 5, 30, 30 3087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger }; 3187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 3287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 3387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 3487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->close(); 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path->offset(SkIntToScalar(10), SkIntToScalar(0)); 3687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger return SkIntToScalar(30); 3787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger} 3887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 3987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_rect(SkPath* path) { 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect r = { SkIntToScalar(10), SkIntToScalar(10), 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIntToScalar(30), SkIntToScalar(30) }; 4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->addRect(r); 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path->offset(SkIntToScalar(10), SkIntToScalar(0)); 4487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger return SkIntToScalar(30); 4587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger} 4687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 4787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_oval(SkPath* path) { 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect r = { SkIntToScalar(10), SkIntToScalar(10), 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkIntToScalar(30), SkIntToScalar(30) }; 5087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->addOval(r); 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path->offset(SkIntToScalar(10), SkIntToScalar(0)); 5287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger return SkIntToScalar(30); 5387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger} 5487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 5587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_sawtooth(SkPath* path) { 5687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkScalar x = SkIntToScalar(20); 5787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkScalar y = SkIntToScalar(20); 5887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger const SkScalar x0 = x; 5987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger const SkScalar dx = SK_Scalar1 * 5; 6087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger const SkScalar dy = SK_Scalar1 * 10; 6187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 6287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->moveTo(x, y); 6387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger for (int i = 0; i < 32; i++) { 6487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger x += dx; 6587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->lineTo(x, y - dy); 6687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger x += dx; 6787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->lineTo(x, y + dy); 6887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger } 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path->lineTo(x, y + (2 * dy)); 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path->lineTo(x0, y + (2 * dy)); 7187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->close(); 7287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger return SkIntToScalar(30); 7387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger} 7487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 7587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_star(SkPath* path, int n) { 7687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger const SkScalar c = SkIntToScalar(45); 7787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger const SkScalar r = SkIntToScalar(20); 7887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 7987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkScalar rad = -SK_ScalarPI / 2; 8087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n; 8187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 8287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->moveTo(c, c - r); 8387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger for (int i = 1; i < n; i++) { 8487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger rad += drad; 8587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV); 8687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r)); 8787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger } 8887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger path->close(); 8987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger return r * 2 * 6 / 5; 9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger} 9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 9287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_star_5(SkPath* path) { return make_star(path, 5); } 9387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_star_13(SkPath* path) { return make_star(path, 13); } 9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 9587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic const MakePathProc gProcs[] = { 9687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger make_frame, 9787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger make_triangle, 9887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger make_rect, 9987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger make_oval, 10087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger make_sawtooth, 10187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger make_star_5, 10287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger make_star_13 10387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}; 10487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 10587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#define N SK_ARRAY_COUNT(gProcs) 10687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 10787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergernamespace skiagm { 10887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 10987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerclass PathFillGM : public GM { 11087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkPath fPath[N]; 11187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkScalar fDY[N]; 11287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerpublic: 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger PathFillGM() { 11487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger for (size_t i = 0; i < N; i++) { 11587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger fDY[i] = gProcs[i](&fPath[i]); 11687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger } 11787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger } 11887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 11987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerprotected: 12087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger virtual SkString onShortName() { 12187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger return SkString("pathfill"); 12287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger } 12387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual SkISize onISize() { 12587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger return make_isize(640, 480); 12687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger } 12787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 12887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger virtual void onDraw(SkCanvas* canvas) { 12987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger SkPaint paint; 13087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger paint.setAntiAlias(true); 13187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 13287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger for (size_t i = 0; i < N; i++) { 13387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger canvas->drawPath(fPath[i], paint); 1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(0), fDY[i]); 13587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger } 13687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger } 13787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 13887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerprivate: 13987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger typedef GM INHERITED; 14087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}; 14187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 14287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger/////////////////////////////////////////////////////////////////////////////// 14387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 14487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic GM* MyFactory(void*) { return new PathFillGM; } 14587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic GMRegistry reg(MyFactory); 14687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 14787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger} 148