1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkView.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkClipOpPriv.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ComplexClipView : public SampleView { 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ComplexClipView() { 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setBGColor(0xFFA0DDA0); 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // overrides from SkEventSink 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual bool onQuery(SkEvent* evt) { 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SampleCode::TitleQ(*evt)) { 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SampleCode::TitleR(evt, "ComplexClip"); 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->INHERITED::onQuery(evt); 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void onDrawContent(SkCanvas* canvas) { 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath path; 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.moveTo(SkIntToScalar(0), SkIntToScalar(50)); 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0)); 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.lineTo(SkIntToScalar(175), SkIntToScalar(0)); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25)); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.lineTo(SkIntToScalar(200), SkIntToScalar(150)); 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200)); 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.lineTo(SkIntToScalar(0), SkIntToScalar(200)); 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.close(); 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.moveTo(SkIntToScalar(50), SkIntToScalar(50)); 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.lineTo(SkIntToScalar(150), SkIntToScalar(50)); 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.lineTo(SkIntToScalar(150), SkIntToScalar(125)); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150)); 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.lineTo(SkIntToScalar(50), SkIntToScalar(150)); 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.close(); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.setFillType(SkPath::kEvenOdd_FillType); 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor pathColor = SK_ColorBLACK; 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint pathPaint; 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pathPaint.setAntiAlias(true); 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pathPaint.setColor(pathColor); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath clipA; 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20)); 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22)); 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105)); 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177)); 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180)); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipA.close(); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colorA = SK_ColorCYAN; 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath clipB; 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10)); 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15)); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190)); 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185)); 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100)); 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipB.close(); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colorB = SK_ColorRED; 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(true); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStyle(SkPaint::kStroke_Style); 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStrokeWidth(0); 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(SkIntToScalar(10),SkIntToScalar(10)); 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(path, pathPaint); 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(colorA); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(clipA, paint); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(colorB); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(clipB, paint); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const struct { 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkClipOp fOp; 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* fName; 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } gOps[] = { //extra spaces in names for measureText 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {kIntersect_SkClipOp, "Isect "}, 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {kDifference_SkClipOp, "Diff " }, 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {kUnion_SkClipOp, "Union "}, 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {kXOR_SkClipOp, "Xor " }, 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {kReverseDifference_SkClipOp, "RDiff "} 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(0, SkIntToScalar(40)); 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4); 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int invA = 0; invA < 2; ++invA) { 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) { 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t idx = invA * SK_ARRAY_COUNT(gOps) + op; 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!(idx % 3)) { 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(0, SkIntToScalar(250)); 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // set clip 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType : 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath::kEvenOdd_FillType); 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipPath(clipA); 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipPath(clipB, gOps[op].fOp); 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // draw path clipped 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(path, pathPaint); 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // draw path in hairline 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(pathColor); 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(path, paint); 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // draw clips in hair line 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(colorA); 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(clipA, paint); 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(colorB); 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(clipB, paint); 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setTextSize(SkIntToScalar(20)); 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar txtX = SkIntToScalar(55); 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(colorA); 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* aTxt = invA ? "InverseA " : "A "; 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawString(aTxt, txtX, SkIntToScalar(220), paint); 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot txtX += paint.measureText(aTxt, strlen(aTxt)); 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(SK_ColorBLACK); 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawString(gOps[op].fName, 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot txtX, SkIntToScalar(220), paint); 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName)); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(colorB); 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawString("B", txtX, SkIntToScalar(220), paint); 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(SkIntToScalar(250),0); 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef SampleView INHERITED; 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkView* MyFactory() { return new ComplexClipView; } 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkViewRegister reg(MyFactory); 155