192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org/* 292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org * Copyright 2013 Google Inc. 392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org * 492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org * found in the LICENSE file. 692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org */ 792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org#include "gm.h" 992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org#include "SkCanvas.h" 1092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org#include "SkPath.h" 1192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 1292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgnamespace skiagm { 1392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 1492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgstatic SkPath generate_square(SkScalar cx, SkScalar cy, SkScalar w) { 1592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkRect rect = SkRect::MakeXYWH(cx - w / 2, cy - w / 2, w, w); 1692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPath path; 1792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org path.addRect(rect); 1892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org return path; 1992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org} 2092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 2192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgstatic SkPath generate_rect_line(SkScalar cx, SkScalar cy, SkScalar l) { 2292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkRect rect = SkRect::MakeXYWH(cx - l / 2, cy, l, 0); 2392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPath path; 2492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org path.addRect(rect); 2592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org return path; 2692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org} 2792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 2892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgstatic SkPath generate_circle(SkScalar cx, SkScalar cy, SkScalar d) { 2992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPath path; 3092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org path.addCircle(cx, cy, d/2, SkPath::kCW_Direction); 3192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org return path; 3292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org} 3392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 3492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgstatic SkPath generate_line(SkScalar cx, SkScalar cy, SkScalar l) { 3592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPath path; 3692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org path.moveTo(cx - l / 2, cy); 3792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org path.lineTo(cx + l / 2, cy); 3892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org return path; 3992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org} 4092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 4192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgSkPaint::Style styles[] = { 4292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPaint::kStroke_Style, 4392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPaint::kStrokeAndFill_Style, 4492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPaint::kFill_Style 4592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}; 4692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgSkScalar pathSizes[] = { 4792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 40, 4892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 10, 4992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 0 5092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}; 5192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgSkScalar strokeWidths[] = { 5292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 10, 5392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 0 5492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}; 5592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgSkPath ((*paths[])(SkScalar, SkScalar, SkScalar)) = { 5692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org generate_square, 5792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org generate_rect_line, 5892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org generate_circle, 5992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org generate_line 6092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}; 6192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 6292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgconst SkScalar slideWidth = 90, slideHeight = 90; 6392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgconst SkScalar slideBoundary = 5; 6492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 6592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 6692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgclass InversePathsGM : public GM { 6792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgpublic: 6892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org InversePathsGM() { 6992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 7092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org } 7192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 7292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgprotected: 73a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 74a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 75a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 76a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 7792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org virtual SkString onShortName() { 7892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org return SkString("inverse_paths"); 7992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org } 8092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 8192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org virtual SkISize onISize() { 82f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(800, 900); 8392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org } 8492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 8592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) { 8692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkScalar cx = slideWidth / 2 + slideBoundary; 8792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkScalar cy = slideHeight / 2 + slideBoundary; 8892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkScalar dx = slideWidth + 2 * slideBoundary; 8992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkScalar dy = slideHeight + 2 * slideBoundary; 9092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 9192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkRect clipRect = SkRect::MakeLTRB(slideBoundary, slideBoundary, 9292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org slideBoundary + slideWidth, 9392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org slideBoundary + slideHeight); 9492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPaint clipPaint; 9592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org clipPaint.setStyle(SkPaint::kStroke_Style); 9692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org clipPaint.setStrokeWidth(SkIntToScalar(2)); 9792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 9892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPaint outlinePaint; 9992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org outlinePaint.setColor(0x40000000); 10092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org outlinePaint.setStyle(SkPaint::kStroke_Style); 10192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org outlinePaint.setStrokeWidth(SkIntToScalar(0)); 10292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 10392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org for (size_t styleIndex = 0; styleIndex < SK_ARRAY_COUNT(styles); 10492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org styleIndex++) { 10592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org for (size_t sizeIndex = 0; sizeIndex < SK_ARRAY_COUNT(pathSizes); 10692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org sizeIndex++) { 10792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkScalar size = pathSizes[sizeIndex]; 10892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 10992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->save(); 11092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 11192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org for (size_t widthIndex = 0; 11292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org widthIndex < SK_ARRAY_COUNT(strokeWidths); 11392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org widthIndex++) { 11492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPaint paint; 11592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org paint.setColor(0xff007000); 11692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org paint.setStrokeWidth(strokeWidths[widthIndex]); 11792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org paint.setStyle(styles[styleIndex]); 11892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 11992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org for (size_t pathIndex = 0; 12092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org pathIndex < SK_ARRAY_COUNT(paths); 12192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org pathIndex++) { 12292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->drawRect(clipRect, clipPaint); 12392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 12492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->save(); 12592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->clipRect(clipRect); 12692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 12792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org SkPath path = paths[pathIndex](cx, cy, size); 12892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org path.setFillType(SkPath::kInverseWinding_FillType); 12992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->drawPath(path, paint); 13092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 13192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org path.setFillType(SkPath::kWinding_FillType); 13292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->drawPath(path, outlinePaint); 13392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 13492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->restore(); 13592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->translate(dx, 0); 13692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org } 13792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org } 13892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 13992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->restore(); 14092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org canvas->translate(0, dy); 14192ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org } 14292ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org } 14392ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org } 14492ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 14592ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgprivate: 14692ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org typedef GM INHERITED; 14792ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org}; 14892ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org 14992ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.orgDEF_GM( return new InversePathsGM; ) 15092ffe7d10ef5db05f1f4ffef0cfe898169ba13bfcommit-bot@chromium.org} 151