C++11 override should now be supported by all of {bots,Chrome,Android,Mozilla}
[platform/upstream/libSkiaSharp.git] / gm / bitmapscroll.cpp
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
10 namespace skiagm {
11
12 /** Create a bitmap image suitable for testing SkBitmap::scrollRect().
13  *
14  *  @param quarterWidth bitmap will be 4x this many pixels wide
15  *  @param quarterHeight bitmap will be 4x this many pixels tall
16  *  @param bitmap the bitmap data is written into this object
17  */
18 static void make_bitmap(int quarterWidth, int quarterHeight, SkBitmap *bitmap) {
19     SkPaint pRed, pWhite, pGreen, pBlue, pLine, pAlphaGray;
20     pRed.setColor(0xFFFF9999);
21     pWhite.setColor(0xFFFFFFFF);
22     pGreen.setColor(0xFF99FF99);
23     pBlue.setColor(0xFF9999FF);
24     pLine.setColor(0xFF000000);
25     pLine.setStyle(SkPaint::kStroke_Style);
26     pAlphaGray.setColor(0x66888888);
27
28     // Prepare bitmap, and a canvas that draws into it.
29     bitmap->allocN32Pixels(quarterWidth*4, quarterHeight*4);
30     SkCanvas canvas(*bitmap);
31
32     SkScalar w = SkIntToScalar(quarterWidth);
33     SkScalar h = SkIntToScalar(quarterHeight);
34     canvas.drawRectCoords(  0,   0, w*2, h*2, pRed);
35     canvas.drawRectCoords(w*2,   0, w*4, h*2, pGreen);
36     canvas.drawRectCoords(  0, h*2, w*2, h*4, pBlue);
37     canvas.drawRectCoords(w*2, h*2, w*4, h*4, pWhite);
38     canvas.drawRectCoords(w, h, w*3, h*3, pAlphaGray);
39     canvas.drawLine(w*2,   0, w*2, h*4, pLine);
40     canvas.drawLine(  0, h*2, w*4, h*2, pLine);
41     canvas.drawRectCoords(w, h, w*3, h*3, pLine);
42 }
43
44 class BitmapScrollGM : public GM {
45     bool fInited;
46     void init() {
47         if (fInited) {
48             return;
49         }
50         fInited = true;
51         // Create the original bitmap.
52         make_bitmap(quarterWidth, quarterHeight, &origBitmap);
53     }
54
55 public:
56     BitmapScrollGM() {
57         fInited = false;
58         this->setBGColor(0xFFDDDDDD);
59     }
60
61 protected:
62     SkString onShortName() override {
63         return SkString("bitmapscroll");
64     }
65
66     SkISize onISize() override {
67       return SkISize::Make(800, 600);
68     }
69
70     void onDraw(SkCanvas* canvas) override {
71         this->init();
72         SkIRect scrollCenterRegion = SkIRect::MakeXYWH(
73             quarterWidth, quarterHeight, quarterWidth*2+1, quarterHeight*2+1);
74         int x = quarterWidth;
75         int y = quarterHeight;
76         int xSpacing = quarterWidth * 20;
77         int ySpacing = quarterHeight * 16;
78
79         // Draw left-hand text labels.
80         drawLabel(canvas, "scroll entire bitmap",
81                   x, y, x, y + ySpacing);
82         drawLabel(canvas, "scroll part of bitmap",
83                   x, y + ySpacing, x, y + ySpacing*2);
84         x += 30;
85
86         // Draw various permutations of scrolled bitmaps, scrolling a bit
87         // further each time.
88         draw9(canvas, x, y, NULL, quarterWidth*1/2, quarterHeight*1/2);
89         draw9(canvas, x, y+ySpacing, &scrollCenterRegion,
90               quarterWidth*1/2, quarterHeight*1/2);
91         x += xSpacing;
92         draw9(canvas, x, y, NULL, quarterWidth*3/2, quarterHeight*3/2);
93         draw9(canvas, x, y+ySpacing, &scrollCenterRegion,
94               quarterWidth*3/2, quarterHeight*3/2);
95         x += xSpacing;
96         draw9(canvas, x, y, NULL, quarterWidth*5/2, quarterHeight*5/2);
97         draw9(canvas, x, y+ySpacing, &scrollCenterRegion,
98               quarterWidth*5/2, quarterHeight*5/2);
99         x += xSpacing;
100         draw9(canvas, x, y, NULL, quarterWidth*9/2, quarterHeight*9/2);
101         draw9(canvas, x, y+ySpacing, &scrollCenterRegion,
102               quarterWidth*9/2, quarterHeight*9/2);
103     }
104
105     void drawLabel(SkCanvas* canvas, const char *text, int startX, int startY,
106                  int endX, int endY) {
107         SkPaint paint;
108         sk_tool_utils::set_portable_typeface(&paint);
109         paint.setColor(0xFF000000);
110         SkPath path;
111         path.moveTo(SkIntToScalar(startX), SkIntToScalar(startY));
112         path.lineTo(SkIntToScalar(endX), SkIntToScalar(endY));
113         canvas->drawTextOnPath(text, strlen(text), path, NULL, paint);
114     }
115
116     /** Stamp out 9 copies of origBitmap, scrolled in each direction (and
117      *  not scrolled at all).
118      */
119     void draw9(SkCanvas* canvas, int x, int y, SkIRect* subset,
120                int scrollX, int scrollY) {
121         for (int yMult=-1; yMult<=1; yMult++) {
122             for (int xMult=-1; xMult<=1; xMult++) {
123                 // Figure out the (x,y) to draw this copy at
124                 SkScalar bitmapX = SkIntToScalar(
125                     x + quarterWidth * 5 * (xMult+1));
126                 SkScalar bitmapY = SkIntToScalar(
127                     y + quarterHeight * 5 * (yMult+1));
128
129                 // Scroll a new copy of the bitmap, and then draw it.
130                 // scrollRect() should always return true, even if it's a no-op
131                 SkBitmap scrolledBitmap;
132                 SkDEBUGCODE(bool copyToReturnValue = )origBitmap.copyTo(
133                     &scrolledBitmap, origBitmap.colorType());
134                 SkASSERT(copyToReturnValue);
135                 SkDEBUGCODE(bool scrollRectReturnValue = )scrolledBitmap.scrollRect(
136                     subset, scrollX * xMult, scrollY * yMult);
137                 SkASSERT(scrollRectReturnValue);
138                 canvas->drawBitmap(scrolledBitmap, bitmapX, bitmapY);
139             }
140         }
141     }
142
143 private:
144     typedef GM INHERITED;
145     static const int quarterWidth = 10;
146     static const int quarterHeight = 14;
147     SkBitmap origBitmap;
148 };
149
150 //////////////////////////////////////////////////////////////////////////////
151
152 static GM* MyFactory(void*) { return new BitmapScrollGM; }
153 static GMRegistry reg(MyFactory);
154
155 }