| /* | |
| * 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 <cstddef> | |
| #include <functional> | |
| #include <initializer_list> | |
| namespace { | |
| void run_test(skiatest::Reporter* reporter, bool testMipmaps, | |
| std::function<sk_sp<SkImage>(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<SkImage> raster = src.asImage(); | |
| sk_sp<SkImage> 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<SkImage> { | |
| 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> recorder = context->makeRecorder(); | |
| run_test(reporter, /* testMipmaps= */ true, | |
| [&](SkImage* src, skgpu::Mipmapped mipmapped) -> sk_sp<SkImage> { | |
| return SkImages::TextureFromImage(recorder.get(), src, | |
| { mipmapped == skgpu::Mipmapped::kYes }); | |
| }); | |
| } | |
| #endif // SK_GRAPHITE |