OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "DMSrcSink.h" | 8 #include "DMSrcSink.h" |
9 #include "Resources.h" | 9 #include "Resources.h" |
10 #include "SkAndroidCodec.h" | 10 #include "SkAndroidCodec.h" |
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 , fMode(mode) | 842 , fMode(mode) |
843 , fColorType(colorType) | 843 , fColorType(colorType) |
844 {} | 844 {} |
845 | 845 |
846 bool ColorCodecSrc::veto(SinkFlags flags) const { | 846 bool ColorCodecSrc::veto(SinkFlags flags) const { |
847 // Test to direct raster backends (8888 and 565). | 847 // Test to direct raster backends (8888 and 565). |
848 return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDir
ect; | 848 return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDir
ect; |
849 } | 849 } |
850 | 850 |
851 Error ColorCodecSrc::draw(SkCanvas* canvas) const { | 851 Error ColorCodecSrc::draw(SkCanvas* canvas) const { |
852 if (kRGB_565_SkColorType == canvas->imageInfo().colorType()) { | 852 bool runInLegacyMode = kBaseline_Mode == fMode; |
853 return Error::Nonfatal("No need to test color correction to 565 backend.
"); | 853 #if defined(SK_TEST_QCMS) |
854 } | 854 runInLegacyMode = runInLegacyMode || kQCMS_HPZR30w_Mode == fMode; |
| 855 #endif |
855 | 856 |
856 if (nullptr == canvas->imageInfo().colorSpace() && kRGBA_F16_SkColorType ==
fColorType) { | 857 if (runInLegacyMode && canvas->imageInfo().colorSpace()) { |
857 return Error::Nonfatal("F16 does not draw in legacy mode."); | 858 return Error::Nonfatal("Skipping tests that are only interesting in lega
cy mode."); |
| 859 } else if (!runInLegacyMode && !canvas->imageInfo().colorSpace()) { |
| 860 return Error::Nonfatal("Skipping tests that are only interesting in srgb
mode."); |
858 } | 861 } |
859 | 862 |
860 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); | 863 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
861 if (!encoded) { | 864 if (!encoded) { |
862 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); | 865 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); |
863 } | 866 } |
864 | 867 |
865 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); | 868 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
866 if (nullptr == codec.get()) { | 869 if (nullptr == codec.get()) { |
867 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str()); | 870 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str()); |
868 } | 871 } |
869 | 872 |
870 // Load the dst ICC profile. This particular dst is fairly similar to Adobe
RGB. | 873 // Load the dst ICC profile. This particular dst is fairly similar to Adobe
RGB. |
871 sk_sp<SkData> dstData = SkData::MakeFromFileName( | 874 sk_sp<SkData> dstData = SkData::MakeFromFileName( |
872 GetResourcePath("icc_profiles/HP_ZR30w.icc").c_str()); | 875 GetResourcePath("icc_profiles/HP_ZR30w.icc").c_str()); |
873 if (!dstData) { | 876 if (!dstData) { |
874 return "Cannot read monitor profile. Is the resource path set correctly
?"; | 877 return "Cannot read monitor profile. Is the resource path set correctly
?"; |
875 } | 878 } |
876 | 879 |
877 sk_sp<SkColorSpace> dstSpace = nullptr; | 880 sk_sp<SkColorSpace> dstSpace = nullptr; |
878 if (kDst_sRGB_Mode == fMode) { | 881 if (kDst_sRGB_Mode == fMode) { |
879 dstSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); | 882 dstSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); |
880 } else if (kDst_HPZR30w_Mode == fMode) { | 883 } else if (kDst_HPZR30w_Mode == fMode) { |
881 dstSpace = SkColorSpace::NewICC(dstData->data(), dstData->size()); | 884 dstSpace = SkColorSpace::NewICC(dstData->data(), dstData->size()); |
882 } | 885 } |
883 | 886 |
884 SkImageInfo decodeInfo = codec->getInfo().makeColorType(fColorType).makeColo
rSpace(dstSpace); | 887 SkImageInfo decodeInfo = codec->getInfo().makeColorType(fColorType).makeColo
rSpace(dstSpace); |
| 888 if (kUnpremul_SkAlphaType == decodeInfo.alphaType()) { |
| 889 decodeInfo = decodeInfo.makeAlphaType(kPremul_SkAlphaType); |
| 890 } |
| 891 |
885 SkImageInfo bitmapInfo = decodeInfo; | 892 SkImageInfo bitmapInfo = decodeInfo; |
886 if (kRGBA_8888_SkColorType == decodeInfo.colorType() || | 893 if (kRGBA_8888_SkColorType == decodeInfo.colorType() || |
887 kBGRA_8888_SkColorType == decodeInfo.colorType()) | 894 kBGRA_8888_SkColorType == decodeInfo.colorType()) |
888 { | 895 { |
889 bitmapInfo = bitmapInfo.makeColorType(kN32_SkColorType); | 896 bitmapInfo = bitmapInfo.makeColorType(kN32_SkColorType); |
890 } | 897 } |
891 | 898 |
892 SkBitmap bitmap; | 899 SkBitmap bitmap; |
893 if (!bitmap.tryAllocPixels(bitmapInfo)) { | 900 if (!bitmap.tryAllocPixels(bitmapInfo)) { |
894 return SkStringPrintf("Image(%s) is too large (%d x %d)", fPath.c_str(), | 901 return SkStringPrintf("Image(%s) is too large (%d x %d)", fPath.c_str(), |
895 bitmapInfo.width(), bitmapInfo.height()); | 902 bitmapInfo.width(), bitmapInfo.height()); |
896 } | 903 } |
897 | 904 |
898 size_t rowBytes = bitmap.rowBytes(); | 905 size_t rowBytes = bitmap.rowBytes(); |
899 SkCodec::Result r = codec->getPixels(decodeInfo, bitmap.getPixels(), rowByte
s); | 906 SkCodec::Result r = codec->getPixels(decodeInfo, bitmap.getPixels(), rowByte
s); |
900 if (SkCodec::kSuccess != r) { | 907 if (SkCodec::kSuccess != r) { |
901 return SkStringPrintf("Couldn't getPixels %s. Error code %d", fPath.c_st
r(), r); | 908 return SkStringPrintf("Couldn't getPixels %s. Error code %d", fPath.c_st
r(), r); |
902 } | 909 } |
903 | 910 |
904 switch (fMode) { | 911 switch (fMode) { |
905 case kBaseline_Mode: | 912 case kBaseline_Mode: |
906 case kDst_sRGB_Mode: | 913 case kDst_sRGB_Mode: |
907 case kDst_HPZR30w_Mode: | 914 case kDst_HPZR30w_Mode: |
908 canvas->drawBitmap(bitmap, 0, 0); | 915 canvas->drawBitmap(bitmap, 0, 0); |
909 break; | 916 break; |
910 #if defined(SK_TEST_QCMS) | 917 #if defined(SK_TEST_QCMS) |
911 case kQCMS_HPZR30w_Mode: { | 918 case kQCMS_HPZR30w_Mode: { |
912 sk_sp<SkData> srcData = codec->getICCData(); | 919 sk_sp<SkData> srcData = codec->getICCData(); |
| 920 if (!srcData) { |
| 921 return Error::Nonfatal("No ICC profile data. Cannot test with Q
CMS.\n"); |
| 922 } |
| 923 |
913 SkAutoTCallVProc<qcms_profile, qcms_profile_release> | 924 SkAutoTCallVProc<qcms_profile, qcms_profile_release> |
914 srcSpace(qcms_profile_from_memory(srcData->data(), srcData->
size())); | 925 srcSpace(qcms_profile_from_memory(srcData->data(), srcData->
size())); |
915 if (!srcSpace) { | 926 if (!srcSpace) { |
916 return Error::Nonfatal(SkStringPrintf("QCMS cannot create profil
e for %s.\n", | 927 return Error::Nonfatal(SkStringPrintf("QCMS cannot create profil
e for %s.\n", |
917 fPath.c_str())); | 928 fPath.c_str())); |
918 } | 929 } |
919 | 930 |
920 SkAutoTCallVProc<qcms_profile, qcms_profile_release> | 931 SkAutoTCallVProc<qcms_profile, qcms_profile_release> |
921 dstSpace(qcms_profile_from_memory(dstData->data(), dstData->
size())); | 932 dstSpace(qcms_profile_from_memory(dstData->data(), dstData->
size())); |
922 SkASSERT(dstSpace); | 933 SkASSERT(dstSpace); |
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1556 skr.visit(i, drawsAsSingletonPictures); | 1567 skr.visit(i, drawsAsSingletonPictures); |
1557 } | 1568 } |
1558 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); | 1569 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); |
1559 | 1570 |
1560 canvas->drawPicture(macroPic); | 1571 canvas->drawPicture(macroPic); |
1561 return check_against_reference(bitmap, src, fSink); | 1572 return check_against_reference(bitmap, src, fSink); |
1562 }); | 1573 }); |
1563 } | 1574 } |
1564 | 1575 |
1565 } // namespace DM | 1576 } // namespace DM |
OLD | NEW |