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