1603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com/* 2603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com * Copyright 2012 Google Inc. 3603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com * 4603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com * Use of this source code is governed by a BSD-style license that can be 5603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com * found in the LICENSE file. 6603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com */ 7603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 8603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com#include "gm.h" 9603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com#include "SkCanvas.h" 10603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com#include "SkPath.h" 11603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 12603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com#define STROKE_WIDTH SkIntToScalar(20) 13603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 149903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.comstatic void draw_path(SkCanvas* canvas, const SkPath& path, const SkRect& rect, 159903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com SkPaint::Join join, int doFill) { 16603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com SkPaint paint; 17603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setAntiAlias(true); 189903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com paint.setStyle(doFill ? SkPaint::kStrokeAndFill_Style : SkPaint::kStroke_Style); 19603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 20603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setColor(SK_ColorGRAY); 21603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setStrokeWidth(STROKE_WIDTH); 22603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setStrokeJoin(join); 23603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com canvas->drawRect(rect, paint); 24603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 259903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com paint.setStyle(SkPaint::kStroke_Style); 26603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setStrokeWidth(0); 27603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setColor(SK_ColorRED); 28603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com canvas->drawPath(path, paint); 29603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 30603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setStrokeWidth(3); 31603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setStrokeJoin(SkPaint::kMiter_Join); 32603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com int n = path.countPoints(); 33603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com SkAutoTArray<SkPoint> points(n); 34603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com path.getPoints(points.get(), n); 35603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com canvas->drawPoints(SkCanvas::kPoints_PointMode, n, points.get(), paint); 36603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com} 37603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 38603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com/* 39603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com * Test calling SkStroker for rectangles. Cases to cover: 40603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com * 41603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com * geometry: normal, small (smaller than stroke-width), empty, inverted 42603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com * joint-type for the corners 43603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com */ 44603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.comclass StrokeRectGM : public skiagm::GM { 45603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.compublic: 46603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com StrokeRectGM() {} 47603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 48603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.comprotected: 49a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 50a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 51a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 52a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 53603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com virtual SkString onShortName() { 54603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com return SkString("strokerect"); 55603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com } 56603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 57603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com virtual SkISize onISize() { 589903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com return SkISize::Make(1024, 740); 59603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com } 60603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 61603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com virtual void onDraw(SkCanvas* canvas) { 62603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com canvas->drawColor(SK_ColorWHITE); 63603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com canvas->translate(STROKE_WIDTH*3/2, STROKE_WIDTH*3/2); 64603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 65603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com SkPaint paint; 66603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setStyle(SkPaint::kStroke_Style); 67603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com paint.setStrokeWidth(STROKE_WIDTH); 68603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 69603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com static const SkPaint::Join gJoins[] = { 70603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com SkPaint::kMiter_Join, SkPaint::kRound_Join, SkPaint::kBevel_Join 71603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com }; 72603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 73603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com static const SkScalar W = 80; 749903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com static const SkScalar H = 80; 75603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com static const SkRect gRects[] = { 76603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com { 0, 0, W, H }, 77603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com { W, 0, 0, H }, 78603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com { 0, H, W, 0 }, 79603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com { 0, 0, STROKE_WIDTH, H }, 80603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com { 0, 0, W, STROKE_WIDTH }, 81603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com { 0, 0, STROKE_WIDTH/2, STROKE_WIDTH/2 }, 82603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com { 0, 0, W, 0 }, 83603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com { 0, 0, 0, H }, 84603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com { 0, 0, 0, 0 }, 85603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com }; 86603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 879903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com for (int doFill = 0; doFill <= 1; ++doFill) { 889903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gJoins); ++i) { 899903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com SkPaint::Join join = gJoins[i]; 909903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com paint.setStrokeJoin(join); 919903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com 929903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com SkAutoCanvasRestore acr(canvas, true); 939903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com for (size_t j = 0; j < SK_ARRAY_COUNT(gRects); ++j) { 949903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com const SkRect& r = gRects[j]; 95603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 969903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com SkPath path, fillPath; 979903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com path.addRect(r); 989903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com paint.getFillPath(path, &fillPath); 999903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com draw_path(canvas, fillPath, r, join, doFill); 100603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 1019903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com canvas->translate(W + 2 * STROKE_WIDTH, 0); 1029903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com } 1039903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com acr.restore(); 1049903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com canvas->translate(0, H + 2 * STROKE_WIDTH); 105603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com } 1069903395a5a9c813f1ae207e4d4a2429e5c085266reed@google.com paint.setStyle(SkPaint::kStrokeAndFill_Style); 107603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com } 108603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com } 109603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 110603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.comprivate: 111603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com typedef GM INHERITED; 112603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com}; 113603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 114603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com/////////////////////////////////////////////////////////////////////////////////////////////////// 115603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.com 116603dbedf293839e6707e2d4dfdd3949b06f9762creed@google.comDEF_GM(return new StrokeRectGM;) 117