1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 87239aab311e180960e48de8586b03e261741cc14bsalomon@google.com#include "SampleCode.h" 97239aab311e180960e48de8586b03e261741cc14bsalomon@google.com#include "SkCanvas.h" 107239aab311e180960e48de8586b03e261741cc14bsalomon@google.com#include "SkPath.h" 117239aab311e180960e48de8586b03e261741cc14bsalomon@google.com#include "SkView.h" 127239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 13961ddb04a0a7aba843032d829ab867518e52559ereed@google.comclass ComplexClipView : public SampleView { 147239aab311e180960e48de8586b03e261741cc14bsalomon@google.compublic: 15ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com ComplexClipView() { 16961ddb04a0a7aba843032d829ab867518e52559ereed@google.com this->setBGColor(0xFFA0DDA0); 177239aab311e180960e48de8586b03e261741cc14bsalomon@google.com } 1855b6b58d8f6e7529c9b9cea606a6e3637c8e2e39reed@google.com 197239aab311e180960e48de8586b03e261741cc14bsalomon@google.comprotected: 207239aab311e180960e48de8586b03e261741cc14bsalomon@google.com // overrides from SkEventSink 217239aab311e180960e48de8586b03e261741cc14bsalomon@google.com virtual bool onQuery(SkEvent* evt) { 227239aab311e180960e48de8586b03e261741cc14bsalomon@google.com if (SampleCode::TitleQ(*evt)) { 237239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SampleCode::TitleR(evt, "ComplexClip"); 247239aab311e180960e48de8586b03e261741cc14bsalomon@google.com return true; 257239aab311e180960e48de8586b03e261741cc14bsalomon@google.com } 267239aab311e180960e48de8586b03e261741cc14bsalomon@google.com return this->INHERITED::onQuery(evt); 277239aab311e180960e48de8586b03e261741cc14bsalomon@google.com } 2855b6b58d8f6e7529c9b9cea606a6e3637c8e2e39reed@google.com 29961ddb04a0a7aba843032d829ab867518e52559ereed@google.com virtual void onDrawContent(SkCanvas* canvas) { 307239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkPath path; 317239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.moveTo(SkIntToScalar(0), SkIntToScalar(50)); 327239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0)); 337239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.lineTo(SkIntToScalar(175), SkIntToScalar(0)); 347239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25)); 357239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.lineTo(SkIntToScalar(200), SkIntToScalar(150)); 367239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200)); 377239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.lineTo(SkIntToScalar(0), SkIntToScalar(200)); 387239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.close(); 397239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.moveTo(SkIntToScalar(50), SkIntToScalar(50)); 407239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.lineTo(SkIntToScalar(150), SkIntToScalar(50)); 417239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.lineTo(SkIntToScalar(150), SkIntToScalar(125)); 427239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150)); 437239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.lineTo(SkIntToScalar(50), SkIntToScalar(150)); 447239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.close(); 457239aab311e180960e48de8586b03e261741cc14bsalomon@google.com path.setFillType(SkPath::kEvenOdd_FillType); 467239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkColor pathColor = SK_ColorBLACK; 477239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkPaint pathPaint; 487239aab311e180960e48de8586b03e261741cc14bsalomon@google.com pathPaint.setAntiAlias(true); 497239aab311e180960e48de8586b03e261741cc14bsalomon@google.com pathPaint.setColor(pathColor); 507239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 517239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkPath clipA; 527239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20)); 537239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22)); 547239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105)); 557239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177)); 567239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180)); 577239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipA.close(); 587239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkColor colorA = SK_ColorCYAN; 597239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 607239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkPath clipB; 617239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10)); 627239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15)); 637239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190)); 647239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185)); 657239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100)); 667239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipB.close(); 677239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkColor colorB = SK_ColorRED; 687239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 697239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkPaint paint; 707239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setAntiAlias(true); 717239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 727239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setStyle(SkPaint::kStroke_Style); 737239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setStrokeWidth(0); 747239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 757239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->translate(SkIntToScalar(10),SkIntToScalar(10)); 767239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawPath(path, pathPaint); 777239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setColor(colorA); 787239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawPath(clipA, paint); 797239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setColor(colorB); 807239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawPath(clipB, paint); 817239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 827239aab311e180960e48de8586b03e261741cc14bsalomon@google.com static const struct { 837239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkRegion::Op fOp; 847239aab311e180960e48de8586b03e261741cc14bsalomon@google.com const char* fName; 857239aab311e180960e48de8586b03e261741cc14bsalomon@google.com } gOps[] = { //extra spaces in names for measureText 867239aab311e180960e48de8586b03e261741cc14bsalomon@google.com {SkRegion::kIntersect_Op, "Isect "}, 877239aab311e180960e48de8586b03e261741cc14bsalomon@google.com {SkRegion::kDifference_Op, "Diff " }, 887239aab311e180960e48de8586b03e261741cc14bsalomon@google.com {SkRegion::kUnion_Op, "Union "}, 897239aab311e180960e48de8586b03e261741cc14bsalomon@google.com {SkRegion::kXOR_Op, "Xor " }, 907239aab311e180960e48de8586b03e261741cc14bsalomon@google.com {SkRegion::kReverseDifference_Op, "RDiff "} 917239aab311e180960e48de8586b03e261741cc14bsalomon@google.com }; 927239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 937239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->translate(0, SkIntToScalar(40)); 947239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4); 957239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->save(); 967239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 97807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com for (int invA = 0; invA < 2; ++invA) { 9864cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) { 997fa2a65c0cfc714364490cb715171461143024e0reed@google.com size_t idx = invA * SK_ARRAY_COUNT(gOps) + op; 1007239aab311e180960e48de8586b03e261741cc14bsalomon@google.com if (!(idx % 3)) { 1017239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->restore(); 1027239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->translate(0, SkIntToScalar(250)); 1037239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->save(); 1047239aab311e180960e48de8586b03e261741cc14bsalomon@google.com } 1057239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->save(); 1067239aab311e180960e48de8586b03e261741cc14bsalomon@google.com // set clip 1077239aab311e180960e48de8586b03e261741cc14bsalomon@google.com clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType : 1087239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkPath::kEvenOdd_FillType); 1097239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->clipPath(clipA); 1107239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->clipPath(clipB, gOps[op].fOp); 1117239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 1127239aab311e180960e48de8586b03e261741cc14bsalomon@google.com // draw path clipped 1137239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawPath(path, pathPaint); 1147239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->restore(); 1157239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 1167239aab311e180960e48de8586b03e261741cc14bsalomon@google.com // draw path in hairline 1177239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setColor(pathColor); 1187239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawPath(path, paint); 1197239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 1207239aab311e180960e48de8586b03e261741cc14bsalomon@google.com // draw clips in hair line 1217239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setColor(colorA); 1227239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawPath(clipA, paint); 1237239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setColor(colorB); 1247239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawPath(clipB, paint); 1257239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 1267239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setTextSize(SkIntToScalar(20)); 1277239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 1287239aab311e180960e48de8586b03e261741cc14bsalomon@google.com SkScalar txtX = SkIntToScalar(55); 1297239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setColor(colorA); 1307239aab311e180960e48de8586b03e261741cc14bsalomon@google.com const char* aTxt = invA ? "InverseA " : "A "; 1317239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawText(aTxt, strlen(aTxt), txtX, SkIntToScalar(220), paint); 1327239aab311e180960e48de8586b03e261741cc14bsalomon@google.com txtX += paint.measureText(aTxt, strlen(aTxt)); 1337239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setColor(SK_ColorBLACK); 1347239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawText(gOps[op].fName, strlen(gOps[op].fName), 1357239aab311e180960e48de8586b03e261741cc14bsalomon@google.com txtX, SkIntToScalar(220), paint); 1367239aab311e180960e48de8586b03e261741cc14bsalomon@google.com txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName)); 1377239aab311e180960e48de8586b03e261741cc14bsalomon@google.com paint.setColor(colorB); 1387239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->drawText("B", 1, txtX, SkIntToScalar(220), paint); 1397239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 1407239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->translate(SkIntToScalar(250),0); 1417239aab311e180960e48de8586b03e261741cc14bsalomon@google.com } 1427239aab311e180960e48de8586b03e261741cc14bsalomon@google.com } 1437239aab311e180960e48de8586b03e261741cc14bsalomon@google.com canvas->restore(); 1447239aab311e180960e48de8586b03e261741cc14bsalomon@google.com } 1457239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 1467239aab311e180960e48de8586b03e261741cc14bsalomon@google.comprivate: 147961ddb04a0a7aba843032d829ab867518e52559ereed@google.com typedef SampleView INHERITED; 1487239aab311e180960e48de8586b03e261741cc14bsalomon@google.com}; 1497239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 1507239aab311e180960e48de8586b03e261741cc14bsalomon@google.com////////////////////////////////////////////////////////////////////////////// 1517239aab311e180960e48de8586b03e261741cc14bsalomon@google.com 1527239aab311e180960e48de8586b03e261741cc14bsalomon@google.comstatic SkView* MyFactory() { return new ComplexClipView; } 1537239aab311e180960e48de8586b03e261741cc14bsalomon@google.comstatic SkViewRegister reg(MyFactory); 154