| 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 |