1/* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7#include "gm.h" 8#include "sk_tool_utils.h" 9 10namespace skiagm { 11 12static const char* color_type_name(SkColorType colorType) { 13 switch (colorType) { 14 case kUnknown_SkColorType: return "unknown"; 15 case kAlpha_8_SkColorType: return "A8"; 16 case kRGB_565_SkColorType: return "565"; 17 case kARGB_4444_SkColorType: return "4444"; 18 case kRGBA_8888_SkColorType: return "8888"; 19 case kRGB_888x_SkColorType: return "888x"; 20 case kBGRA_8888_SkColorType: return "8888"; 21 case kRGBA_1010102_SkColorType: return "1010102"; 22 case kRGB_101010x_SkColorType: return "101010x"; 23 case kGray_8_SkColorType: return "G8"; 24 case kRGBA_F16_SkColorType: return "F16"; 25 } 26 return ""; 27} 28 29constexpr SkColorType gColorTypes[] = { 30 kRGB_565_SkColorType, 31 kARGB_4444_SkColorType, 32 kN32_SkColorType, 33}; 34 35#define NUM_CONFIGS SK_ARRAY_COUNT(gColorTypes) 36 37static void draw_checks(SkCanvas* canvas, int width, int height) { 38 SkPaint paint; 39 paint.setColor(SK_ColorRED); 40 canvas->drawRect(SkRect::MakeIWH(width/2, height/2), paint); 41 paint.setColor(SK_ColorGREEN); 42 canvas->drawRect({ SkIntToScalar(width/2), 0, SkIntToScalar(width), SkIntToScalar(height/2) }, 43 paint); 44 paint.setColor(SK_ColorBLUE); 45 canvas->drawRect({ 0, SkIntToScalar(height/2), SkIntToScalar(width/2), SkIntToScalar(height) }, 46 paint); 47 paint.setColor(SK_ColorYELLOW); 48 canvas->drawRect({ SkIntToScalar(width/2), SkIntToScalar(height/2), SkIntToScalar(width), 49 SkIntToScalar(height) }, paint); 50} 51 52class BitmapCopyGM : public GM { 53public: 54 SkBitmap fDst[NUM_CONFIGS]; 55 56 BitmapCopyGM() { 57 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 58 } 59 60protected: 61 virtual SkString onShortName() { 62 return SkString("bitmapcopy"); 63 } 64 65 virtual SkISize onISize() { 66 return SkISize::Make(540, 330); 67 } 68 69 virtual void onDraw(SkCanvas* canvas) { 70 SkPaint paint; 71 SkScalar horizMargin = 10; 72 SkScalar vertMargin = 10; 73 74 SkBitmap src; 75 src.allocN32Pixels(40, 40, kOpaque_SkAlphaType); 76 SkCanvas canvasTmp(src); 77 78 draw_checks(&canvasTmp, 40, 40); 79 80 for (unsigned i = 0; i < NUM_CONFIGS; ++i) { 81 sk_tool_utils::copy_to(&fDst[i], gColorTypes[i], src); 82 } 83 84 canvas->clear(sk_tool_utils::color_to_565(0xFFDDDDDD)); 85 paint.setAntiAlias(true); 86 sk_tool_utils::set_portable_typeface(&paint); 87 88 SkScalar width = SkIntToScalar(40); 89 SkScalar height = SkIntToScalar(40); 90 if (paint.getFontSpacing() > height) { 91 height = paint.getFontSpacing(); 92 } 93 for (unsigned i = 0; i < NUM_CONFIGS; i++) { 94 const char* name = color_type_name(src.colorType()); 95 SkScalar textWidth = paint.measureText(name, strlen(name)); 96 if (textWidth > width) { 97 width = textWidth; 98 } 99 } 100 SkScalar horizOffset = width + horizMargin; 101 SkScalar vertOffset = height + vertMargin; 102 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 103 104 for (unsigned i = 0; i < NUM_CONFIGS; i++) { 105 canvas->save(); 106 // Draw destination config name 107 const char* name = color_type_name(fDst[i].colorType()); 108 SkScalar textWidth = paint.measureText(name, strlen(name)); 109 SkScalar x = (width - textWidth) / SkScalar(2); 110 SkScalar y = paint.getFontSpacing() / SkScalar(2); 111 canvas->drawString(name, x, y, paint); 112 113 // Draw destination bitmap 114 canvas->translate(0, vertOffset); 115 x = (width - 40) / SkScalar(2); 116 canvas->drawBitmap(fDst[i], x, 0, &paint); 117 canvas->restore(); 118 119 canvas->translate(horizOffset, 0); 120 } 121 } 122 123private: 124 typedef GM INHERITED; 125}; 126 127////////////////////////////////////////////////////////////////////////////// 128 129static GM* MyFactory(void*) { return new BitmapCopyGM; } 130static GMRegistry reg(MyFactory); 131} 132