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 */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h" 90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h" 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPath.h" 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h" 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass ComplexClipView : public SampleView { 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic: 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ComplexClipView() { 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger this->setBGColor(0xFFA0DDA0); 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected: 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // overrides from SkEventSink 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual bool onQuery(SkEvent* evt) { 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (SampleCode::TitleQ(*evt)) { 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SampleCode::TitleR(evt, "ComplexClip"); 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return this->INHERITED::onQuery(evt); 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger virtual void onDrawContent(SkCanvas* canvas) { 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPath path; 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.moveTo(SkIntToScalar(0), SkIntToScalar(50)); 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0)); 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.lineTo(SkIntToScalar(175), SkIntToScalar(0)); 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25)); 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.lineTo(SkIntToScalar(200), SkIntToScalar(150)); 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200)); 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.lineTo(SkIntToScalar(0), SkIntToScalar(200)); 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.close(); 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.moveTo(SkIntToScalar(50), SkIntToScalar(50)); 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.lineTo(SkIntToScalar(150), SkIntToScalar(50)); 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.lineTo(SkIntToScalar(150), SkIntToScalar(125)); 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150)); 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.lineTo(SkIntToScalar(50), SkIntToScalar(150)); 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.close(); 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger path.setFillType(SkPath::kEvenOdd_FillType); 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColor pathColor = SK_ColorBLACK; 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint pathPaint; 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pathPaint.setAntiAlias(true); 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger pathPaint.setColor(pathColor); 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPath clipA; 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20)); 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22)); 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105)); 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177)); 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180)); 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipA.close(); 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColor colorA = SK_ColorCYAN; 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPath clipB; 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10)); 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15)); 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190)); 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185)); 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100)); 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipB.close(); 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkColor colorB = SK_ColorRED; 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPaint paint; 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setAntiAlias(true); 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStyle(SkPaint::kStroke_Style); 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setStrokeWidth(0); 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(10),SkIntToScalar(10)); 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPath(path, pathPaint); 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(colorA); 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPath(clipA, paint); 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(colorB); 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPath(clipB, paint); 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static const struct { 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRegion::Op fOp; 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const char* fName; 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } gOps[] = { //extra spaces in names for measureText 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger {SkRegion::kIntersect_Op, "Isect "}, 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger {SkRegion::kDifference_Op, "Diff " }, 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger {SkRegion::kUnion_Op, "Union "}, 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger {SkRegion::kXOR_Op, "Xor " }, 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger {SkRegion::kReverseDifference_Op, "RDiff "} 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger }; 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, SkIntToScalar(40)); 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4); 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (int invA = 0; invA < 2; ++invA) { 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) { 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int idx = invA * SK_ARRAY_COUNT(gOps) + op; 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger if (!(idx % 3)) { 1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(0, SkIntToScalar(250)); 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->save(); 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // set clip 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType : 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkPath::kEvenOdd_FillType); 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->clipPath(clipA); 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->clipPath(clipB, gOps[op].fOp); 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // draw path clipped 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPath(path, pathPaint); 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // draw path in hairline 1170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(pathColor); 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPath(path, paint); 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // draw clips in hair line 1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(colorA); 1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPath(clipA, paint); 1230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(colorB); 1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawPath(clipB, paint); 1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setTextSize(SkIntToScalar(20)); 1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkScalar txtX = SkIntToScalar(55); 1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(colorA); 1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger const char* aTxt = invA ? "InverseA " : "A "; 1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText(aTxt, strlen(aTxt), txtX, SkIntToScalar(220), paint); 1320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger txtX += paint.measureText(aTxt, strlen(aTxt)); 1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(SK_ColorBLACK); 1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText(gOps[op].fName, strlen(gOps[op].fName), 1350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger txtX, SkIntToScalar(220), paint); 1360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName)); 1370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger paint.setColor(colorB); 1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->drawText("B", 1, txtX, SkIntToScalar(220), paint); 1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->translate(SkIntToScalar(250),0); 1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger canvas->restore(); 1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate: 1470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger typedef SampleView INHERITED; 1480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}; 1490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 1510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new ComplexClipView; } 1530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory); 1540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 155