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