clippedbitmapshaders.cpp revision 583b18a20959c9ac360316a366f4ddd9598bdf52
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;
30e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    bmp.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
31e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    bmp.allocPixels();
32e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    bmp.lockPixels();
33e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    uint32_t* pixels = reinterpret_cast<uint32_t*>(bmp.getPixels());
34e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    pixels[0] = SkPreMultiplyColor(SK_ColorRED);
35e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    pixels[1] = SkPreMultiplyColor(SK_ColorGREEN);
36e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    pixels[2] = SkPreMultiplyColor(SK_ColorBLACK);
37e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    pixels[3] = SkPreMultiplyColor(SK_ColorBLUE);
38e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    bmp.unlockPixels();
39e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
40e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    return bmp;
41e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org}
42e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
43e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic const SkScalar RECT_SIZE = 64;
44e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgstatic const SkScalar SLIDE_SIZE = 300;
45e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
46e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgclass ClippedBitmapShadersGM : public GM {
47e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgpublic:
48759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org    ClippedBitmapShadersGM(SkShader::TileMode mode, bool hq=false)
49759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org    : fMode(mode), fHQ(hq) {
50e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    }
51e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
52e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgprotected:
53e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    SkShader::TileMode fMode;
54759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org    bool fHQ;
55e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
56e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    virtual SkString onShortName() {
57e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkString descriptor;
58e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        switch (fMode) {
59e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            case SkShader::kRepeat_TileMode:
60e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                descriptor = "tile";
61e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            break;
62e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            case SkShader::kMirror_TileMode:
63e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                descriptor = "mirror";
64e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            break;
65e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            case SkShader::kClamp_TileMode:
66e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                descriptor = "clamp";
67e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            break;
68e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            default:
69e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                SkASSERT(false);
70e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        }
71e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        descriptor.prepend("clipped-bitmap-shaders-");
72759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        if (fHQ) {
73759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org            descriptor.append("-hq");
74759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        }
75e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        return descriptor;
76e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    }
77e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
78e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    virtual SkISize onISize() {
79e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        return SkISize::Make(300, 300);
80e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    }
81583b18a20959c9ac360316a366f4ddd9598bdf52skia.committer@gmail.com
82e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) {
83e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkBitmap bmp = create_bitmap();
84e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkShader* shader = SkShader::CreateBitmapShader(
85e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                bmp, fMode, fMode);
86e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
87e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkPaint paint;
88e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkMatrix s;
89e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        s.reset();
90e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        s.setScale(8, 8);
91e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        s.postTranslate(SLIDE_SIZE / 2, SLIDE_SIZE / 2);
92e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        shader->setLocalMatrix(s);
93e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        paint.setShader(shader)->unref();
94583b18a20959c9ac360316a366f4ddd9598bdf52skia.committer@gmail.com
95759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        if (fHQ) {
96759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org            paint.setFilterLevel(SkPaint::kHigh_FilterLevel);
97759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org        }
98e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
99e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        SkScalar margin = (SLIDE_SIZE / 3 - RECT_SIZE) / 2;
100e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        for (int i = 0; i < 3; i++) {
101e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            SkScalar yOrigin = SLIDE_SIZE / 3 * i + margin;
102e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            for (int j = 0; j < 3; j++) {
103e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                SkScalar xOrigin = SLIDE_SIZE / 3 * j + margin;
104e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                if (i == 1 && j == 1) {
105e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                    continue;   // skip center element
106e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                }
107e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                SkRect rect = SkRect::MakeXYWH(xOrigin, yOrigin,
108e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                                               RECT_SIZE, RECT_SIZE);
109e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->save();
110e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->clipRect(rect);
111e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->drawRect(rect, paint);
112e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org                canvas->restore();
113e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org            }
114e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org        }
115e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    }
116e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
117e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgprivate:
118e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org    typedef GM INHERITED;
119e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org};
120e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
121e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
122e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org
123e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode); )
124e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode); )
125e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode); )
126759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org
127759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kRepeat_TileMode, true); )
128759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kMirror_TileMode, true); )
129759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.orgDEF_GM( return new ClippedBitmapShadersGM(SkShader::kClamp_TileMode, true); )
130759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org
131759befb72c558202de65a480c44d7b27428ec312commit-bot@chromium.org
132e324cc69be2be62a76cef52ba3562771af02f315commit-bot@chromium.org}
133