1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "gm.h"
9
10namespace skiagm {
11
12class NoColorBleedGM : public GM {
13public:
14    NoColorBleedGM() {
15        this->setBGColor(0xFFDDDDDD);
16    }
17
18protected:
19    virtual SkString onShortName() {
20        return SkString("nocolorbleed");
21    }
22
23    virtual SkISize onISize() {
24        return make_isize(200, 200);
25    }
26
27    virtual void onDraw(SkCanvas* canvas) {
28        SkBitmap sprite;
29        sprite.setConfig(SkBitmap::kARGB_8888_Config, 4, 4, 4*sizeof(SkColor));
30        const SkColor spriteData[16] = {
31            SK_ColorBLACK,  SK_ColorCYAN,    SK_ColorMAGENTA, SK_ColorYELLOW,
32            SK_ColorBLACK,  SK_ColorWHITE,   SK_ColorBLACK,   SK_ColorRED,
33            SK_ColorGREEN,  SK_ColorBLACK,   SK_ColorWHITE,   SK_ColorBLUE,
34            SK_ColorYELLOW, SK_ColorMAGENTA, SK_ColorCYAN,    SK_ColorBLACK
35        };
36        sprite.allocPixels();
37        sprite.lockPixels();
38        SkPMColor* addr = sprite.getAddr32(0, 0);
39        for (size_t i = 0; i < SK_ARRAY_COUNT(spriteData); ++i) {
40            addr[i] = SkPreMultiplyColor(spriteData[i]);
41        }
42        sprite.unlockPixels();
43
44        // We draw a magnified subrect of the sprite
45        // sample interpolation may cause color bleeding around edges
46        // the subrect is a pure white area
47        SkIRect srcRect;
48        SkRect dstRect;
49        SkPaint paint;
50        paint.setFilterBitmap(true);
51        //First row : full texture with and without filtering
52        srcRect.setXYWH(0, 0, 4, 4);
53        dstRect.setXYWH(SkIntToScalar(0), SkIntToScalar(0)
54                        , SkIntToScalar(100), SkIntToScalar(100));
55        canvas->drawBitmapRect(sprite, &srcRect, dstRect, &paint);
56        dstRect.setXYWH(SkIntToScalar(100), SkIntToScalar(0)
57                        , SkIntToScalar(100), SkIntToScalar(100));
58        canvas->drawBitmapRect(sprite, &srcRect, dstRect);
59        //Second row : sub rect of texture with and without filtering
60        srcRect.setXYWH(1, 1, 2, 2);
61        dstRect.setXYWH(SkIntToScalar(25), SkIntToScalar(125)
62                        , SkIntToScalar(50), SkIntToScalar(50));
63        canvas->drawBitmapRect(sprite, &srcRect, dstRect, &paint);
64        dstRect.setXYWH(SkIntToScalar(125), SkIntToScalar(125)
65                        , SkIntToScalar(50), SkIntToScalar(50));
66        canvas->drawBitmapRect(sprite, &srcRect, dstRect);
67    }
68
69private:
70    typedef GM INHERITED;
71};
72
73//////////////////////////////////////////////////////////////////////////////
74
75static GM* MyFactory(void*) { return new NoColorBleedGM; }
76static GMRegistry reg(MyFactory);
77
78}
79