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