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" 833d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 9df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel#include "SkCanvas.h" 10df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel#include "SkPath.h" 11df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 12df795036fdff68d0c3e1d53d50e1e3777df88668egdanielnamespace skiagm { 13df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 14dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gPathColor = SK_ColorYELLOW; 15df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 16df795036fdff68d0c3e1d53d50e1e3777df88668egdanielclass ComplexClip3GM : public GM { 17df795036fdff68d0c3e1d53d50e1e3777df88668egdanielpublic: 18df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel ComplexClip3GM(bool doSimpleClipFirst) 19df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel : fDoSimpleClipFirst(doSimpleClipFirst) { 2065cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 21df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 22df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 23df795036fdff68d0c3e1d53d50e1e3777df88668egdanielprotected: 24df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 25df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkString onShortName() { 26df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkString str; 27df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel str.printf("complexclip3_%s", fDoSimpleClipFirst ? "simple" : "complex"); 28df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel return str; 299d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary } 30df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 31df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkISize onISize() { return SkISize::Make(1000, 950); } 32df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 33df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel virtual void onDraw(SkCanvas* canvas) { 34df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath clipSimple; 35df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel clipSimple.addCircle(SkIntToScalar(70), SkIntToScalar(50), SkIntToScalar(20)); 36df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 37df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkRect r1 = { 10, 20, 70, 80 }; 38df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath clipComplex; 39df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel clipComplex.moveTo(SkIntToScalar(40), SkIntToScalar(50)); 40df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel clipComplex.arcTo(r1, SkIntToScalar(30), SkIntToScalar(300), false); 41df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel clipComplex.close(); 42df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 43df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath* firstClip = &clipSimple; 44df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath* secondClip = &clipComplex; 45df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 46df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel if (!fDoSimpleClipFirst) { 47df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkTSwap<SkPath*>(firstClip, secondClip); 48df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } 49df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 50df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPaint paint; 51df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel paint.setAntiAlias(true); 521818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark sk_tool_utils::set_portable_typeface(&paint); 53df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel paint.setTextSize(SkIntToScalar(20)); 54df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 55dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein constexpr struct { 56c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed SkClipOp fOp; 57c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed const char* fName; 58df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel } gOps[] = { 59c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kIntersect_SkClipOp, "I"}, 60c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kDifference_SkClipOp, "D" }, 61c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kUnion_SkClipOp, "U"}, 62c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kXOR_SkClipOp, "X" }, 63c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kReverseDifference_SkClipOp, "R"} 64df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel }; 65df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 66df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 67df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4); 68df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 69df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPaint pathPaint; 70df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel pathPaint.setAntiAlias(true); 71df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel pathPaint.setColor(gPathColor); 72df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 73df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel for (int invA = 0; invA < 2; ++invA) { 74df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel for (int aaBits = 0; aaBits < 4; ++aaBits) { 75df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->save(); 76df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) { 77df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel for (int invB = 0; invB < 2; ++invB) { 78df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel bool doAAA = SkToBool(aaBits & 1); 79df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel bool doAAB = SkToBool(aaBits & 2); 80df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel bool doInvA = SkToBool(invA); 81df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel bool doInvB = SkToBool(invB); 82df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->save(); 83df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel // set clip 84df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel firstClip->setFillType(doInvA ? SkPath::kInverseEvenOdd_FillType : 85df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath::kEvenOdd_FillType); 86df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel secondClip->setFillType(doInvB ? SkPath::kInverseEvenOdd_FillType : 87df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkPath::kEvenOdd_FillType); 88669983856d99b9312be3166b7dd1f8483a90c315reed canvas->clipPath(*firstClip, doAAA); 89df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->clipPath(*secondClip, gOps[op].fOp, doAAB); 90df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 91df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel // draw rect clipped 92df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkRect r = { 0, 0, 100, 100 }; 93df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->drawRect(r, pathPaint); 94df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel canvas->restore(); 95df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 96df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 97df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkScalar txtX = SkIntToScalar(10); 98df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel paint.setColor(SK_ColorBLACK); 99df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel SkString str; 100df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel str.printf("%s%s %s %s%s", doAAA ? "A" : "B", 101df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel doInvA ? "I" : "N", 102df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel gOps[op].fName, 103df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel doAAB ? "A" : "B", 104df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel doInvB ? "I" : "N"); 105df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel 1062a475eae622adc1e8fa29206be1eaf862c23548eCary Clark canvas->drawString(str.c_str(), txtX, SkIntToScalar(130), 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