|  | 
 | /* | 
 |  * Copyright 2025 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/SkBitmap.h" | 
 | #include "include/core/SkBlurTypes.h" | 
 | #include "include/core/SkCPUContext.h" | 
 | #include "include/core/SkCPURecorder.h" | 
 | #include "include/core/SkCanvas.h" | 
 | #include "include/core/SkColor.h" | 
 | #include "include/core/SkColorSpace.h" | 
 | #include "include/core/SkImageInfo.h" | 
 | #include "include/core/SkMaskFilter.h" | 
 | #include "include/core/SkPaint.h" | 
 | #include "include/core/SkRRect.h" | 
 | #include "include/core/SkSurface.h" | 
 | #include "src/core/SkCPUContextImpl.h" | 
 | #include "src/core/SkResourceCache.h" | 
 |  | 
 | #include "tests/Test.h" | 
 |  | 
 | #include <memory> | 
 |  | 
 | DEF_TEST(CPUSurface_UsesCPUContextAndRecorderToDraw_DrawsPixels, reporter) { | 
 |     skcpu::Context::Options opts; | 
 |     auto ctx = skcpu::Context::Make(opts); | 
 |     std::unique_ptr<skcpu::Recorder> recorder = ctx->makeRecorder(); | 
 |     SkImageInfo imageInfo = | 
 |             SkImageInfo::Make(100, 100, kRGBA_8888_SkColorType, kPremul_SkAlphaType); | 
 |     auto surface = recorder->makeBitmapSurface(imageInfo, imageInfo.minRowBytes(), {}); | 
 |     SkPaint paint; | 
 |     paint.setColor(SK_ColorRED); | 
 |     paint.setMaskFilter(SkMaskFilter::MakeBlur(SkBlurStyle::kNormal_SkBlurStyle, 3.1f)); | 
 |     surface->getCanvas()->drawRRect(SkRRect::MakeRectXY(SkRect::MakeWH(50, 50), 10, 15), paint); | 
 |     SkPixmap pmap; | 
 |     REPORTER_ASSERT(reporter, surface->peekPixels(&pmap)); | 
 |     REPORTER_ASSERT(reporter, pmap.getColor(25, 25) == SK_ColorRED); | 
 |     REPORTER_ASSERT(reporter, surface->getCanvas()->baseRecorder() == recorder.get()); | 
 | } | 
 |  | 
 | DEF_TEST(CPUSurface_UsesTODORecorder_DrawsPixels, reporter) { | 
 |     SkImageInfo imageInfo = | 
 |             SkImageInfo::Make(100, 100, kRGBA_8888_SkColorType, kPremul_SkAlphaType); | 
 |     auto surface = skcpu::Recorder::TODO()->makeBitmapSurface(imageInfo, imageInfo.minRowBytes(), {}); | 
 |     SkPaint paint; | 
 |     paint.setColor(SK_ColorRED); | 
 |     paint.setMaskFilter(SkMaskFilter::MakeBlur(SkBlurStyle::kNormal_SkBlurStyle, 3.1f)); | 
 |     surface->getCanvas()->clear(SK_ColorGREEN); | 
 |     surface->getCanvas()->drawRRect(SkRRect::MakeRectXY(SkRect::MakeWH(50, 50), 10, 15), paint); | 
 |     SkPixmap pmap; | 
 |     REPORTER_ASSERT(reporter, surface->peekPixels(&pmap)); | 
 |     REPORTER_ASSERT(reporter, pmap.getColor(25, 25) == SK_ColorRED); | 
 |     REPORTER_ASSERT(reporter, surface->getCanvas()->baseRecorder() == skcpu::Recorder::TODO()); | 
 | } | 
 |  | 
 | DEF_TEST(ImageMakeColorSpace_UsesCPURecorderToMakeImage_Success, reporter) { | 
 |     auto ctx = skcpu::Context::Make(); | 
 |     std::unique_ptr<skcpu::Recorder> recorder = ctx->makeRecorder(); | 
 |     SkBitmap bm; | 
 |     bm.setInfo(SkImageInfo::Make(100, 100, kRGBA_8888_SkColorType, kPremul_SkAlphaType)); | 
 |     bm.allocPixels(); | 
 |     auto img = SkImages::RasterFromBitmap(bm); | 
 |     SkASSERT(img); | 
 |     REPORTER_ASSERT(reporter, img->isValid(recorder.get())); | 
 |     auto newImg = img->makeColorSpace(recorder.get(), SkColorSpace::MakeSRGBLinear(), {}); | 
 |     REPORTER_ASSERT(reporter, newImg); | 
 |     REPORTER_ASSERT(reporter, newImg->width() == 100); | 
 |     REPORTER_ASSERT(reporter, !newImg->isTextureBacked()); | 
 | } | 
 |  | 
 | DEF_TEST(ImageMakeScaled_UsesCPURecorderToMakeImage_Success, reporter) { | 
 |     auto ctx = skcpu::Context::Make(); | 
 |     std::unique_ptr<skcpu::Recorder> recorder = ctx->makeRecorder(); | 
 |     SkBitmap bm; | 
 |     bm.setInfo(SkImageInfo::Make(100, 100, kRGBA_8888_SkColorType, kPremul_SkAlphaType)); | 
 |     bm.allocPixels(); | 
 |     auto img = SkImages::RasterFromBitmap(bm); | 
 |     SkASSERT(img); | 
 |     auto newImg = | 
 |             img->makeScaled(recorder.get(), | 
 |                             SkImageInfo::Make(70, 70, kRGBA_8888_SkColorType, kPremul_SkAlphaType), | 
 |                             {SkCubicResampler::Mitchell()}); | 
 |     REPORTER_ASSERT(reporter, newImg); | 
 |     REPORTER_ASSERT(reporter, newImg->width() == 70); | 
 |     REPORTER_ASSERT(reporter, !newImg->isTextureBacked()); | 
 |     auto legacyAPI = | 
 |             img->makeScaled(SkImageInfo::Make(70, 70, kRGBA_8888_SkColorType, kPremul_SkAlphaType), | 
 |                             {SkCubicResampler::Mitchell()}); | 
 |     REPORTER_ASSERT(reporter, legacyAPI); | 
 |     REPORTER_ASSERT(reporter, legacyAPI->width() == 70); | 
 |     REPORTER_ASSERT(reporter, !legacyAPI->isTextureBacked()); | 
 | } |