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#include "gm.h"
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkCanvas.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPaint.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRandom.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm {
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass EmptyPathGM : public GM {
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    EmptyPathGM() {}
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkString onShortName() {
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkString("emptypath");
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkISize onISize() { return make_isize(600, 280); }
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void drawEmpty(SkCanvas* canvas,
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkColor color,
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    const SkRect& clip,
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkPaint::Style style,
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkPath::FillType fill) {
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPath path;
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.setFillType(fill);
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setColor(color);
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setStyle(style);
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->clipRect(clip);
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawPath(path, paint);
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct FillAndName {
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPath::FillType fFill;
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char*      fName;
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const FillAndName gFills[] = {
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kWinding_FillType, "Winding"},
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kEvenOdd_FillType, "Even / Odd"},
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kInverseWinding_FillType, "Inverse Winding"},
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"},
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        struct StyleAndName {
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkPaint::Style fStyle;
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char*    fName;
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const StyleAndName gStyles[] = {
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kFill_Style, "Fill"},
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kStroke_Style, "Stroke"},
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            {SkPaint::kStrokeAndFill_Style, "Stroke And Fill"},
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        };
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint titlePaint;
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setColor(SK_ColorBLACK);
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setAntiAlias(true);
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setLCDRenderText(true);
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        titlePaint.setTextSize(15 * SK_Scalar1);
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const char title[] = "Empty Paths Drawn Into Rectangle Clips With "
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             "Indicated Style and Fill";
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawText(title, strlen(title),
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            20 * SK_Scalar1,
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            20 * SK_Scalar1,
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            titlePaint);
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRandom rand;
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRect rect = SkRect::MakeWH(100*SK_Scalar1, 30*SK_Scalar1);
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int i = 0;
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(10 * SK_Scalar1, 0);
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (size_t style = 0; style < SK_ARRAY_COUNT(gStyles); ++style) {
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            for (size_t fill = 0; fill < SK_ARRAY_COUNT(gFills); ++fill) {
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (0 == i % 4) {
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->restore();
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->translate(0, rect.height() + 40 * SK_Scalar1);
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->save();
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                } else {
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->translate(rect.width() + 40 * SK_Scalar1, 0);
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                ++i;
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkColor color = rand.nextU();
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                color = 0xff000000| color; // force solid
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                this->drawEmpty(canvas, color, rect,
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                gStyles[style].fStyle, gFills[fill].fFill);
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkPaint rectPaint;
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rectPaint.setColor(SK_ColorBLACK);
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rectPaint.setStyle(SkPaint::kStroke_Style);
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rectPaint.setStrokeWidth(-1);
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rectPaint.setAntiAlias(true);
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->drawRect(rect, rectPaint);
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkPaint labelPaint;
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                labelPaint.setColor(color);
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                labelPaint.setAntiAlias(true);
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                labelPaint.setLCDRenderText(true);
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                labelPaint.setTextSize(12 * SK_Scalar1);
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->drawText(gStyles[style].fName,
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 strlen(gStyles[style].fName),
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 0, rect.height() + 15 * SK_Scalar1,
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 labelPaint);
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->drawText(gFills[fill].fName,
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 strlen(gFills[fill].fName),
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 0, rect.height() + 28 * SK_Scalar1,
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 labelPaint);
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GM INHERITED;
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//////////////////////////////////////////////////////////////////////////////
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* MyFactory(void*) { return new EmptyPathGM; }
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry reg(MyFactory);
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
134