1e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org/*
2e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org * Copyright 2013 Google Inc.
3e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org *
4e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org * found in the LICENSE file.
6e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org */
7e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
8e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "gm.h"
9e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "SkBitmap.h"
10e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "SkCanvas.h"
11e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "SkColor.h"
12e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org#include "SkShader.h"
13e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
14e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgnamespace skiagm {
15e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
16e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// This GM draws a 3x3 grid (with the center element excluded) of rectangles
17e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// filled with a bitmap shader. The bitmap shader is transformed so that the
18e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// pattern cell is at the center (excluded) region.
19e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org//
20e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// In Repeat and Mirror mode, this tests that the bitmap shader still draws
21e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// even though the pattern cell is outside the clip.
22e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org//
23e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// In Clamp mode, this tests that the clamp is handled properly. For PDF,
24e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// (and possibly other exported formats) this also "tests" that the image itself
25e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// is not stored (well, you'll need to open it up with an external tool to
26e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org// verify that).
27e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
28e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic SkBitmap create_bitmap() {
29e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    SkBitmap bmp;
30eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com    bmp.allocN32Pixels(2, 2);
31e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    uint32_t* pixels = reinterpret_cast<uint32_t*>(bmp.getPixels());
32e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    pixels[0] = SkPreMultiplyColor(SK_ColorRED);
33e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    pixels[1] = SkPreMultiplyColor(SK_ColorGREEN);
34e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    pixels[2] = SkPreMultiplyColor(SK_ColorBLACK);
35e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    pixels[3] = SkPreMultiplyColor(SK_ColorBLUE);
36e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
37e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    return bmp;
38e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org}
39e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
40dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkScalar RECT_SIZE = 64;
41dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkScalar SLIDE_SIZE = 300;
42e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
43e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgclass ClippedBitmapShadersGM : public GM {
44e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgpublic:
45759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org    ClippedBitmapShadersGM(SkShader::TileMode mode, bool hq=false)
46759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org    : fMode(mode), fHQ(hq) {
47e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    }
48e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
49e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgprotected:
50e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    SkShader::TileMode fMode;
51759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org    bool fHQ;
52e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
53e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    virtual SkString onShortName() {
54e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkString descriptor;
55e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        switch (fMode) {
56e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            case SkShader::kRepeat_TileMode:
57e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                descriptor = "tile";
58e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            break;
59e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            case SkShader::kMirror_TileMode:
60e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                descriptor = "mirror";
61e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            break;
62e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            case SkShader::kClamp_TileMode:
63e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                descriptor = "clamp";
64e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            break;
65e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            default:
66e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                SkASSERT(false);
67e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        }
68e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        descriptor.prepend("clipped-bitmap-shaders-");
69759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        if (fHQ) {
70759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org            descriptor.append("-hq");
71759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        }
72e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        return descriptor;
73e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    }
74e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
75e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    virtual SkISize onISize() {
76e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        return SkISize::Make(300, 300);
77e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    }
78583b18a20959c9ac360316a366f4ddd9598bdf52skia.committer@gmail.com
79e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) {
80e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkBitmap bmp = create_bitmap();
81e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkMatrix s;
82e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        s.reset();
83e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        s.setScale(8, 8);
84e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        s.postTranslate(SLIDE_SIZE / 2, SLIDE_SIZE / 2);
859c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org        SkPaint paint;
862ad1aa67c6894696cdd65ec56057f81031d1c24areed        paint.setShader(SkShader::MakeBitmapShader(bmp, fMode, fMode, &s));
87583b18a20959c9ac360316a366f4ddd9598bdf52skia.committer@gmail.com
88759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        if (fHQ) {
8993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed            paint.setFilterQuality(kHigh_SkFilterQuality);
90759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        }
91e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
92e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkScalar margin = (SLIDE_SIZE / 3 - RECT_SIZE) / 2;
93e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        for (int i = 0; i < 3; i++) {
94e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            SkScalar yOrigin = SLIDE_SIZE / 3 * i + margin;
95e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            for (int j = 0; j < 3; j++) {
96e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                SkScalar xOrigin = SLIDE_SIZE / 3 * j + margin;
97e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                if (i == 1 && j == 1) {
98e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                    continue;   // skip center element
99e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                }
100e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                SkRect rect = SkRect::MakeXYWH(xOrigin, yOrigin,
101e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                                               RECT_SIZE, RECT_SIZE);
102e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->save();
103e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->clipRect(rect);
104e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->drawRect(rect, paint);
105e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->restore();
106e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            }
107e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        }
108e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    }
109e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
110e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgprivate:
111e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    typedef GM INHERITED;
112e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org};
113e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
114e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
115e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
116e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode); )
117e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode); )
118e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode); )
119759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org
120759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode, true); )
121759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode, true); )
122759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode, true); )
123759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org
124759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org
125e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org}
126