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 |
870 // Load the dst ICC profile. This particular dst is fairly similar to Adobe
RGB. | 892 // Load the dst ICC profile. This particular dst is fairly similar to Adobe
RGB. |
871 sk_sp<SkData> dstData = SkData::MakeFromFileName( | 893 sk_sp<SkData> dstData = SkData::MakeFromFileName( |
872 GetResourcePath("monitor_profiles/HP_ZR30w.icc").c_str()); | 894 GetResourcePath("monitor_profiles/HP_ZR30w.icc").c_str()); |
873 if (!dstData) { | 895 if (!dstData) { |
874 return "Cannot read monitor profile. Is the resource path set correctly
?"; | 896 return "Cannot read monitor profile. Is the resource path set correctly
?"; |
875 } | 897 } |
876 | 898 |
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 | |
904 switch (fMode) { | 899 switch (fMode) { |
905 case kBaseline_Mode: | 900 case kBaseline_Mode: |
906 case kDst_sRGB_Mode: | |
907 case kDst_HPZR30w_Mode: | |
908 canvas->drawBitmap(bitmap, 0, 0); | 901 canvas->drawBitmap(bitmap, 0, 0); |
909 break; | 902 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 } |
910 #if defined(SK_TEST_QCMS) | 939 #if defined(SK_TEST_QCMS) |
911 case kQCMS_HPZR30w_Mode: { | 940 case kQCMS_HPZR30w_Mode: { |
912 sk_sp<SkData> srcData = codec->getICCData(); | 941 sk_sp<SkData> srcData = codec->getICCData(); |
913 SkAutoTCallVProc<qcms_profile, qcms_profile_release> | 942 SkAutoTCallVProc<qcms_profile, qcms_profile_release> |
914 srcSpace(qcms_profile_from_memory(srcData->data(), srcData->
size())); | 943 srcSpace(qcms_profile_from_memory(srcData->data(), srcData->
size())); |
915 if (!srcSpace) { | 944 if (!srcSpace) { |
916 return Error::Nonfatal(SkStringPrintf("QCMS cannot create profil
e for %s.\n", | 945 return Error::Nonfatal(SkStringPrintf("QCMS cannot create profil
e for %s.\n", |
917 fPath.c_str())); | 946 fPath.c_str())); |
918 } | 947 } |
919 | 948 |
(...skipping 11 matching lines...) Expand all Loading... |
931 return SkStringPrintf("QCMS cannot create transform for %s.\n",
fPath.c_str()); | 960 return SkStringPrintf("QCMS cannot create transform for %s.\n",
fPath.c_str()); |
932 } | 961 } |
933 | 962 |
934 #ifdef SK_PMCOLOR_IS_RGBA | 963 #ifdef SK_PMCOLOR_IS_RGBA |
935 qcms_output_type outType = QCMS_OUTPUT_RGBX; | 964 qcms_output_type outType = QCMS_OUTPUT_RGBX; |
936 #else | 965 #else |
937 qcms_output_type outType = QCMS_OUTPUT_BGRX; | 966 qcms_output_type outType = QCMS_OUTPUT_BGRX; |
938 #endif | 967 #endif |
939 | 968 |
940 // Perform color correction. | 969 // Perform color correction. |
941 uint32_t* row = (uint32_t*) bitmap.getPixels(); | 970 uint32_t* srcRow = (uint32_t*) srcPixels; |
942 for (int y = 0; y < decodeInfo.height(); y++) { | 971 uint32_t* dstRow = (uint32_t*) bitmap.getPixels(); |
943 qcms_transform_data_type(transform, row, row, decodeInfo.width()
, outType); | 972 for (int y = 0; y < info.height(); y++) { |
944 row = SkTAddOffset<uint32_t>(row, rowBytes); | 973 qcms_transform_data_type(transform, srcRow, dstRow, info.width()
, outType); |
| 974 srcRow = SkTAddOffset<uint32_t>(srcRow, srcRowBytes); |
| 975 dstRow = SkTAddOffset<uint32_t>(dstRow, bitmap.rowBytes()); |
945 } | 976 } |
946 | 977 |
947 canvas->drawBitmap(bitmap, 0, 0); | 978 canvas->drawBitmap(bitmap, 0, 0); |
948 break; | 979 break; |
949 } | 980 } |
950 #endif | 981 #endif |
951 default: | 982 default: |
952 SkASSERT(false); | 983 SkASSERT(false); |
953 return "Invalid fMode"; | 984 return "Invalid fMode"; |
954 } | 985 } |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1556 skr.visit(i, drawsAsSingletonPictures); | 1587 skr.visit(i, drawsAsSingletonPictures); |
1557 } | 1588 } |
1558 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); | 1589 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); |
1559 | 1590 |
1560 canvas->drawPicture(macroPic); | 1591 canvas->drawPicture(macroPic); |
1561 return check_against_reference(bitmap, src, fSink); | 1592 return check_against_reference(bitmap, src, fSink); |
1562 }); | 1593 }); |
1563 } | 1594 } |
1564 | 1595 |
1565 } // namespace DM | 1596 } // namespace DM |
OLD | NEW |