|  |  | 
|  | /* | 
|  | * Copyright 2011 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  | #include "gm.h" | 
|  |  | 
|  | namespace skiagm { | 
|  |  | 
|  | static const char* gColorTypeNames[] = { | 
|  | "unknown", | 
|  | "A8", | 
|  | "565", | 
|  | "4444", | 
|  | "8888", | 
|  | "8888", | 
|  | "Index8", | 
|  | }; | 
|  |  | 
|  | static const SkColorType gColorTypes[] = { | 
|  | kRGB_565_SkColorType, | 
|  | kARGB_4444_SkColorType, | 
|  | kN32_SkColorType, | 
|  | }; | 
|  |  | 
|  | #define NUM_CONFIGS SK_ARRAY_COUNT(gColorTypes) | 
|  |  | 
|  | static void draw_checks(SkCanvas* canvas, int width, int height) { | 
|  | SkPaint paint; | 
|  | paint.setColor(SK_ColorRED); | 
|  | canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0), | 
|  | SkIntToScalar(width / 2), SkIntToScalar(height / 2), paint); | 
|  | paint.setColor(SK_ColorGREEN); | 
|  | canvas->drawRectCoords(SkIntToScalar(width / 2), SkIntToScalar(0), | 
|  | SkIntToScalar(width), SkIntToScalar(height / 2), paint); | 
|  | paint.setColor(SK_ColorBLUE); | 
|  | canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(height / 2), | 
|  | SkIntToScalar(width / 2), SkIntToScalar(height), paint); | 
|  | paint.setColor(SK_ColorYELLOW); | 
|  | canvas->drawRectCoords(SkIntToScalar(width / 2), SkIntToScalar(height / 2), | 
|  | SkIntToScalar(width), SkIntToScalar(height), paint); | 
|  | } | 
|  |  | 
|  | class BitmapCopyGM : public GM { | 
|  | public: | 
|  | SkBitmap    fDst[NUM_CONFIGS]; | 
|  |  | 
|  | BitmapCopyGM() { | 
|  | this->setBGColor(0xFFDDDDDD); | 
|  | } | 
|  |  | 
|  | protected: | 
|  | virtual SkString onShortName() { | 
|  | return SkString("bitmapcopy"); | 
|  | } | 
|  |  | 
|  | virtual SkISize onISize() { | 
|  | return SkISize::Make(540, 330); | 
|  | } | 
|  |  | 
|  | virtual void onDraw(SkCanvas* canvas) { | 
|  | SkPaint paint; | 
|  | SkScalar horizMargin = 10; | 
|  | SkScalar vertMargin = 10; | 
|  |  | 
|  | SkBitmap src; | 
|  | src.allocN32Pixels(40, 40); | 
|  | SkCanvas canvasTmp(src); | 
|  |  | 
|  | draw_checks(&canvasTmp, 40, 40); | 
|  |  | 
|  | for (unsigned i = 0; i < NUM_CONFIGS; ++i) { | 
|  | src.copyTo(&fDst[i], gColorTypes[i]); | 
|  | } | 
|  |  | 
|  | canvas->clear(0xFFDDDDDD); | 
|  | paint.setAntiAlias(true); | 
|  | sk_tool_utils::set_portable_typeface(&paint); | 
|  |  | 
|  | SkScalar width = SkIntToScalar(40); | 
|  | SkScalar height = SkIntToScalar(40); | 
|  | if (paint.getFontSpacing() > height) { | 
|  | height = paint.getFontSpacing(); | 
|  | } | 
|  | for (unsigned i = 0; i < NUM_CONFIGS; i++) { | 
|  | const char* name = gColorTypeNames[src.colorType()]; | 
|  | SkScalar textWidth = paint.measureText(name, strlen(name)); | 
|  | if (textWidth > width) { | 
|  | width = textWidth; | 
|  | } | 
|  | } | 
|  | SkScalar horizOffset = width + horizMargin; | 
|  | SkScalar vertOffset = height + vertMargin; | 
|  | canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); | 
|  |  | 
|  | for (unsigned i = 0; i < NUM_CONFIGS; i++) { | 
|  | canvas->save(); | 
|  | // Draw destination config name | 
|  | const char* name = gColorTypeNames[fDst[i].colorType()]; | 
|  | SkScalar textWidth = paint.measureText(name, strlen(name)); | 
|  | SkScalar x = (width - textWidth) / SkScalar(2); | 
|  | SkScalar y = paint.getFontSpacing() / SkScalar(2); | 
|  | canvas->drawText(name, strlen(name), x, y, paint); | 
|  |  | 
|  | // Draw destination bitmap | 
|  | canvas->translate(0, vertOffset); | 
|  | x = (width - 40) / SkScalar(2); | 
|  | canvas->drawBitmap(fDst[i], x, 0, &paint); | 
|  | canvas->restore(); | 
|  |  | 
|  | canvas->translate(horizOffset, 0); | 
|  | } | 
|  | } | 
|  |  | 
|  | virtual uint32_t onGetFlags() const { return kSkipPicture_Flag | 
|  | | kSkipPipe_Flag; } | 
|  |  | 
|  | private: | 
|  | typedef GM INHERITED; | 
|  | }; | 
|  |  | 
|  | ////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | static GM* MyFactory(void*) { return new BitmapCopyGM; } | 
|  | static GMRegistry reg(MyFactory); | 
|  | } |