Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(738)

Side by Side Diff: dm/DMSrcSink.cpp

Issue 2174493002: Add color space xform support to SkJpegCodec (includes F16!) (Closed) Base URL: https://skia.googlesource.com/skia.git@drop
Patch Set: Fix MSAN suppression Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « dm/DM.cpp ('k') | include/codec/SkCodec.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « dm/DM.cpp ('k') | include/codec/SkCodec.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698