bitmapscroll.cpp revision 36352bf5e38f45a70ee4f4fc132a38048d38206d
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 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 */ 18static 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 44class 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 55public: 56 BitmapScrollGM() { 57 fInited = false; 58 this->setBGColor(0xFFDDDDDD); 59 } 60 61protected: 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 143private: 144 typedef GM INHERITED; 145 static const int quarterWidth = 10; 146 static const int quarterHeight = 14; 147 SkBitmap origBitmap; 148}; 149 150////////////////////////////////////////////////////////////////////////////// 151 152static GM* MyFactory(void*) { return new BitmapScrollGM; } 153static GMRegistry reg(MyFactory); 154 155} 156