complexclip3.cpp revision 669983856d99b9312be3166b7dd1f8483a90c315
1df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel/* 2df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel * Copyright 2014 Google Inc. 3df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel * 4df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel * Use of this source code is governed by a BSD-style license that can be 5df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel * found in the LICENSE file. 6df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel */ 7df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel#include "gm.h" 8df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel#include "SkCanvas.h" 9df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel#include "SkPath.h" 10df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 11df795036fdff68d0c3e1d53d50e1e3777df88668egdanielnamespace skiagm { 12df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 13dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gPathColor = SK_ColorYELLOW; 14df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 15df795036fdff68d0c3e1d53d50e1e3777df88668egdanielclass ComplexClip3GM : public GM { 16df795036fdff68d0c3e1d53d50e1e3777df88668egdanielpublic: 17df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel ComplexClip3GM(bool doSimpleClipFirst) 18df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel : fDoSimpleClipFirst(doSimpleClipFirst) { 1965cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 20df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 21df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 22df795036fdff68d0c3e1d53d50e1e3777df88668egdanielprotected: 23df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 24df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkString onShortName() { 25df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkString str; 26df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel str.printf("complexclip3_%s", fDoSimpleClipFirst ? "simple" : "complex"); 27df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel return str; 289d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary } 29df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 30df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkISize onISize() { return SkISize::Make(1000, 950); } 31df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 32df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel virtual void onDraw(SkCanvas* canvas) { 33df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath clipSimple; 34df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel clipSimple.addCircle(SkIntToScalar(70), SkIntToScalar(50), SkIntToScalar(20)); 35df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 36df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkRect r1 = { 10, 20, 70, 80 }; 37df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath clipComplex; 38df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel clipComplex.moveTo(SkIntToScalar(40), SkIntToScalar(50)); 39df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel clipComplex.arcTo(r1, SkIntToScalar(30), SkIntToScalar(300), false); 40df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel clipComplex.close(); 41df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 42df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath* firstClip = &clipSimple; 43df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath* secondClip = &clipComplex; 44df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 45df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel if (!fDoSimpleClipFirst) { 46df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkTSwap<SkPath*>(firstClip, secondClip); 47df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 48df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 49df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPaint paint; 50df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel paint.setAntiAlias(true); 511818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark sk_tool_utils::set_portable_typeface(&paint); 52df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel paint.setTextSize(SkIntToScalar(20)); 53df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 54dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein constexpr struct { 5573603f3c52ffd89fe9d035be827b566a0e7d3b79reed SkCanvas::ClipOp fOp; 5673603f3c52ffd89fe9d035be827b566a0e7d3b79reed const char* fName; 57df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } gOps[] = { 5873603f3c52ffd89fe9d035be827b566a0e7d3b79reed {SkCanvas::kIntersect_Op, "I"}, 5973603f3c52ffd89fe9d035be827b566a0e7d3b79reed {SkCanvas::kDifference_Op, "D" }, 6073603f3c52ffd89fe9d035be827b566a0e7d3b79reed {SkCanvas::kUnion_Op, "U"}, 6173603f3c52ffd89fe9d035be827b566a0e7d3b79reed {SkCanvas::kXOR_Op, "X" }, 6273603f3c52ffd89fe9d035be827b566a0e7d3b79reed {SkCanvas::kReverseDifference_Op, "R"} 63df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel }; 64df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 65df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 66df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4); 67df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 68df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPaint pathPaint; 69df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel pathPaint.setAntiAlias(true); 70df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel pathPaint.setColor(gPathColor); 71df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 72df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel for (int invA = 0; invA < 2; ++invA) { 73df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel for (int aaBits = 0; aaBits < 4; ++aaBits) { 74df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->save(); 75df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) { 76df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel for (int invB = 0; invB < 2; ++invB) { 77df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel bool doAAA = SkToBool(aaBits & 1); 78df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel bool doAAB = SkToBool(aaBits & 2); 79df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel bool doInvA = SkToBool(invA); 80df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel bool doInvB = SkToBool(invB); 81df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->save(); 82df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel // set clip 83df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel firstClip->setFillType(doInvA ? SkPath::kInverseEvenOdd_FillType : 84df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath::kEvenOdd_FillType); 85df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel secondClip->setFillType(doInvB ? SkPath::kInverseEvenOdd_FillType : 86df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath::kEvenOdd_FillType); 87669983856d99b9312be3166b7dd1f8483a90c315reed canvas->clipPath(*firstClip, doAAA); 88df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->clipPath(*secondClip, gOps[op].fOp, doAAB); 89df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 90df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel // draw rect clipped 91df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkRect r = { 0, 0, 100, 100 }; 92df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->drawRect(r, pathPaint); 93df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->restore(); 94df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 95df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 96df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkScalar txtX = SkIntToScalar(10); 97df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel paint.setColor(SK_ColorBLACK); 98df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkString str; 99df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel str.printf("%s%s %s %s%s", doAAA ? "A" : "B", 100df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel doInvA ? "I" : "N", 101df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel gOps[op].fName, 102df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel doAAB ? "A" : "B", 103df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel doInvB ? "I" : "N"); 104df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 105df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->drawText(str.c_str(), strlen(str.c_str()), txtX, SkIntToScalar(130), 106df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel paint); 107df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel if (doInvB) { 108df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->translate(SkIntToScalar(150),0); 109df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } else { 110df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->translate(SkIntToScalar(120),0); 111df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 112df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 113df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 114df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->restore(); 115df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->translate(0, SkIntToScalar(150)); 116df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 117df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 118df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 119df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 120df795036fdff68d0c3e1d53d50e1e3777df88668egdanielprivate: 121df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel bool fDoSimpleClipFirst; 122df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 123df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel typedef GM INHERITED; 124df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel}; 125df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 126df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel////////////////////////////////////////////////////////////////////////////// 127df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 128df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel// Simple clip first 129df795036fdff68d0c3e1d53d50e1e3777df88668egdanielDEF_GM( return new ComplexClip3GM(true); ) 130df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel// Complex clip first 131df795036fdff68d0c3e1d53d50e1e3777df88668egdanielDEF_GM( return new ComplexClip3GM(false); ) 132df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel} 133