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

Side by Side Diff: dm/DMSrcSink.cpp

Issue 2147763002: Add capability for SkColorXform to output half floats (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Call swizzle fn Created 4 years, 5 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/DMSrcSink.h ('k') | src/core/SkColorSpaceXform.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 816 matching lines...) Expand 10 before | Expand all | Expand 10 after
827 } 827 }
828 return codec->getInfo().dimensions(); 828 return codec->getInfo().dimensions();
829 } 829 }
830 830
831 Name ImageGenSrc::name() const { 831 Name ImageGenSrc::name() const {
832 return SkOSPath::Basename(fPath.c_str()); 832 return SkOSPath::Basename(fPath.c_str());
833 } 833 }
834 834
835 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/ 835 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~*/
836 836
837 ColorCodecSrc::ColorCodecSrc(Path path, Mode mode) 837 ColorCodecSrc::ColorCodecSrc(Path path, Mode mode, SkColorType colorType)
838 : fPath(path) 838 : fPath(path)
839 , fMode(mode) 839 , fMode(mode)
840 , fColorType(colorType)
840 {} 841 {}
841 842
842 bool ColorCodecSrc::veto(SinkFlags flags) const { 843 bool ColorCodecSrc::veto(SinkFlags flags) const {
843 // Test to direct raster backends (8888 and 565). 844 // Test to direct raster backends (8888 and 565).
844 return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDir ect; 845 return flags.type != SinkFlags::kRaster || flags.approach != SinkFlags::kDir ect;
845 } 846 }
846 847
847 Error ColorCodecSrc::draw(SkCanvas* canvas) const { 848 Error ColorCodecSrc::draw(SkCanvas* canvas) const {
848 if (kRGB_565_SkColorType == canvas->imageInfo().colorType()) { 849 if (kRGB_565_SkColorType == canvas->imageInfo().colorType()) {
849 return Error::Nonfatal("No need to test color correction to 565 backend. "); 850 return Error::Nonfatal("No need to test color correction to 565 backend. ");
850 } 851 }
851 852
853 if (nullptr == canvas->imageInfo().colorSpace() && kRGBA_F16_SkColorType == fColorType) {
854 return Error::Nonfatal("F16 does not draw in legacy mode.");
855 }
856
852 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); 857 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str()));
853 if (!encoded) { 858 if (!encoded) {
854 return SkStringPrintf("Couldn't read %s.", fPath.c_str()); 859 return SkStringPrintf("Couldn't read %s.", fPath.c_str());
855 } 860 }
856 861
857 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); 862 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded));
858 if (nullptr == codec.get()) { 863 if (nullptr == codec.get()) {
859 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str()); 864 return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
860 } 865 }
861 866
862 SkImageInfo info = codec->getInfo().makeColorType(kN32_SkColorType); 867 SkImageInfo info = codec->getInfo().makeColorType(fColorType);
863 SkBitmap bitmap; 868 SkBitmap bitmap;
864 if (!bitmap.tryAllocPixels(info)) { 869 if (!bitmap.tryAllocPixels(info)) {
865 return SkStringPrintf("Image(%s) is too large (%d x %d)", fPath.c_str(), 870 return SkStringPrintf("Image(%s) is too large (%d x %d)", fPath.c_str(),
866 info.width(), info.height()); 871 info.width(), info.height());
867 } 872 }
868 873
869 SkImageInfo decodeInfo = info; 874 SkImageInfo decodeInfo = info;
870 if (kBaseline_Mode != fMode) { 875 size_t srcRowBytes = sizeof(SkPMColor) * info.width();
876 SkAutoMalloc src(srcRowBytes * info.height());
877 void* srcPixels = src.get();
878 if (kBaseline_Mode == fMode) {
879 srcPixels = bitmap.getPixels();
880 } else {
871 decodeInfo = decodeInfo.makeColorType(kRGBA_8888_SkColorType); 881 decodeInfo = decodeInfo.makeColorType(kRGBA_8888_SkColorType);
872 } 882 }
873 883
874 SkCodec::Result r = codec->getPixels(decodeInfo, bitmap.getPixels(), bitmap. rowBytes()); 884 SkCodec::Result r = codec->getPixels(decodeInfo, srcPixels, srcRowBytes);
875 if (SkCodec::kSuccess != r) { 885 if (SkCodec::kSuccess != r) {
876 return SkStringPrintf("Couldn't getPixels %s. Error code %d", fPath.c_st r(), r); 886 return SkStringPrintf("Couldn't getPixels %s. Error code %d", fPath.c_st r(), r);
877 } 887 }
878 888
879 // Load the dst ICC profile. This particular dst is fairly similar to Adobe RGB. 889 // Load the dst ICC profile. This particular dst is fairly similar to Adobe RGB.
880 sk_sp<SkData> dstData = SkData::MakeFromFileName( 890 sk_sp<SkData> dstData = SkData::MakeFromFileName(
881 GetResourcePath("monitor_profiles/HP_ZR30w.icc").c_str()); 891 GetResourcePath("monitor_profiles/HP_ZR30w.icc").c_str());
882 if (!dstData) { 892 if (!dstData) {
883 return "Cannot read monitor profile. Is the resource path set correctly ?"; 893 return "Cannot read monitor profile. Is the resource path set correctly ?";
884 } 894 }
885 895
886 switch (fMode) { 896 switch (fMode) {
887 case kBaseline_Mode: 897 case kBaseline_Mode:
888 canvas->drawBitmap(bitmap, 0, 0); 898 canvas->drawBitmap(bitmap, 0, 0);
889 break; 899 break;
890 case kDst_sRGB_Mode: 900 case kDst_sRGB_Mode:
891 case kDst_HPZR30w_Mode: { 901 case kDst_HPZR30w_Mode: {
892 sk_sp<SkColorSpace> srcSpace = sk_ref_sp(codec->getColorSpace()); 902 sk_sp<SkColorSpace> srcSpace = sk_ref_sp(codec->getColorSpace());
893 sk_sp<SkColorSpace> dstSpace = (kDst_sRGB_Mode == fMode) ? 903 sk_sp<SkColorSpace> dstSpace = (kDst_sRGB_Mode == fMode) ?
894 SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named) : 904 SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named) :
895 SkColorSpace::NewICC(dstData->data(), dstData->size()); 905 SkColorSpace::NewICC(dstData->data(), dstData->size());
896 SkASSERT(dstSpace); 906 SkASSERT(dstSpace);
897 907
898 std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(sr cSpace, dstSpace); 908 std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(sr cSpace, dstSpace);
899 if (!xform) { 909 if (!xform) {
900 return "Unimplemented color conversion."; 910 return "Unimplemented color conversion.";
901 } 911 }
902 912
903 uint32_t* row = (uint32_t*) bitmap.getPixels(); 913 if (kN32_SkColorType == fColorType) {
904 for (int y = 0; y < info.height(); y++) { 914 uint32_t* srcRow = (uint32_t*) srcPixels;
905 xform->xform_RGB1_8888(row, row, info.width()); 915 uint32_t* dstRow = (uint32_t*) bitmap.getPixels();
906 row = SkTAddOffset<uint32_t>(row, bitmap.rowBytes()); 916 for (int y = 0; y < info.height(); y++) {
917 xform->applyTo8888(dstRow, srcRow, info.width());
918 srcRow = SkTAddOffset<uint32_t>(srcRow, srcRowBytes);
919 dstRow = SkTAddOffset<uint32_t>(dstRow, bitmap.rowBytes());
920 }
921 } else {
922 SkASSERT(kRGBA_F16_SkColorType == fColorType);
923
924 uint32_t* srcRow = (uint32_t*) srcPixels;
925 uint64_t* dstRow = (uint64_t*) bitmap.getPixels();
926 for (int y = 0; y < info.height(); y++) {
927 xform->applyToF16(dstRow, srcRow, info.width());
928 srcRow = SkTAddOffset<uint32_t>(srcRow, srcRowBytes);
929 dstRow = SkTAddOffset<uint64_t>(dstRow, bitmap.rowBytes());
930 }
907 } 931 }
908 932
909 canvas->drawBitmap(bitmap, 0, 0); 933 canvas->drawBitmap(bitmap, 0, 0);
910 break; 934 break;
911 } 935 }
912 #if defined(SK_TEST_QCMS) 936 #if defined(SK_TEST_QCMS)
913 case kQCMS_HPZR30w_Mode: { 937 case kQCMS_HPZR30w_Mode: {
914 sk_sp<SkData> srcData = codec->getICCData(); 938 sk_sp<SkData> srcData = codec->getICCData();
915 SkAutoTCallVProc<qcms_profile, qcms_profile_release> 939 SkAutoTCallVProc<qcms_profile, qcms_profile_release>
916 srcSpace(qcms_profile_from_memory(srcData->data(), srcData-> size())); 940 srcSpace(qcms_profile_from_memory(srcData->data(), srcData-> size()));
(...skipping 16 matching lines...) Expand all
933 return SkStringPrintf("QCMS cannot create transform for %s.\n", fPath.c_str()); 957 return SkStringPrintf("QCMS cannot create transform for %s.\n", fPath.c_str());
934 } 958 }
935 959
936 #ifdef SK_PMCOLOR_IS_RGBA 960 #ifdef SK_PMCOLOR_IS_RGBA
937 qcms_output_type outType = QCMS_OUTPUT_RGBX; 961 qcms_output_type outType = QCMS_OUTPUT_RGBX;
938 #else 962 #else
939 qcms_output_type outType = QCMS_OUTPUT_BGRX; 963 qcms_output_type outType = QCMS_OUTPUT_BGRX;
940 #endif 964 #endif
941 965
942 // Perform color correction. 966 // Perform color correction.
943 uint32_t* row = (uint32_t*) bitmap.getPixels(); 967 uint32_t* srcRow = (uint32_t*) srcPixels;
968 uint32_t* dstRow = (uint32_t*) bitmap.getPixels();
944 for (int y = 0; y < info.height(); y++) { 969 for (int y = 0; y < info.height(); y++) {
945 qcms_transform_data_type(transform, row, row, info.width(), outT ype); 970 qcms_transform_data_type(transform, srcRow, dstRow, info.width() , outType);
946 row = SkTAddOffset<uint32_t>(row, bitmap.rowBytes()); 971 srcRow = SkTAddOffset<uint32_t>(srcRow, srcRowBytes);
972 dstRow = SkTAddOffset<uint32_t>(dstRow, bitmap.rowBytes());
947 } 973 }
948 974
949 canvas->drawBitmap(bitmap, 0, 0); 975 canvas->drawBitmap(bitmap, 0, 0);
950 break; 976 break;
951 } 977 }
952 #endif 978 #endif
953 default: 979 default:
954 SkASSERT(false); 980 SkASSERT(false);
955 return "Invalid fMode"; 981 return "Invalid fMode";
956 } 982 }
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after
1554 skr.visit(i, drawsAsSingletonPictures); 1580 skr.visit(i, drawsAsSingletonPictures);
1555 } 1581 }
1556 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture()); 1582 sk_sp<SkPicture> macroPic(macroRec.finishRecordingAsPicture());
1557 1583
1558 canvas->drawPicture(macroPic); 1584 canvas->drawPicture(macroPic);
1559 return check_against_reference(bitmap, src, fSink); 1585 return check_against_reference(bitmap, src, fSink);
1560 }); 1586 });
1561 } 1587 }
1562 1588
1563 } // namespace DM 1589 } // namespace DM
OLDNEW
« no previous file with comments | « dm/DMSrcSink.h ('k') | src/core/SkColorSpaceXform.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698