1fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 2fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com/* 3fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com * Copyright 2011 Google Inc. 4fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com * 5fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 6fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com * found in the LICENSE file. 7fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com */ 8fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com#include "gm.h" 9fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com#include "SkCanvas.h" 10fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com#include "SkPaint.h" 11fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com#include "SkRandom.h" 12fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 13fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comnamespace skiagm { 14fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 15fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comclass EmptyPathGM : public GM { 16fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.compublic: 17fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com EmptyPathGM() {} 18fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 19fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comprotected: 20fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkString onShortName() { 21fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com return SkString("emptypath"); 22fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com } 23ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 24f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina SkISize onISize() { return SkISize::Make(600, 280); } 25fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 26fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com void drawEmpty(SkCanvas* canvas, 27fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkColor color, 28fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com const SkRect& clip, 29fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkPaint::Style style, 30fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkPath::FillType fill) { 31fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkPath path; 32fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com path.setFillType(fill); 33fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkPaint paint; 34fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com paint.setColor(color); 35fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com paint.setStyle(style); 36fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->save(); 37fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->clipRect(clip); 38fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->drawPath(path, paint); 39fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->restore(); 40fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com } 41ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 42fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com virtual void onDraw(SkCanvas* canvas) { 43fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com struct FillAndName { 44fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkPath::FillType fFill; 45fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com const char* fName; 46fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com }; 47fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com static const FillAndName gFills[] = { 48fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com {SkPath::kWinding_FillType, "Winding"}, 49fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com {SkPath::kEvenOdd_FillType, "Even / Odd"}, 50fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com {SkPath::kInverseWinding_FillType, "Inverse Winding"}, 51fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"}, 52fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com }; 53fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com struct StyleAndName { 54fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkPaint::Style fStyle; 55fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com const char* fName; 56fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com }; 57fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com static const StyleAndName gStyles[] = { 58fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com {SkPaint::kFill_Style, "Fill"}, 59fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com {SkPaint::kStroke_Style, "Stroke"}, 60fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 61fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com }; 62fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 63fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkPaint titlePaint; 64fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com titlePaint.setColor(SK_ColorBLACK); 65fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com titlePaint.setAntiAlias(true); 66fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com titlePaint.setLCDRenderText(true); 67fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com titlePaint.setTextSize(15 * SK_Scalar1); 68fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com const char title[] = "Empty Paths Drawn Into Rectangle Clips With " 69fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com "Indicated Style and Fill"; 70fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->drawText(title, strlen(title), 71fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 20 * SK_Scalar1, 72fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 20 * SK_Scalar1, 73fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com titlePaint); 74fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 75e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkLCGRandom rand; 76fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 77fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com int i = 0; 78fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->save(); 79fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->translate(10 * SK_Scalar1, 0); 80fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->save(); 81f12449b5d2867ca653aa53ac58fc1148e7f0b636bsalomon@google.com for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) { 82f12449b5d2867ca653aa53ac58fc1148e7f0b636bsalomon@google.com for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) { 83fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com if (0 == i % 4) { 84fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->restore(); 85fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->translate(0, rect.height() + 40 * SK_Scalar1); 86fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->save(); 87fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com } else { 88fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 89fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com } 90fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com ++i; 91fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 92fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 93fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkColor color = rand.nextU(); 94fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com color = 0xff000000| color; // force solid 95fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com this->drawEmpty(canvas, color, rect, 96fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com gStyles[style].fStyle, gFills[fill].fFill); 97fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 98fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkPaint rectPaint; 99fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com rectPaint.setColor(SK_ColorBLACK); 100fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com rectPaint.setStyle(SkPaint::kStroke_Style); 101fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com rectPaint.setStrokeWidth(-1); 102fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com rectPaint.setAntiAlias(true); 103fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->drawRect(rect, rectPaint); 104fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 105fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com SkPaint labelPaint; 106fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com labelPaint.setColor(color); 107fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com labelPaint.setAntiAlias(true); 108fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com labelPaint.setLCDRenderText(true); 109fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com labelPaint.setTextSize(12 * SK_Scalar1); 110fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->drawText(gStyles[style].fName, 111fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com strlen(gStyles[style].fName), 112fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 0, rect.height() + 15 * SK_Scalar1, 113fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com labelPaint); 114fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->drawText(gFills[fill].fName, 115fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com strlen(gFills[fill].fName), 116fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 0, rect.height() + 28 * SK_Scalar1, 117fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com labelPaint); 118fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com } 119fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com } 120fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->restore(); 121fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com canvas->restore(); 122fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com } 123ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 124fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comprivate: 125fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com typedef GM INHERITED; 126fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com}; 127fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 128fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com////////////////////////////////////////////////////////////////////////////// 129fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 130fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comstatic GM* MyFactory(void*) { return new EmptyPathGM; } 131fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.comstatic GMRegistry reg(MyFactory); 132fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com 133fa6ac938e64fe11b442d05fe8a90ddac2d1951f9bsalomon@google.com} 134