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 "SkView.h"
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h"
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCornerPathEffect.h"
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCullPoints.h"
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkGradientShader.h"
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkPath.h"
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkRegion.h"
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkShader.h"
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkUtils.h"
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass FillTypeView : public SampleView {
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkPath fPath;
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger	FillTypeView() {
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const SkScalar radius = SkIntToScalar(45);
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fPath.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius);
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius);
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        this->setBGColor(0xFFDDDDDD);
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // overrides from SkEventSink
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onQuery(SkEvent* evt) {
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (SampleCode::TitleQ(*evt)) {
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            SampleCode::TitleR(evt, "FillType");
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return true;
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return this->INHERITED::onQuery(evt);
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft,
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                  SkScalar scale, const SkPaint& paint) {
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) };
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->save();
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->clipRect(r);
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawColor(SK_ColorWHITE);
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fPath.setFillType(ft);
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(r.centerX(), r.centerY());
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->scale(scale, scale);
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(-r.centerX(), -r.centerY());
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawPath(fPath, paint);
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->restore();
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void showFour(SkCanvas* canvas, SkScalar scale, const SkPaint& paint) {
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        showPath(canvas,   0,   0, SkPath::kWinding_FillType,
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                 scale, paint);
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        showPath(canvas, 200,   0, SkPath::kEvenOdd_FillType,
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                 scale, paint);
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        showPath(canvas,  00, 200, SkPath::kInverseWinding_FillType,
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                 scale, paint);
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        showPath(canvas, 200, 200, SkPath::kInverseEvenOdd_FillType,
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                 scale, paint);
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void onDrawContent(SkCanvas* canvas) {
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPaint paint;
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        const SkScalar scale = SkIntToScalar(5)/4;
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setAntiAlias(false);
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setColor(0x8000FF00);
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        showFour(canvas, SK_Scalar1, paint);
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(450), 0);
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        showFour(canvas, scale, paint);
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setAntiAlias(true);
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(-450), SkIntToScalar(450));
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        showFour(canvas, SK_Scalar1, paint);
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->translate(SkIntToScalar(450), 0);
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        showFour(canvas, scale, paint);
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef SampleView INHERITED;
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new FillTypeView; }
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory);
970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
98