10c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org/*
20c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org * Copyright 2013 Google Inc.
30c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org *
40c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be
50c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org * found in the LICENSE file.
60c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org */
70c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
80c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org#include "gm.h"
90c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org#include "SkCanvas.h"
100c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org#include "SkGradientShader.h"
112c326b7359272b149e8bc03a5a63fd6b52b0fe8cmike@reedtribe.org#include "SkRandom.h"
120c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
1385e143c33c214e54187aa28146aa7666961a0d17reed@google.comstatic SkShader* make_shader(SkScalar w, SkScalar h) {
1485e143c33c214e54187aa28146aa7666961a0d17reed@google.com    const SkColor colors[] = {
1585e143c33c214e54187aa28146aa7666961a0d17reed@google.com        SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE,
1685e143c33c214e54187aa28146aa7666961a0d17reed@google.com        SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW,
1785e143c33c214e54187aa28146aa7666961a0d17reed@google.com    };
1885e143c33c214e54187aa28146aa7666961a0d17reed@google.com    const SkPoint pts[] = { { w/4, 0 }, { 3*w/4, h } };
1985e143c33c214e54187aa28146aa7666961a0d17reed@google.com
2085e143c33c214e54187aa28146aa7666961a0d17reed@google.com    return SkGradientShader::CreateLinear(pts, colors, NULL,
210c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org                                          SK_ARRAY_COUNT(colors),
220c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org                                          SkShader::kMirror_TileMode);
230c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org}
240c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
250c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.orgclass VerticesGM : public skiagm::GM {
260c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    SkPoint     fPts[9];
270c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    SkPoint     fTexs[9];
280c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    SkColor     fColors[9];
290c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    SkShader*   fShader;
3060da8f39522a7523063f4a0f58d05285c695b562reed@google.com    unsigned    fAlpha;
310c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
320c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.orgpublic:
3360da8f39522a7523063f4a0f58d05285c695b562reed@google.com    VerticesGM(unsigned alpha) : fShader(NULL), fAlpha(alpha) {
340c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    }
350c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
360c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    virtual ~VerticesGM() {
370c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        SkSafeUnref(fShader);
380c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    }
390c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
400c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.orgprotected:
41a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
42a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
43a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
44a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
450c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    virtual void onOnceBeforeDraw() SK_OVERRIDE {
4685e143c33c214e54187aa28146aa7666961a0d17reed@google.com        const SkScalar X = 150;
4785e143c33c214e54187aa28146aa7666961a0d17reed@google.com        const SkScalar Y = 150;
4885e143c33c214e54187aa28146aa7666961a0d17reed@google.com
4985e143c33c214e54187aa28146aa7666961a0d17reed@google.com        fPts[0].set(0, 0);      fPts[1].set(X/2, 10);   fPts[2].set(X, 0);
5085e143c33c214e54187aa28146aa7666961a0d17reed@google.com        fPts[3].set(10, Y/2);   fPts[4].set(X/2, Y/2);  fPts[5].set(X-10, Y/2);
5185e143c33c214e54187aa28146aa7666961a0d17reed@google.com        fPts[6].set(0, Y);    fPts[7].set(X/2, Y-10);  fPts[8].set(X, Y);
520c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
5385e143c33c214e54187aa28146aa7666961a0d17reed@google.com        const SkScalar w = 200;
5485e143c33c214e54187aa28146aa7666961a0d17reed@google.com        const SkScalar h = 200;
550c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
560c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        fTexs[0].set(0, 0);     fTexs[1].set(w/2, 0);   fTexs[2].set(w, 0);
570c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        fTexs[3].set(0, h/2);   fTexs[4].set(w/2, h/2); fTexs[5].set(w, h/2);
580c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        fTexs[6].set(0, h);     fTexs[7].set(w/2, h);   fTexs[8].set(w, h);
590c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
600c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        fShader = make_shader(w, h);
610c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
620c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        SkRandom rand;
630c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        for (size_t i = 0; i < SK_ARRAY_COUNT(fColors); ++i) {
6485e143c33c214e54187aa28146aa7666961a0d17reed@google.com            fColors[i] = rand.nextU() | 0xFF000000;
650c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        }
660c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    }
670c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
680c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    virtual SkString onShortName() SK_OVERRIDE {
6960da8f39522a7523063f4a0f58d05285c695b562reed@google.com        SkString name("vertices");
7060da8f39522a7523063f4a0f58d05285c695b562reed@google.com        if (0xFF != fAlpha) {
7160da8f39522a7523063f4a0f58d05285c695b562reed@google.com            name.appendf("_%02X", fAlpha);
7260da8f39522a7523063f4a0f58d05285c695b562reed@google.com        }
7360da8f39522a7523063f4a0f58d05285c695b562reed@google.com        return name;
740c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    }
750c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
760c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    virtual SkISize onISize() SK_OVERRIDE {
7785e143c33c214e54187aa28146aa7666961a0d17reed@google.com        return SkISize::Make(600, 600);
780c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    }
790c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
800c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
8185e143c33c214e54187aa28146aa7666961a0d17reed@google.com        // start with the center of a 3x3 grid
820c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        static const uint16_t fan[] = {
830c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            4,
840c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            0, 1, 2, 5, 8, 7, 6, 3, 0
850c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        };
860c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
870c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        const struct {
880c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            const SkColor*  fColors;
890c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            const SkPoint*  fTexs;
900c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        } rec[] = {
910c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            { fColors,  NULL },
920c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            { NULL,     fTexs },
930c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            { fColors,  fTexs },
940c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        };
950c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
960c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        const SkXfermode::Mode modes[] = {
970c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            SkXfermode::kSrc_Mode,
980c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            SkXfermode::kDst_Mode,
990c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            SkXfermode::kModulate_Mode,
1000c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        };
1014c9128664a4782ef40c5ccd856e87f9ed3b86172skia.committer@gmail.com
1020c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        SkPaint paint;
1030c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        paint.setShader(fShader);
10460da8f39522a7523063f4a0f58d05285c695b562reed@google.com        paint.setAlpha(fAlpha);
1050c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
1060c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        canvas->translate(20, 20);
1070c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        for (size_t j = 0; j < SK_ARRAY_COUNT(modes); ++j) {
1080c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            SkXfermode* xfer = SkXfermode::Create(modes[j]);
1090c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            canvas->save();
1100c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            for (size_t i = 0; i < SK_ARRAY_COUNT(rec); ++i) {
1110c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org                canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode,
1120c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org                                     SK_ARRAY_COUNT(fPts), fPts,
1130c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org                                     rec[i].fTexs, rec[i].fColors,
1140c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org                                     xfer, fan, SK_ARRAY_COUNT(fan), paint);
11585e143c33c214e54187aa28146aa7666961a0d17reed@google.com                canvas->translate(200, 0);
1160c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            }
1170c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            canvas->restore();
11885e143c33c214e54187aa28146aa7666961a0d17reed@google.com            canvas->translate(0, 200);
1190c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org            xfer->unref();
1200c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org        }
1210c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    }
1220c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
1230c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.orgprivate:
1240c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org    typedef skiagm::GM INHERITED;
1250c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org};
1260c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org
12760da8f39522a7523063f4a0f58d05285c695b562reed@google.com/////////////////////////////////////////////////////////////////////////////////////
12860da8f39522a7523063f4a0f58d05285c695b562reed@google.com
12960da8f39522a7523063f4a0f58d05285c695b562reed@google.comDEF_GM( return SkNEW_ARGS(VerticesGM, (0xFF)); )
13060da8f39522a7523063f4a0f58d05285c695b562reed@google.comDEF_GM( return SkNEW_ARGS(VerticesGM, (0x80)); )
131