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 835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 if (kRGB_565_SkColorType == canvas->imageInfo().colorType()) { |
853 return Error::Nonfatal("No need to test color correction to 565 backend.
"); | 853 return Error::Nonfatal("No need to test color correction to 565 backend.
"); |
854 } | 854 } |
855 | 855 |
856 if (nullptr == canvas->imageInfo().colorSpace() && kRGBA_F16_SkColorType ==
fColorType) { | 856 bool runInLegacyMode = kBaseline_Mode == fMode; |
857 return Error::Nonfatal("F16 does not draw in legacy mode."); | 857 #if defined(SK_TEST_QCMS) |
| 858 runInLegacyMode = runInLegacyMode || kQCMS_HPZR30w_Mode == fMode; |
| 859 #endif |
| 860 |
| 861 if (runInLegacyMode && canvas->imageInfo().colorSpace()) { |
| 862 return Error::Nonfatal("Skipping tests that are only interesting in lega
cy mode."); |
| 863 } else if (!runInLegacyMode && !canvas->imageInfo().colorSpace()) { |
| 864 return Error::Nonfatal("Skipping tests that are only interesting in srgb
mode."); |
858 } | 865 } |
859 | 866 |
860 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); | 867 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
861 if (!encoded) { | 868 if (!encoded) { |
862 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); | 869 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); |
863 } | 870 } |
864 | 871 |
865 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); | 872 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
866 if (nullptr == codec.get()) { | 873 if (nullptr == codec.get()) { |
867 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str()); | 874 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str()); |
868 } | 875 } |
869 | 876 |
870 // Load the dst ICC profile. This particular dst is fairly similar to Adobe
RGB. | 877 // Load the dst ICC profile. This particular dst is fairly similar to Adobe
RGB. |
871 sk_sp<SkData> dstData = SkData::MakeFromFileName( | 878 sk_sp<SkData> dstData = SkData::MakeFromFileName( |
872 GetResourcePath("icc_profiles/HP_ZR30w.icc").c_str()); | 879 GetResourcePath("icc_profiles/HP_ZR30w.icc").c_str()); |
873 if (!dstData) { | 880 if (!dstData) { |
874 return "Cannot read monitor profile. Is the resource path set correctly
?"; | 881 return "Cannot read monitor profile. Is the resource path set correctly
?"; |
875 } | 882 } |
876 | 883 |
877 sk_sp<SkColorSpace> dstSpace = nullptr; | 884 sk_sp<SkColorSpace> dstSpace = nullptr; |
878 if (kDst_sRGB_Mode == fMode) { | 885 if (kDst_sRGB_Mode == fMode) { |
879 dstSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); | 886 dstSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); |
880 } else if (kDst_HPZR30w_Mode == fMode) { | 887 } else if (kDst_HPZR30w_Mode == fMode) { |
881 dstSpace = SkColorSpace::NewICC(dstData->data(), dstData->size()); | 888 dstSpace = SkColorSpace::NewICC(dstData->data(), dstData->size()); |
882 } | 889 } |
883 | 890 |
884 SkImageInfo decodeInfo = codec->getInfo().makeColorType(fColorType).makeColo
rSpace(dstSpace); | 891 SkImageInfo decodeInfo = codec->getInfo().makeColorType(fColorType).makeColo
rSpace(dstSpace); |
| 892 if (kUnpremul_SkAlphaType == decodeInfo.alphaType()) { |
| 893 decodeInfo = decodeInfo.makeAlphaType(kPremul_SkAlphaType); |
| 894 } |
| 895 |
885 SkImageInfo bitmapInfo = decodeInfo; | 896 SkImageInfo bitmapInfo = decodeInfo; |
886 if (kRGBA_8888_SkColorType == decodeInfo.colorType() || | 897 if (kRGBA_8888_SkColorType == decodeInfo.colorType() || |
887 kBGRA_8888_SkColorType == decodeInfo.colorType()) | 898 kBGRA_8888_SkColorType == decodeInfo.colorType()) |
888 { | 899 { |
889 bitmapInfo = bitmapInfo.makeColorType(kN32_SkColorType); | 900 bitmapInfo = bitmapInfo.makeColorType(kN32_SkColorType); |
890 } | 901 } |
891 | 902 |
892 SkBitmap bitmap; | 903 SkBitmap bitmap; |
893 if (!bitmap.tryAllocPixels(bitmapInfo)) { | 904 if (!bitmap.tryAllocPixels(bitmapInfo)) { |
894 return SkStringPrintf("Image(%s) is too large (%d x %d)", fPath.c_str(), | 905 return SkStringPrintf("Image(%s) is too large (%d x %d)", fPath.c_str(), |
895 bitmapInfo.width(), bitmapInfo.height()); | 906 bitmapInfo.width(), bitmapInfo.height()); |
896 } | 907 } |
897 | 908 |
898 size_t rowBytes = bitmap.rowBytes(); | 909 size_t rowBytes = bitmap.rowBytes(); |
899 SkCodec::Result r = codec->getPixels(decodeInfo, bitmap.getPixels(), rowByte
s); | 910 SkCodec::Result r = codec->getPixels(decodeInfo, bitmap.getPixels(), rowByte
s); |
900 if (SkCodec::kSuccess != r) { | 911 if (SkCodec::kSuccess != r) { |
901 return SkStringPrintf("Couldn't getPixels %s. Error code %d", fPath.c_st
r(), r); | 912 return SkStringPrintf("Couldn't getPixels %s. Error code %d", fPath.c_st
r(), r); |
902 } | 913 } |
903 | 914 |
904 switch (fMode) { | 915 switch (fMode) { |
905 case kBaseline_Mode: | 916 case kBaseline_Mode: |
906 case kDst_sRGB_Mode: | 917 case kDst_sRGB_Mode: |
907 case kDst_HPZR30w_Mode: | 918 case kDst_HPZR30w_Mode: |
908 canvas->drawBitmap(bitmap, 0, 0); | 919 canvas->drawBitmap(bitmap, 0, 0); |
909 break; | 920 break; |
910 #if defined(SK_TEST_QCMS) | 921 #if defined(SK_TEST_QCMS) |
911 case kQCMS_HPZR30w_Mode: { | 922 case kQCMS_HPZR30w_Mode: { |
912 sk_sp<SkData> srcData = codec->getICCData(); | 923 sk_sp<SkData> srcData = codec->getICCData(); |
| 924 if (!srcData) { |
| 925 return Error::Nonfatal("No ICC profile data. Cannot test with Q
CMS.\n"); |
| 926 } |
| 927 |
913 SkAutoTCallVProc<qcms_profile, qcms_profile_release> | 928 SkAutoTCallVProc<qcms_profile, qcms_profile_release> |
914 srcSpace(qcms_profile_from_memory(srcData->data(), srcData->
size())); | 929 srcSpace(qcms_profile_from_memory(srcData->data(), srcData->
size())); |
915 if (!srcSpace) { | 930 if (!srcSpace) { |
916 return Error::Nonfatal(SkStringPrintf("QCMS cannot create profil
e for %s.\n", | 931 return Error::Nonfatal(SkStringPrintf("QCMS cannot create profil
e for %s.\n", |
917 fPath.c_str())); | 932 fPath.c_str())); |
918 } | 933 } |
919 | 934 |
920 SkAutoTCallVProc<qcms_profile, qcms_profile_release> | 935 SkAutoTCallVProc<qcms_profile, qcms_profile_release> |
921 dstSpace(qcms_profile_from_memory(dstData->data(), dstData->
size())); | 936 dstSpace(qcms_profile_from_memory(dstData->data(), dstData->
size())); |
922 SkASSERT(dstSpace); | 937 SkASSERT(dstSpace); |
(...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1556 skr.visit(i, drawsAsSingletonPictures); | 1571 skr.visit(i, drawsAsSingletonPictures); |
1557 } | 1572 } |
1558 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); | 1573 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); |
1559 | 1574 |
1560 canvas->drawPicture(macroPic); | 1575 canvas->drawPicture(macroPic); |
1561 return check_against_reference(bitmap, src, fSink); | 1576 return check_against_reference(bitmap, src, fSink); |
1562 }); | 1577 }); |
1563 } | 1578 } |
1564 | 1579 |
1565 } // namespace DM | 1580 } // namespace DM |
OLD | NEW |