/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/core/SkAlphaType.h" #include "include/core/SkBitmap.h" #include "include/core/SkColor.h" #include "include/core/SkColorType.h" #include "include/core/SkImage.h" #include "include/core/SkImageInfo.h" #include "include/core/SkRefCnt.h" #include "tests/CtsEnforcement.h" #include "tests/Test.h" #if defined(SK_GRAPHITE) #include "include/gpu/graphite/Context.h" #include "include/gpu/graphite/Image.h" #include "include/gpu/graphite/Recorder.h" #endif #if defined(SK_GANESH) #include "include/gpu/GpuTypes.h" #include "include/gpu/GrDirectContext.h" #include "include/gpu/ganesh/SkImageGanesh.h" #include "src/gpu/ganesh/GrCaps.h" #include "src/gpu/ganesh/GrDirectContextPriv.h" struct GrContextOptions; #endif #include #include #include namespace { void run_test(skiatest::Reporter* reporter, bool testMipmaps, std::function(SkImage*, skgpu::Mipmapped)> convert2gpu) { for (auto mm : { skgpu::Mipmapped::kYes, skgpu::Mipmapped::kNo }) { if (!testMipmaps && mm == skgpu::Mipmapped::kYes) { continue; } for (auto ct : { kRGBA_8888_SkColorType, kAlpha_8_SkColorType }) { SkImageInfo ii = SkImageInfo::Make(9, 9, ct, kPremul_SkAlphaType); SkBitmap src; src.allocPixels(ii); src.eraseColor(SK_ColorWHITE); sk_sp raster = src.asImage(); sk_sp gpu = convert2gpu(raster.get(), mm); int bytesPerPixel = SkColorTypeBytesPerPixel(ct); size_t expectedSize = bytesPerPixel * gpu->width() * gpu->height(); if (mm == skgpu::Mipmapped::kYes) { expectedSize += expectedSize/3; } size_t actualSize = gpu->textureSize(); REPORTER_ASSERT(reporter, actualSize == expectedSize, "Expected: %zu Actual: %zu", expectedSize, actualSize); } } } } // anonymous namespace #if defined(SK_GANESH) DEF_GANESH_TEST_FOR_ALL_CONTEXTS(ImageSizeTest_Ganesh, reporter, ctxInfo, CtsEnforcement::kNextRelease) { auto dContext = ctxInfo.directContext(); bool testMipmaps = dContext->priv().caps()->mipmapSupport(); run_test(reporter, testMipmaps, [&](SkImage* src, skgpu::Mipmapped mipmapped) -> sk_sp { return SkImages::TextureFromImage(dContext, src, mipmapped); }); } #endif // SK_GANESH #if defined(SK_GRAPHITE) DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(ImageSizeTest_Graphite, reporter, context, CtsEnforcement::kNextRelease) { using namespace skgpu::graphite; std::unique_ptr recorder = context->makeRecorder(); run_test(reporter, /* testMipmaps= */ true, [&](SkImage* src, skgpu::Mipmapped mipmapped) -> sk_sp { return SkImages::TextureFromImage(recorder.get(), src, { mipmapped == skgpu::Mipmapped::kYes }); }); } #endif // SK_GRAPHITE