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
40e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic const SkScalar RECT_SIZE = 64;
41e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic const 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        SkShader* shader = SkShader::CreateBitmapShader(
869c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org                bmp, fMode, fMode, &s);
879c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org
889c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org        SkPaint paint;
89e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        paint.setShader(shader)->unref();
90583b18a20959c9ac360316a366f4ddd9598bdf52skia.committer@gmail.com
91759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        if (fHQ) {
92759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org            paint.setFilterLevel(SkPaint::kHigh_FilterLevel);
93759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        }
94e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
95e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkScalar margin = (SLIDE_SIZE / 3 - RECT_SIZE) / 2;
96e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        for (int i = 0; i < 3; i++) {
97e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            SkScalar yOrigin = SLIDE_SIZE / 3 * i + margin;
98e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            for (int j = 0; j < 3; j++) {
99e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                SkScalar xOrigin = SLIDE_SIZE / 3 * j + margin;
100e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                if (i == 1 && j == 1) {
101e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                    continue;   // skip center element
102e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                }
103e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                SkRect rect = SkRect::MakeXYWH(xOrigin, yOrigin,
104e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                                               RECT_SIZE, RECT_SIZE);
105e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->save();
106e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->clipRect(rect);
107e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->drawRect(rect, paint);
108e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->restore();
109e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            }
110e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        }
111e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    }
112e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
113e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgprivate:
114e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    typedef GM INHERITED;
115e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org};
116e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
117e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
118e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
119e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode); )
120e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode); )
121e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode); )
122759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org
123759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode, true); )
124759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode, true); )
125759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode, true); )
126759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org
127759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org
128e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org}
129