OLD | NEW |
| (Empty) |
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.scrollR
ect( | |
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 } | |
OLD | NEW |