1
2/*
3 * Copyright 2012 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
10#include "SkColorPriv.h"
11#include "SkShader.h"
12
13namespace skiagm {
14
15class BigMatrixGM : public GM {
16public:
17    BigMatrixGM() {
18        this->setBGColor(0xFF66AA99);
19    }
20
21protected:
22    virtual uint32_t onGetFlags() const SK_OVERRIDE {
23        return kSkipTiled_Flag;
24    }
25
26    virtual SkString onShortName() {
27        return SkString("bigmatrix");
28    }
29
30    virtual SkISize onISize() {
31        return SkISize::Make(50, 50);
32    }
33
34    virtual void onDraw(SkCanvas* canvas) {
35        SkMatrix m;
36        m.reset();
37        m.setRotate(33 * SK_Scalar1);
38        m.postScale(3000 * SK_Scalar1, 3000 * SK_Scalar1);
39        m.postTranslate(6000 * SK_Scalar1, -5000 * SK_Scalar1);
40        canvas->concat(m);
41
42        SkPaint paint;
43        paint.setColor(SK_ColorRED);
44        paint.setAntiAlias(true);
45
46        bool success = m.invert(&m);
47        SkASSERT(success);
48        (void) success; // silence compiler :(
49
50        SkPath path;
51
52        SkPoint pt = {10 * SK_Scalar1, 10 * SK_Scalar1};
53        SkScalar small = 1 / (500 * SK_Scalar1);
54
55        m.mapPoints(&pt, 1);
56        path.addCircle(pt.fX, pt.fY, small);
57        canvas->drawPath(path, paint);
58
59        pt.set(30 * SK_Scalar1, 10 * SK_Scalar1);
60        m.mapPoints(&pt, 1);
61        SkRect rect = {pt.fX - small, pt.fY - small,
62                       pt.fX + small, pt.fY + small};
63        canvas->drawRect(rect, paint);
64
65        SkBitmap bmp;
66        bmp.allocN32Pixels(2, 2);
67        uint32_t* pixels = reinterpret_cast<uint32_t*>(bmp.getPixels());
68        pixels[0] = SkPackARGB32(0xFF, 0xFF, 0x00, 0x00);
69        pixels[1] = SkPackARGB32(0xFF, 0x00, 0xFF, 0x00);
70        pixels[2] = SkPackARGB32(0x80, 0x00, 0x00, 0x00);
71        pixels[3] = SkPackARGB32(0xFF, 0x00, 0x00, 0xFF);
72        pt.set(30 * SK_Scalar1, 30 * SK_Scalar1);
73        m.mapPoints(&pt, 1);
74        SkMatrix s;
75        s.reset();
76        s.setScale(SK_Scalar1 / 1000, SK_Scalar1 / 1000);
77        SkShader* shader = SkShader::CreateBitmapShader(
78                                            bmp,
79                                            SkShader::kRepeat_TileMode,
80                                            SkShader::kRepeat_TileMode,
81                                            &s);
82        paint.setShader(shader)->unref();
83        paint.setAntiAlias(false);
84        paint.setFilterLevel(SkPaint::kLow_FilterLevel);
85        rect.setLTRB(pt.fX - small, pt.fY - small,
86                     pt.fX + small, pt.fY + small);
87        canvas->drawRect(rect, paint);
88    }
89
90private:
91    typedef GM INHERITED;
92};
93
94//////////////////////////////////////////////////////////////////////////////
95
96static GM* MyFactory(void*) { return new BigMatrixGM; }
97static GMRegistry reg(MyFactory);
98
99}
100