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#include "gm.h" 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPaint.h" 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRandom.h" 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm { 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass EmptyPathGM : public GM { 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger EmptyPathGM() {} 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkString onShortName() { 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return SkString("emptypath"); 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkISize onISize() { return make_isize(600, 280); } 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void drawEmpty(SkCanvas* canvas, 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColor color, 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRect& clip, 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint::Style style, 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath::FillType fill) { 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath path; 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger path.setFillType(fill); 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint paint; 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setColor(color); 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger paint.setStyle(style); 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->clipRect(clip); 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawPath(path, paint); 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDraw(SkCanvas* canvas) { 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger struct FillAndName { 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath::FillType fFill; 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const char* fName; 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static const FillAndName gFills[] = { 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger {SkPath::kWinding_FillType, "Winding"}, 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger {SkPath::kEvenOdd_FillType, "Even / Odd"}, 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger {SkPath::kInverseWinding_FillType, "Inverse Winding"}, 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"}, 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger struct StyleAndName { 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint::Style fStyle; 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const char* fName; 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger static const StyleAndName gStyles[] = { 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger {SkPaint::kFill_Style, "Fill"}, 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger {SkPaint::kStroke_Style, "Stroke"}, 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"}, 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint titlePaint; 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger titlePaint.setColor(SK_ColorBLACK); 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger titlePaint.setAntiAlias(true); 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger titlePaint.setLCDRenderText(true); 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger titlePaint.setTextSize(15 * SK_Scalar1); 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const char title[] = "Empty Paths Drawn Into Rectangle Clips With " 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger "Indicated Style and Fill"; 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawText(title, strlen(title), 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20 * SK_Scalar1, 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20 * SK_Scalar1, 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger titlePaint); 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRandom rand; 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1); 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int i = 0; 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(10 * SK_Scalar1, 0); 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) { 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) { 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger if (0 == i % 4) { 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(0, rect.height() + 40 * SK_Scalar1); 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->save(); 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } else { 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->translate(rect.width() + 40 * SK_Scalar1, 0); 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger ++i; 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkColor color = rand.nextU(); 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger color = 0xff000000| color; // force solid 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger this->drawEmpty(canvas, color, rect, 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger gStyles[style].fStyle, gFills[fill].fFill); 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint rectPaint; 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger rectPaint.setColor(SK_ColorBLACK); 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger rectPaint.setStyle(SkPaint::kStroke_Style); 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger rectPaint.setStrokeWidth(-1); 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger rectPaint.setAntiAlias(true); 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawRect(rect, rectPaint); 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPaint labelPaint; 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger labelPaint.setColor(color); 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger labelPaint.setAntiAlias(true); 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger labelPaint.setLCDRenderText(true); 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger labelPaint.setTextSize(12 * SK_Scalar1); 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawText(gStyles[style].fName, 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger strlen(gStyles[style].fName), 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 0, rect.height() + 15 * SK_Scalar1, 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger labelPaint); 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->drawText(gFills[fill].fName, 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger strlen(gFills[fill].fName), 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 0, rect.height() + 28 * SK_Scalar1, 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger labelPaint); 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger canvas->restore(); 1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger } 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger typedef GM INHERITED; 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////////////////////////////////////////////////////////////////////////////// 1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* MyFactory(void*) { return new EmptyPathGM; } 1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry reg(MyFactory); 1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger} 134