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 static const char* gConfigNames[] = { 13 "unknown config", 14 "A1", 15 "A8", 16 "Index8", 17 "565", 18 "4444", 19 "8888" 20 }; 21 22 SkBitmap::Config gConfigs[] = { 23 SkBitmap::kRGB_565_Config, 24 SkBitmap::kARGB_4444_Config, 25 SkBitmap::kARGB_8888_Config, 26 }; 27 28 #define NUM_CONFIGS (sizeof(gConfigs) / sizeof(SkBitmap::Config)) 29 30 static void draw_checks(SkCanvas* canvas, int width, int height) { 31 SkPaint paint; 32 paint.setColor(SK_ColorRED); 33 canvas->drawRectCoords(0, 0, width / 2, height / 2, paint); 34 paint.setColor(SK_ColorGREEN); 35 canvas->drawRectCoords(width / 2, 0, width, height / 2, paint); 36 paint.setColor(SK_ColorBLUE); 37 canvas->drawRectCoords(0, height / 2, width / 2, height, paint); 38 paint.setColor(SK_ColorYELLOW); 39 canvas->drawRectCoords(width / 2, height / 2, width, height, paint); 40 } 41 42 class BitmapCopyGM : public GM { 43 public: 44 SkBitmap fDst[NUM_CONFIGS]; 45 46 BitmapCopyGM() { 47 this->setBGColor(0xFFDDDDDD); 48 } 49 50 protected: 51 virtual SkString onShortName() { 52 return SkString("bitmapcopy"); 53 } 54 55 virtual SkISize onISize() { 56 return make_isize(540, 330); 57 } 58 59 virtual void onDraw(SkCanvas* canvas) { 60 SkPaint paint; 61 SkScalar horizMargin(SkIntToScalar(10)); 62 SkScalar vertMargin(SkIntToScalar(10)); 63 64 draw_checks(canvas, 40, 40); 65 SkBitmap src = canvas->getDevice()->accessBitmap(false); 66 67 for (unsigned i = 0; i < NUM_CONFIGS; ++i) { 68 if (!src.deepCopyTo(&fDst[i], gConfigs[i])) { 69 src.copyTo(&fDst[i], gConfigs[i]); 70 } 71 } 72 73 canvas->clear(0xFFDDDDDD); 74 paint.setAntiAlias(true); 75 SkScalar width = SkIntToScalar(40); 76 SkScalar height = SkIntToScalar(40); 77 if (paint.getFontSpacing() > height) { 78 height = paint.getFontSpacing(); 79 } 80 for (unsigned i = 0; i < NUM_CONFIGS; i++) { 81 const char* name = gConfigNames[src.config()]; 82 SkScalar textWidth = paint.measureText(name, strlen(name)); 83 if (textWidth > width) { 84 width = textWidth; 85 } 86 } 87 SkScalar horizOffset = width + horizMargin; 88 SkScalar vertOffset = height + vertMargin; 89 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 90 91 for (unsigned i = 0; i < NUM_CONFIGS; i++) { 92 canvas->save(); 93 // Draw destination config name 94 const char* name = gConfigNames[fDst[i].config()]; 95 SkScalar textWidth = paint.measureText(name, strlen(name)); 96 SkScalar x = (width - textWidth) / SkScalar(2); 97 SkScalar y = paint.getFontSpacing() / SkScalar(2); 98 canvas->drawText(name, strlen(name), x, y, paint); 99 100 // Draw destination bitmap 101 canvas->translate(0, vertOffset); 102 x = (width - 40) / SkScalar(2); 103 canvas->drawBitmap(fDst[i], x, 0, &paint); 104 canvas->restore(); 105 106 canvas->translate(horizOffset, 0); 107 } 108 } 109 110 virtual uint32_t onGetFlags() const { return kSkipPicture_Flag; } 111 112 private: 113 typedef GM INHERITED; 114 }; 115 116 ////////////////////////////////////////////////////////////////////////////// 117 118 static GM* MyFactory(void*) { return new BitmapCopyGM; } 119 static GMRegistry reg(MyFactory); 120 121 } 122