@@ -309,6 +309,7 @@ TEST_F(ImageDecoderFixtureTest, ImpellerWideGamutDisplayP3) {
309
309
ImageDecoderImpeller::DecompressTexture (
310
310
descriptor.get (), SkISize::Make (100 , 100 ), {100 , 100 },
311
311
/* supports_wide_gamut=*/ true );
312
+ ASSERT_TRUE (wide_bitmap);
312
313
ASSERT_EQ (wide_bitmap->colorType (), kRGBA_F16_SkColorType );
313
314
ASSERT_TRUE (wide_bitmap->colorSpace ()->isSRGB ());
314
315
const SkPixmap& wide_pixmap = wide_bitmap->pixmap ();
@@ -333,6 +334,60 @@ TEST_F(ImageDecoderFixtureTest, ImpellerWideGamutDisplayP3) {
333
334
#endif // IMPELLER_SUPPORTS_RENDERING
334
335
}
335
336
337
+ namespace {
338
+ float DecodeBGR10 (uint32_t x) {
339
+ const float max = 1 .25098f ;
340
+ const float min = -0 .752941f ;
341
+ const float intercept = min;
342
+ const float slope = (max - min) / 1024 .0f ;
343
+ return (x * slope) + intercept;
344
+ }
345
+ } // namespace
346
+
347
+ TEST_F (ImageDecoderFixtureTest, ImpellerWideGamutDisplayP3Opaque) {
348
+ auto data = OpenFixtureAsSkData (" DisplayP3Logo.jpg" );
349
+ auto image = SkImage::MakeFromEncoded (data);
350
+ ASSERT_TRUE (image != nullptr );
351
+ ASSERT_EQ (SkISize::Make (100 , 100 ), image->dimensions ());
352
+
353
+ ImageGeneratorRegistry registry;
354
+ std::shared_ptr<ImageGenerator> generator =
355
+ registry.CreateCompatibleGenerator (data);
356
+ ASSERT_TRUE (generator);
357
+
358
+ auto descriptor = fml::MakeRefCounted<ImageDescriptor>(std::move (data),
359
+ std::move (generator));
360
+
361
+ #if IMPELLER_SUPPORTS_RENDERING
362
+ std::shared_ptr<SkBitmap> wide_bitmap =
363
+ ImageDecoderImpeller::DecompressTexture (
364
+ descriptor.get (), SkISize::Make (100 , 100 ), {100 , 100 },
365
+ /* supports_wide_gamut=*/ true );
366
+ ASSERT_TRUE (wide_bitmap);
367
+ ASSERT_EQ (wide_bitmap->colorType (), kBGR_101010x_XR_SkColorType );
368
+ ASSERT_TRUE (wide_bitmap->colorSpace ()->isSRGB ());
369
+ const SkPixmap& wide_pixmap = wide_bitmap->pixmap ();
370
+ const uint32_t * pixel_ptr = static_cast <const uint32_t *>(wide_pixmap.addr ());
371
+ bool found_deep_red = false ;
372
+ for (int i = 0 ; i < wide_pixmap.width () * wide_pixmap.height (); ++i) {
373
+ uint32_t pixel = *pixel_ptr++;
374
+ float blue = DecodeBGR10 ((pixel >> 0 ) & 0x3ff );
375
+ float green = DecodeBGR10 ((pixel >> 10 ) & 0x3ff );
376
+ float red = DecodeBGR10 ((pixel >> 20 ) & 0x3ff );
377
+ if (fabsf (red - 1 .0931f ) < 0 .01f && fabsf (green - -0 .2268f ) < 0 .01f &&
378
+ fabsf (blue - -0 .1501f ) < 0 .01f ) {
379
+ found_deep_red = true ;
380
+ break ;
381
+ }
382
+ }
383
+ ASSERT_TRUE (found_deep_red);
384
+ std::shared_ptr<SkBitmap> bitmap = ImageDecoderImpeller::DecompressTexture (
385
+ descriptor.get (), SkISize::Make (100 , 100 ), {100 , 100 },
386
+ /* supports_wide_gamut=*/ false );
387
+ ASSERT_EQ (bitmap->colorType (), kRGBA_8888_SkColorType );
388
+ #endif // IMPELLER_SUPPORTS_RENDERING
389
+ }
390
+
336
391
TEST_F (ImageDecoderFixtureTest, ImpellerNonWideGamut) {
337
392
auto data = OpenFixtureAsSkData (" Horizontal.jpg" );
338
393
auto image = SkImage::MakeFromEncoded (data);
0 commit comments