| /* | |
| * 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/gm.h" | |
| #include "include/core/SkBitmap.h" | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkColor.h" | |
| #include "include/core/SkColorType.h" | |
| #include "include/core/SkFont.h" | |
| #include "include/core/SkFontTypes.h" | |
| #include "include/core/SkImageInfo.h" | |
| #include "include/core/SkPaint.h" | |
| #include "include/core/SkRect.h" | |
| #include "include/core/SkScalar.h" | |
| #include "include/core/SkSize.h" | |
| #include "include/core/SkString.h" | |
| #include "include/core/SkTypeface.h" | |
| #include "include/core/SkTypes.h" | |
| #include "tools/ToolUtils.h" | |
| #include "tools/fonts/FontToolUtils.h" | |
| #include <string.h> | |
| #include <array> | |
| namespace { | |
| static const char* color_type_name(SkColorType colorType) { | |
| switch (colorType) { | |
| case kUnknown_SkColorType: return "unknown"; | |
| case kAlpha_8_SkColorType: return "A8"; | |
| case kRGB_565_SkColorType: return "565"; | |
| case kARGB_4444_SkColorType: return "4444"; | |
| case kRGBA_8888_SkColorType: return "8888"; | |
| case kRGB_888x_SkColorType: return "888x"; | |
| case kBGRA_8888_SkColorType: return "8888"; | |
| case kRGBA_1010102_SkColorType: return "1010102"; | |
| case kRGB_101010x_SkColorType: return "101010x"; | |
| case kBGRA_1010102_SkColorType: return "bgra1010102"; | |
| case kBGR_101010x_SkColorType: return "bgr101010x"; | |
| case kBGR_101010x_XR_SkColorType: return "bgr101010x_xr"; | |
| case kBGRA_10101010_XR_SkColorType: return "bgra10101010_xr"; | |
| case kRGBA_10x6_SkColorType: return "10101010"; | |
| case kGray_8_SkColorType: return "G8"; | |
| case kRGBA_F16Norm_SkColorType: return "F16Norm"; | |
| case kRGB_F16F16F16x_SkColorType: return "F16F16F16x"; | |
| case kRGBA_F16_SkColorType: return "F16"; | |
| case kRGBA_F32_SkColorType: return "F32"; | |
| case kR8G8_unorm_SkColorType: return "R8G8_unorm"; | |
| case kA16_unorm_SkColorType: return "A16_unorm"; | |
| case kR16_unorm_SkColorType: return "R16_unorm"; | |
| case kR16G16_unorm_SkColorType: return "R16G16_unorm"; | |
| case kA16_float_SkColorType: return "A16_float"; | |
| case kR16_float_SkColorType: return "R16_float"; | |
| case kR16G16_float_SkColorType: return "R16G16_float"; | |
| case kR16G16B16A16_unorm_SkColorType: return "R16G16B16A16_unorm"; | |
| case kSRGBA_8888_SkColorType: return "SRGBA_8888"; | |
| case kR8_unorm_SkColorType: return "R8_unorm"; | |
| } | |
| return ""; | |
| } | |
| constexpr auto gColorTypes = std::to_array<SkColorType>({ | |
| kRGB_565_SkColorType, | |
| kARGB_4444_SkColorType, | |
| kN32_SkColorType, | |
| }); | |
| #define NUM_CONFIGS std::size(gColorTypes) | |
| static void draw_checks(SkCanvas* canvas, int width, int height) { | |
| SkPaint paint; | |
| paint.setColor(SK_ColorRED); | |
| canvas->drawRect(SkRect::MakeIWH(width/2, height/2), paint); | |
| paint.setColor(SK_ColorGREEN); | |
| canvas->drawRect({ SkIntToScalar(width/2), 0, SkIntToScalar(width), SkIntToScalar(height/2) }, | |
| paint); | |
| paint.setColor(SK_ColorBLUE); | |
| canvas->drawRect({ 0, SkIntToScalar(height/2), SkIntToScalar(width/2), SkIntToScalar(height) }, | |
| paint); | |
| paint.setColor(SK_ColorYELLOW); | |
| canvas->drawRect({ SkIntToScalar(width/2), SkIntToScalar(height/2), SkIntToScalar(width), | |
| SkIntToScalar(height) }, paint); | |
| } | |
| class BitmapCopyGM : public skiagm::GM { | |
| std::array<SkBitmap, NUM_CONFIGS> fDst; | |
| void onOnceBeforeDraw() override { this->setBGColor(0xFFDDDDDD); } | |
| SkString getName() const override { return SkString("bitmapcopy"); } | |
| SkISize getISize() override { return {540, 330}; } | |
| void onDraw(SkCanvas* canvas) override { | |
| SkPaint paint; | |
| SkScalar horizMargin = 10; | |
| SkScalar vertMargin = 10; | |
| SkBitmap src; | |
| src.allocN32Pixels(40, 40, kOpaque_SkAlphaType); | |
| SkCanvas canvasTmp(src); | |
| draw_checks(&canvasTmp, 40, 40); | |
| for (unsigned i = 0; i < NUM_CONFIGS; ++i) { | |
| ToolUtils::copy_to(&fDst[i], gColorTypes[i], src); | |
| } | |
| canvas->clear(0xFFDDDDDD); | |
| paint.setAntiAlias(true); | |
| SkFont font = ToolUtils::DefaultPortableFont(); | |
| SkScalar width = SkIntToScalar(40); | |
| SkScalar height = SkIntToScalar(40); | |
| if (font.getSpacing() > height) { | |
| height = font.getSpacing(); | |
| } | |
| for (unsigned i = 0; i < NUM_CONFIGS; i++) { | |
| const char* name = color_type_name(src.colorType()); | |
| SkScalar textWidth = font.measureText(name, strlen(name), SkTextEncoding::kUTF8); | |
| 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 = color_type_name(fDst[i].colorType()); | |
| SkScalar textWidth = font.measureText(name, strlen(name), SkTextEncoding::kUTF8); | |
| SkScalar x = (width - textWidth) / SkScalar(2); | |
| SkScalar y = font.getSpacing() / SkScalar(2); | |
| canvas->drawSimpleText(name, strlen(name), SkTextEncoding::kUTF8, x, y, font, paint); | |
| // Draw destination bitmap | |
| canvas->translate(0, vertOffset); | |
| x = (width - 40) / SkScalar(2); | |
| canvas->drawImage(fDst[i].asImage(), x, 0, SkSamplingOptions(), &paint); | |
| canvas->restore(); | |
| canvas->translate(horizOffset, 0); | |
| } | |
| } | |
| }; | |
| } // namespace | |
| ////////////////////////////////////////////////////////////////////////////// | |
| DEF_GM( return new BitmapCopyGM; ) |