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 */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SampleCode.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkView.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGradientShader.h"
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGraphics.h"
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkImageDecoder.h"
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPath.h"
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRegion.h"
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkShader.h"
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkUtils.h"
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkXfermode.h"
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkColorPriv.h"
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkColorFilter.h"
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkParsePath.h"
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTime.h"
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTypeface.h"
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGeometry.h"
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass ConcavePathView : public SampleView {
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger	ConcavePathView() {}
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // overrides from SkEventSink
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onQuery(SkEvent* evt) {
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (SampleCode::TitleQ(*evt)) {
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SampleCode::TitleR(evt, "ConcavePaths");
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return true;
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this->INHERITED::onQuery(evt);
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDrawContent(SkCanvas* canvas) {
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setAntiAlias(true);
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStyle(SkPaint::kFill_Style);
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Concave test
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (1) {
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath path;
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(0, 0);
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawPath(path, paint);
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Reverse concave test
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (1) {
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath path;
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(100, 0);
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(30), SkIntToScalar(30));
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawPath(path, paint);
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Bowtie (intersection)
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (1) {
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath path;
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(200, 0);
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawPath(path, paint);
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // "fake" bowtie (concave, but no intersection)
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (1) {
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath path;
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(300, 0);
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(50), SkIntToScalar(40));
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(50), SkIntToScalar(60));
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawPath(path, paint);
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Fish test (intersection/concave)
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (1) {
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath path;
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(0, 100);
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(70), SkIntToScalar(50));
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(0), SkIntToScalar(50));
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawPath(path, paint);
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Collinear test
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (1) {
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath path;
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(100, 100);
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(50), SkIntToScalar(20));
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(50), SkIntToScalar(80));
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawPath(path, paint);
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Hole test
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (1) {
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath path;
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(200, 100);
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.moveTo(SkIntToScalar(20), SkIntToScalar(20));
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(20));
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(80), SkIntToScalar(80));
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(20), SkIntToScalar(80));
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.moveTo(SkIntToScalar(30), SkIntToScalar(30));
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(30), SkIntToScalar(70));
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(70), SkIntToScalar(70));
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            path.lineTo(SkIntToScalar(70), SkIntToScalar(30));
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawPath(path, paint);
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->inval(NULL);
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this->INHERITED::onFindClickHandler(x, y);
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SampleView INHERITED;
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//////////////////////////////////////////////////////////////////////////////
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkView* MyFactory() { return new ConcavePathView; }
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkViewRegister reg(MyFactory);
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
154