OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013, Google Inc. All rights reserved. | 2 * Copyright (c) 2013, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 color_format32, src_pixel.get(), 1, | 569 color_format32, src_pixel.get(), 1, |
570 SkAlphaType::kPremul_SkAlphaType); | 570 SkAlphaType::kPremul_SkAlphaType); |
571 | 571 |
572 int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(), | 572 int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(), |
573 image_info.bytesPerPixel()); | 573 image_info.bytesPerPixel()); |
574 ASSERT_EQ(compare, 0); | 574 ASSERT_EQ(compare, 0); |
575 } | 575 } |
576 } | 576 } |
577 | 577 |
578 TEST_F(ImageBitmapTest, ImageBitmapColorSpaceConversionImageData) { | 578 TEST_F(ImageBitmapTest, ImageBitmapColorSpaceConversionImageData) { |
579 unsigned char data_buffer[4] = {255, 0, 0, 255}; | 579 sk_sp<SkColorSpace> src_rgb_color_space = SkColorSpace::MakeSRGB(); |
| 580 unsigned char data_buffer[4] = {32, 96, 160, 255}; |
580 DOMUint8ClampedArray* data = DOMUint8ClampedArray::Create(data_buffer, 4); | 581 DOMUint8ClampedArray* data = DOMUint8ClampedArray::Create(data_buffer, 4); |
581 ImageData* image_data = | 582 ImageDataColorSettings color_settings; |
582 ImageData::Create(IntSize(1, 1), NotShared<DOMUint8ClampedArray>(data)); | 583 ImageData* image_data = ImageData::Create( |
| 584 IntSize(1, 1), NotShared<DOMUint8ClampedArray>(data), &color_settings); |
583 std::unique_ptr<uint8_t[]> src_pixel(new uint8_t[4]()); | 585 std::unique_ptr<uint8_t[]> src_pixel(new uint8_t[4]()); |
584 memcpy(src_pixel.get(), image_data->data()->Data(), 4); | 586 memcpy(src_pixel.get(), image_data->data()->Data(), 4); |
585 | 587 |
586 Optional<IntRect> crop_rect = IntRect(0, 0, 1, 1); | 588 Optional<IntRect> crop_rect = IntRect(0, 0, 1, 1); |
587 sk_sp<SkColorSpace> color_space = nullptr; | 589 sk_sp<SkColorSpace> color_space = nullptr; |
588 SkColorSpaceXform::ColorFormat color_format32 = | |
589 (SkColorType::kN32_SkColorType == kBGRA_8888_SkColorType) | |
590 ? SkColorSpaceXform::ColorFormat::kBGRA_8888_ColorFormat | |
591 : SkColorSpaceXform::ColorFormat::kRGBA_8888_ColorFormat; | |
592 SkColorType color_type = SkColorType::kN32_SkColorType; | 590 SkColorType color_type = SkColorType::kN32_SkColorType; |
593 SkColorSpaceXform::ColorFormat color_format = color_format32; | 591 SkColorSpaceXform::ColorFormat color_format = |
| 592 SkColorSpaceXform::ColorFormat::kRGBA_8888_ColorFormat; |
594 | 593 |
595 for (uint8_t i = | 594 for (uint8_t i = |
596 static_cast<uint8_t>(ColorSpaceConversion::DEFAULT_COLOR_CORRECTED); | 595 static_cast<uint8_t>(ColorSpaceConversion::DEFAULT_COLOR_CORRECTED); |
597 i <= static_cast<uint8_t>(ColorSpaceConversion::LINEAR_RGB); i++) { | 596 i <= static_cast<uint8_t>(ColorSpaceConversion::LAST); i++) { |
598 ColorSpaceConversion color_space_conversion = | 597 ColorSpaceConversion color_space_conversion = |
599 static_cast<ColorSpaceConversion>(i); | 598 static_cast<ColorSpaceConversion>(i); |
600 ImageBitmapOptions options = | 599 ImageBitmapOptions options = |
601 PrepareBitmapOptionsAndSetRuntimeFlags(color_space_conversion); | 600 PrepareBitmapOptionsAndSetRuntimeFlags(color_space_conversion); |
602 ImageBitmap* image_bitmap = | 601 ImageBitmap* image_bitmap = |
603 ImageBitmap::Create(image_data, crop_rect, options); | 602 ImageBitmap::Create(image_data, crop_rect, options); |
604 | 603 |
605 SkImage* converted_image = | 604 SkImage* converted_image = |
606 image_bitmap->BitmapImage()->ImageForCurrentFrame().get(); | 605 image_bitmap->BitmapImage()->ImageForCurrentFrame().get(); |
607 | 606 |
608 switch (color_space_conversion) { | 607 switch (color_space_conversion) { |
609 case ColorSpaceConversion::NONE: | 608 case ColorSpaceConversion::NONE: |
610 NOTREACHED(); | 609 NOTREACHED(); |
611 break; | 610 break; |
612 case ColorSpaceConversion::DEFAULT_COLOR_CORRECTED: | 611 case ColorSpaceConversion::DEFAULT_COLOR_CORRECTED: |
613 case ColorSpaceConversion::SRGB: | 612 case ColorSpaceConversion::SRGB: |
614 color_space = SkColorSpace::MakeSRGB(); | 613 color_space = SkColorSpace::MakeSRGB(); |
615 color_format = color_format32; | |
616 break; | 614 break; |
617 case ColorSpaceConversion::LINEAR_RGB: | 615 case ColorSpaceConversion::LINEAR_RGB: |
618 color_space = SkColorSpace::MakeSRGBLinear(); | 616 color_space = SkColorSpace::MakeSRGBLinear(); |
619 color_type = SkColorType::kRGBA_F16_SkColorType; | 617 color_type = SkColorType::kRGBA_F16_SkColorType; |
620 color_format = SkColorSpaceXform::ColorFormat::kRGBA_F16_ColorFormat; | 618 color_format = SkColorSpaceXform::ColorFormat::kRGBA_F16_ColorFormat; |
621 break; | 619 break; |
| 620 case ColorSpaceConversion::P3: |
| 621 color_space = |
| 622 SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma, |
| 623 SkColorSpace::kDCIP3_D65_Gamut); |
| 624 color_type = SkColorType::kRGBA_F16_SkColorType; |
| 625 color_format = SkColorSpaceXform::ColorFormat::kRGBA_F16_ColorFormat; |
| 626 break; |
| 627 case ColorSpaceConversion::REC2020: |
| 628 color_space = |
| 629 SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma, |
| 630 SkColorSpace::kRec2020_Gamut); |
| 631 color_type = SkColorType::kRGBA_F16_SkColorType; |
| 632 color_format = SkColorSpaceXform::ColorFormat::kRGBA_F16_ColorFormat; |
| 633 break; |
622 default: | 634 default: |
623 NOTREACHED(); | 635 NOTREACHED(); |
624 } | 636 } |
625 | 637 |
626 SkImageInfo image_info = SkImageInfo::Make( | 638 SkImageInfo image_info = SkImageInfo::Make( |
627 1, 1, color_type, SkAlphaType::kUnpremul_SkAlphaType, color_space); | 639 1, 1, color_type, SkAlphaType::kUnpremul_SkAlphaType, color_space); |
628 std::unique_ptr<uint8_t[]> converted_pixel( | 640 std::unique_ptr<uint8_t[]> converted_pixel( |
629 new uint8_t[image_info.bytesPerPixel()]()); | 641 new uint8_t[image_info.bytesPerPixel()]()); |
630 converted_image->readPixels( | 642 converted_image->readPixels( |
631 image_info, converted_pixel.get(), | 643 image_info, converted_pixel.get(), |
632 converted_image->width() * image_info.bytesPerPixel(), 0, 0); | 644 converted_image->width() * image_info.bytesPerPixel(), 0, 0); |
633 | 645 |
634 // Transform the source pixel and check if the pixel from image bitmap has | 646 // Transform the source pixel and check if the pixel from image bitmap has |
635 // the same color information. | 647 // the same color information. |
636 std::unique_ptr<SkColorSpaceXform> color_space_xform = | 648 std::unique_ptr<SkColorSpaceXform> color_space_xform = |
637 SkColorSpaceXform::New(image_data->GetSkColorSpace().get(), | 649 SkColorSpaceXform::New(src_rgb_color_space.get(), color_space.get()); |
638 color_space.get()); | |
639 std::unique_ptr<uint8_t[]> transformed_pixel( | 650 std::unique_ptr<uint8_t[]> transformed_pixel( |
640 new uint8_t[image_info.bytesPerPixel()]()); | 651 new uint8_t[image_info.bytesPerPixel()]()); |
641 color_space_xform->apply(color_format, transformed_pixel.get(), | 652 color_space_xform->apply( |
642 color_format32, src_pixel.get(), 1, | 653 color_format, transformed_pixel.get(), |
643 SkAlphaType::kUnpremul_SkAlphaType); | 654 SkColorSpaceXform::ColorFormat::kRGBA_8888_ColorFormat, src_pixel.get(), |
| 655 1, SkAlphaType::kUnpremul_SkAlphaType); |
| 656 |
| 657 LOG(ERROR) << "ColorSpaceConversion: " << (int)(i); |
| 658 std::stringstream str, str2; |
| 659 for (int p = 0; p < image_info.bytesPerPixel(); p++) { |
| 660 str << (int)(converted_pixel[p]) << ", "; |
| 661 str2 << (int)(transformed_pixel[p]) << ", "; |
| 662 } |
| 663 LOG(ERROR) << "converted_pixel: " << str.str(); |
| 664 LOG(ERROR) << "transformed_pixel: " << str2.str(); |
| 665 |
644 int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(), | 666 int compare = std::memcmp(converted_pixel.get(), transformed_pixel.get(), |
645 image_info.bytesPerPixel()); | 667 image_info.bytesPerPixel()); |
646 ASSERT_EQ(compare, 0); | 668 ASSERT_EQ(compare, 0); |
647 } | 669 } |
648 } | 670 } |
649 | 671 |
650 } // namespace blink | 672 } // namespace blink |
OLD | NEW |