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 849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); | 860 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
861 if (!encoded) { | 861 if (!encoded) { |
862 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); | 862 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); |
863 } | 863 } |
864 | 864 |
865 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); | 865 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
866 if (nullptr == codec.get()) { | 866 if (nullptr == codec.get()) { |
867 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str()); | 867 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str()); |
868 } | 868 } |
869 | 869 |
870 SkImageInfo info = codec->getInfo().makeColorType(fColorType); | |
871 SkBitmap bitmap; | |
872 if (!bitmap.tryAllocPixels(info)) { | |
873 return SkStringPrintf("Image(%s) is too large (%d x %d)", fPath.c_str(), | |
874 info.width(), info.height()); | |
875 } | |
876 | |
877 SkImageInfo decodeInfo = info; | |
878 size_t srcRowBytes = sizeof(SkPMColor) * info.width(); | |
879 SkAutoMalloc src(srcRowBytes * info.height()); | |
880 void* srcPixels = src.get(); | |
881 if (kBaseline_Mode == fMode) { | |
882 srcPixels = bitmap.getPixels(); | |
883 } else { | |
884 decodeInfo = decodeInfo.makeColorType(kRGBA_8888_SkColorType); | |
885 } | |
886 | |
887 SkCodec::Result r = codec->getPixels(decodeInfo, srcPixels, srcRowBytes); | |
888 if (SkCodec::kSuccess != r) { | |
889 return SkStringPrintf("Couldn't getPixels %s. Error code %d", fPath.c_st
r(), r); | |
890 } | |
891 | |
892 // Load the dst ICC profile. This particular dst is fairly similar to Adobe
RGB. | 870 // Load the dst ICC profile. This particular dst is fairly similar to Adobe
RGB. |
893 sk_sp<SkData> dstData = SkData::MakeFromFileName( | 871 sk_sp<SkData> dstData = SkData::MakeFromFileName( |
894 GetResourcePath("monitor_profiles/HP_ZR30w.icc").c_str()); | 872 GetResourcePath("monitor_profiles/HP_ZR30w.icc").c_str()); |
895 if (!dstData) { | 873 if (!dstData) { |
896 return "Cannot read monitor profile. Is the resource path set correctly
?"; | 874 return "Cannot read monitor profile. Is the resource path set correctly
?"; |
897 } | 875 } |
898 | 876 |
| 877 sk_sp<SkColorSpace> dstSpace = nullptr; |
| 878 if (kDst_sRGB_Mode == fMode) { |
| 879 dstSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); |
| 880 } else if (kDst_HPZR30w_Mode == fMode) { |
| 881 dstSpace = SkColorSpace::NewICC(dstData->data(), dstData->size()); |
| 882 } |
| 883 |
| 884 SkImageInfo decodeInfo = codec->getInfo().makeColorType(fColorType).makeColo
rSpace(dstSpace); |
| 885 SkImageInfo bitmapInfo = decodeInfo; |
| 886 if (kRGBA_8888_SkColorType == decodeInfo.colorType() || |
| 887 kBGRA_8888_SkColorType == decodeInfo.colorType()) |
| 888 { |
| 889 bitmapInfo = bitmapInfo.makeColorType(kN32_SkColorType); |
| 890 } |
| 891 |
| 892 SkBitmap bitmap; |
| 893 if (!bitmap.tryAllocPixels(bitmapInfo)) { |
| 894 return SkStringPrintf("Image(%s) is too large (%d x %d)", fPath.c_str(), |
| 895 bitmapInfo.width(), bitmapInfo.height()); |
| 896 } |
| 897 |
| 898 size_t rowBytes = bitmap.rowBytes(); |
| 899 SkCodec::Result r = codec->getPixels(decodeInfo, bitmap.getPixels(), rowByte
s); |
| 900 if (SkCodec::kSuccess != r) { |
| 901 return SkStringPrintf("Couldn't getPixels %s. Error code %d", fPath.c_st
r(), r); |
| 902 } |
| 903 |
899 switch (fMode) { | 904 switch (fMode) { |
900 case kBaseline_Mode: | 905 case kBaseline_Mode: |
| 906 case kDst_sRGB_Mode: |
| 907 case kDst_HPZR30w_Mode: |
901 canvas->drawBitmap(bitmap, 0, 0); | 908 canvas->drawBitmap(bitmap, 0, 0); |
902 break; | 909 break; |
903 case kDst_sRGB_Mode: | |
904 case kDst_HPZR30w_Mode: { | |
905 sk_sp<SkColorSpace> srcSpace = sk_ref_sp(codec->getInfo().colorSpace
()); | |
906 sk_sp<SkColorSpace> dstSpace = (kDst_sRGB_Mode == fMode) ? | |
907 SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named) : | |
908 SkColorSpace::NewICC(dstData->data(), dstData->size()); | |
909 SkASSERT(dstSpace); | |
910 | |
911 std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(sr
cSpace, dstSpace); | |
912 if (!xform) { | |
913 return "Unimplemented color conversion."; | |
914 } | |
915 | |
916 if (kN32_SkColorType == fColorType) { | |
917 uint32_t* srcRow = (uint32_t*) srcPixels; | |
918 uint32_t* dstRow = (uint32_t*) bitmap.getPixels(); | |
919 for (int y = 0; y < info.height(); y++) { | |
920 xform->applyTo8888(dstRow, srcRow, info.width()); | |
921 srcRow = SkTAddOffset<uint32_t>(srcRow, srcRowBytes); | |
922 dstRow = SkTAddOffset<uint32_t>(dstRow, bitmap.rowBytes()); | |
923 } | |
924 } else { | |
925 SkASSERT(kRGBA_F16_SkColorType == fColorType); | |
926 | |
927 uint32_t* srcRow = (uint32_t*) srcPixels; | |
928 uint64_t* dstRow = (uint64_t*) bitmap.getPixels(); | |
929 for (int y = 0; y < info.height(); y++) { | |
930 xform->applyToF16(dstRow, srcRow, info.width()); | |
931 srcRow = SkTAddOffset<uint32_t>(srcRow, srcRowBytes); | |
932 dstRow = SkTAddOffset<uint64_t>(dstRow, bitmap.rowBytes()); | |
933 } | |
934 } | |
935 | |
936 canvas->drawBitmap(bitmap, 0, 0); | |
937 break; | |
938 } | |
939 #if defined(SK_TEST_QCMS) | 910 #if defined(SK_TEST_QCMS) |
940 case kQCMS_HPZR30w_Mode: { | 911 case kQCMS_HPZR30w_Mode: { |
941 sk_sp<SkData> srcData = codec->getICCData(); | 912 sk_sp<SkData> srcData = codec->getICCData(); |
942 SkAutoTCallVProc<qcms_profile, qcms_profile_release> | 913 SkAutoTCallVProc<qcms_profile, qcms_profile_release> |
943 srcSpace(qcms_profile_from_memory(srcData->data(), srcData->
size())); | 914 srcSpace(qcms_profile_from_memory(srcData->data(), srcData->
size())); |
944 if (!srcSpace) { | 915 if (!srcSpace) { |
945 return Error::Nonfatal(SkStringPrintf("QCMS cannot create profil
e for %s.\n", | 916 return Error::Nonfatal(SkStringPrintf("QCMS cannot create profil
e for %s.\n", |
946 fPath.c_str())); | 917 fPath.c_str())); |
947 } | 918 } |
948 | 919 |
(...skipping 11 matching lines...) Expand all Loading... |
960 return SkStringPrintf("QCMS cannot create transform for %s.\n",
fPath.c_str()); | 931 return SkStringPrintf("QCMS cannot create transform for %s.\n",
fPath.c_str()); |
961 } | 932 } |
962 | 933 |
963 #ifdef SK_PMCOLOR_IS_RGBA | 934 #ifdef SK_PMCOLOR_IS_RGBA |
964 qcms_output_type outType = QCMS_OUTPUT_RGBX; | 935 qcms_output_type outType = QCMS_OUTPUT_RGBX; |
965 #else | 936 #else |
966 qcms_output_type outType = QCMS_OUTPUT_BGRX; | 937 qcms_output_type outType = QCMS_OUTPUT_BGRX; |
967 #endif | 938 #endif |
968 | 939 |
969 // Perform color correction. | 940 // Perform color correction. |
970 uint32_t* srcRow = (uint32_t*) srcPixels; | 941 uint32_t* row = (uint32_t*) bitmap.getPixels(); |
971 uint32_t* dstRow = (uint32_t*) bitmap.getPixels(); | 942 for (int y = 0; y < decodeInfo.height(); y++) { |
972 for (int y = 0; y < info.height(); y++) { | 943 qcms_transform_data_type(transform, row, row, decodeInfo.width()
, outType); |
973 qcms_transform_data_type(transform, srcRow, dstRow, info.width()
, outType); | 944 row = SkTAddOffset<uint32_t>(row, rowBytes); |
974 srcRow = SkTAddOffset<uint32_t>(srcRow, srcRowBytes); | |
975 dstRow = SkTAddOffset<uint32_t>(dstRow, bitmap.rowBytes()); | |
976 } | 945 } |
977 | 946 |
978 canvas->drawBitmap(bitmap, 0, 0); | 947 canvas->drawBitmap(bitmap, 0, 0); |
979 break; | 948 break; |
980 } | 949 } |
981 #endif | 950 #endif |
982 default: | 951 default: |
983 SkASSERT(false); | 952 SkASSERT(false); |
984 return "Invalid fMode"; | 953 return "Invalid fMode"; |
985 } | 954 } |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1587 skr.visit(i, drawsAsSingletonPictures); | 1556 skr.visit(i, drawsAsSingletonPictures); |
1588 } | 1557 } |
1589 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); | 1558 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); |
1590 | 1559 |
1591 canvas->drawPicture(macroPic); | 1560 canvas->drawPicture(macroPic); |
1592 return check_against_reference(bitmap, src, fSink); | 1561 return check_against_reference(bitmap, src, fSink); |
1593 }); | 1562 }); |
1594 } | 1563 } |
1595 | 1564 |
1596 } // namespace DM | 1565 } // namespace DM |
OLD | NEW |