179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org/*
279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org * Copyright 2012 Google Inc.
379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org *
479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org * Use of this source code is governed by a BSD-style license that can be
579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org * found in the LICENSE file.
679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org */
779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org#include "gm.h"
879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org#include "SkGradientShader.h"
979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
1079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgnamespace skiagm {
1179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
129c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.orgstatic SkShader* MakeLinear(SkScalar width, SkScalar height, bool alternate,
139c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                            const SkMatrix& localMatrix) {
1479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org  SkPoint pts[2] = { {0, 0}, {width, height}};
1579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org  SkColor colors[2] = {SK_ColorRED, SK_ColorGREEN};
1679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org  if (alternate) {
1779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    pts[1].fY = 0;
1879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    colors[0] = SK_ColorBLUE;
1979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    colors[1] = SK_ColorYELLOW;
2079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org  }
2179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org  return SkGradientShader::CreateLinear(pts, colors, NULL, 2,
2283f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org                                        SkShader::kClamp_TileMode, 0, &localMatrix);
2379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org}
2479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
2579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org///////////////////////////////////////////////////////////////////////////////
2679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
2779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgclass ShaderBoundsGM : public GM {
2879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgpublic:
2979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    typedef SkShader* (*ShaderGenFunc)(SkScalar width, SkScalar height,
309c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                                       bool alternate, const SkMatrix& localMatrix);
3179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    ShaderBoundsGM(ShaderGenFunc maker, const SkString& name)
3279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        : fShaderMaker(maker),
3379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org          fName(name) {
3479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    }
3579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
3679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgprotected:
37a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
38a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
39a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
40a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
4179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    SkString onShortName() {
4279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        return fName;
4379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    }
4479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
45f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    virtual SkISize onISize() { return SkISize::Make(320, 240); }
4679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
4779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    virtual SkMatrix onGetInitialTransform() const SK_OVERRIDE {
4879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        SkMatrix result;
494b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        SkScalar scale = 0.8f;
5079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        result.setScale(scale, scale);
5179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        result.postTranslate(SkIntToScalar(7), SkIntToScalar(23));
5279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        return result;
5379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    }
5479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
5579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    virtual void onDraw(SkCanvas* canvas) {
5679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        // The PDF device has already clipped to the content area, but we
5779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        // do it again here so that the raster and pdf results are consistent.
5879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        canvas->clipRect(SkRect::MakeWH(SkIntToScalar(320),
5979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org                                        SkIntToScalar(240)));
6079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
6179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        SkMatrix canvasScale;
624b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        SkScalar scale = 0.7f;
6379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        canvasScale.setScale(scale, scale);
6479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        canvas->concat(canvasScale);
6579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
6679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        // Background shader.
6779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        SkPaint paint;
6879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        paint.setShader(MakeShader(559, 387, false))->unref();
6979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        SkRect r = SkRect::MakeXYWH(SkIntToScalar(-12), SkIntToScalar(-41),
7079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org                                    SkIntToScalar(571), SkIntToScalar(428));
7179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        canvas->drawRect(r, paint);
7279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
7379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        // Constrained shader.
7479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        paint.setShader(MakeShader(101, 151, true))->unref();
7579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        r = SkRect::MakeXYWH(SkIntToScalar(43), SkIntToScalar(71),
7679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org                             SkIntToScalar(101), SkIntToScalar(151));
7779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        canvas->clipRect(r);
7879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        canvas->drawRect(r, paint);
7979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    }
8079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
8179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    SkShader* MakeShader(int width, int height, bool background) {
824b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        SkScalar scale = 0.5f;
8379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        if (background) {
844b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            scale = 0.6f;
8579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        }
86c39c8674c94dba8b1ffe938cd99c825320cc1475vandebo@chromium.org        SkScalar shaderWidth = SkScalarDiv(SkIntToScalar(width), scale);
87c39c8674c94dba8b1ffe938cd99c825320cc1475vandebo@chromium.org        SkScalar shaderHeight = SkScalarDiv(SkIntToScalar(height), scale);
8879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        SkMatrix shaderScale;
8979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        shaderScale.setScale(scale, scale);
909c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org        SkShader* shader = fShaderMaker(shaderWidth, shaderHeight, background, shaderScale);
9179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org        return shader;
9279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    }
9379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
9479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgprivate:
9579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    typedef GM INHERITED;
9679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
9779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    ShaderGenFunc fShaderMaker;
9879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    SkString fName;
9979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
10079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    SkShader* MakeShader(bool background);
10179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org};
10279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
10379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org///////////////////////////////////////////////////////////////////////////////
10479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
10579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgstatic GM* MyFactory(void*) {
10679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org    return new ShaderBoundsGM(MakeLinear, SkString("shaderbounds_linear"));
10779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org}
10879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgstatic GMRegistry reg(MyFactory);
10979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org
11079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org}
111