1779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger/*
2779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger * Copyright 2013 Google Inc.
3779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger *
4779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger * found in the LICENSE file.
6779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger */
7779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
8779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger#include "gm.h"
9779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger#include "SkCanvas.h"
10779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger#include "SkGradientShader.h"
11779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
12779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenbergerclass AlphaGradientsGM : public skiagm::GM {
13779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenbergerpublic:
14779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    AlphaGradientsGM() {}
15779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
16779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenbergerprotected:
17779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    virtual SkString onShortName() SK_OVERRIDE {
18779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        return SkString("alphagradients");
19779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    }
20779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
21779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    virtual SkISize onISize() SK_OVERRIDE {
22779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        return SkISize::Make(640, 480);
23779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    }
24779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
25779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    static void draw_grad(SkCanvas* canvas, const SkRect& r,
26779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger                          SkColor c0, SkColor c1, bool doPreMul) {
27779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        SkColor colors[] = { c0, c1 };
28779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fBottom } };
29779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        SkPaint paint;
30779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        uint32_t flags = doPreMul ? SkGradientShader::kInterpolateColorsInPremul_Flag : 0;
31779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2,
32779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger                                                     SkShader::kClamp_TileMode,
33779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger                                                     NULL, flags);
34779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        paint.setShader(s)->unref();
35779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        canvas->drawRect(r, paint);
36779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
37779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        paint.setShader(NULL);
38779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        paint.setStyle(SkPaint::kStroke_Style);
39779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        canvas->drawRect(r, paint);
40779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    }
41779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
42779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
43779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        static const struct {
44779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            SkColor fColor0;
45779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            SkColor fColor1;
46779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        } gRec[] = {
47779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFFFFFFFF, 0x00000000 },
48779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFFFFFFFF, 0x00FF0000 },
49779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFFFFFFFF, 0x00FFFF00 },
50779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFFFFFFFF, 0x00FFFFFF },
51779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFFFF0000, 0x00000000 },
52779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFFFF0000, 0x00FF0000 },
53779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFFFF0000, 0x00FFFF00 },
54779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFFFF0000, 0x00FFFFFF },
55779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFF0000FF, 0x00000000 },
56779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFF0000FF, 0x00FF0000 },
57779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFF0000FF, 0x00FFFF00 },
58779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            { 0xFF0000FF, 0x00FFFFFF },
59779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        };
60779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
61779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        SkRect r = SkRect::MakeWH(300, 30);
62779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
63779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        canvas->translate(10, 10);
64779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
65779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        for (int doPreMul = 0; doPreMul <= 1; ++doPreMul) {
66779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            canvas->save();
67779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
68779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger                draw_grad(canvas, r, gRec[i].fColor0, gRec[i].fColor1, SkToBool(doPreMul));
69779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger                canvas->translate(0, r.height() + 8);
70779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            }
71779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            canvas->restore();
72779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger            canvas->translate(r.width() + 10, 0);
73779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger        }
74779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    }
75779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
76779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; }
77779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
78779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenbergerprivate:
79779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger    typedef skiagm::GM INHERITED;
80779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger};
81779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger
82779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek SollenbergerDEF_GM( return SkNEW(AlphaGradientsGM); )
83