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

Side by Side Diff: dm/DMSrcSink.cpp

Issue 2195523002: Revert of Add color space xform support to SkJpegCodec (includes F16!) (Closed) Base URL: https://skia.googlesource.com/skia.git@drop
Patch Set: 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
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
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
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
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