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

Side by Side Diff: src/core/SkColorSpace.cpp

Issue 2097553002: Add support for 3D colorLUTs to SkColorXform (Closed) Base URL: https://skia.googlesource.com/skia.git@lovedefaultxform
Patch Set: Rebase Created 4 years, 6 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.cpp ('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 2016 Google Inc. 2 * Copyright 2016 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 "SkColorSpace.h" 8 #include "SkColorSpace.h"
9 #include "SkColorSpace_Base.h" 9 #include "SkColorSpace_Base.h"
10 #include "SkEndian.h" 10 #include "SkEndian.h"
(...skipping 14 matching lines...) Expand all
25 , fToXYZD50(toXYZD50) 25 , fToXYZD50(toXYZD50)
26 , fNamed(named) 26 , fNamed(named)
27 {} 27 {}
28 28
29 SkColorSpace_Base::SkColorSpace_Base(GammaNamed gammaNamed, const SkMatrix44& to XYZD50, Named named) 29 SkColorSpace_Base::SkColorSpace_Base(GammaNamed gammaNamed, const SkMatrix44& to XYZD50, Named named)
30 : INHERITED(gammaNamed, toXYZD50, named) 30 : INHERITED(gammaNamed, toXYZD50, named)
31 , fGammas(nullptr) 31 , fGammas(nullptr)
32 , fProfileData(nullptr) 32 , fProfileData(nullptr)
33 {} 33 {}
34 34
35 SkColorSpace_Base::SkColorSpace_Base(SkColorLookUpTable* colorLUT, sk_sp<SkGamma s> gammas, 35 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, sk_sp<S kGammas> gammas,
36 const SkMatrix44& toXYZD50, sk_sp<SkData> p rofileData) 36 const SkMatrix44& toXYZD50, sk_sp<SkData> p rofileData)
37 : INHERITED(kNonStandard_GammaNamed, toXYZD50, kUnknown_Named) 37 : INHERITED(kNonStandard_GammaNamed, toXYZD50, kUnknown_Named)
38 , fColorLUT(colorLUT) 38 , fColorLUT(std::move(colorLUT))
39 , fGammas(std::move(gammas)) 39 , fGammas(std::move(gammas))
40 , fProfileData(std::move(profileData)) 40 , fProfileData(std::move(profileData))
41 {} 41 {}
42 42
43 static constexpr float gSRGB_toXYZD50[] { 43 static constexpr float gSRGB_toXYZD50[] {
44 0.4358f, 0.2224f, 0.0139f, // * R 44 0.4358f, 0.2224f, 0.0139f, // * R
45 0.3853f, 0.7170f, 0.0971f, // * G 45 0.3853f, 0.7170f, 0.0971f, // * G
46 0.1430f, 0.0606f, 0.7139f, // * B 46 0.1430f, 0.0606f, 0.7139f, // * B
47 }; 47 };
48 48
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 const uint8_t* src, size_t len) { 670 const uint8_t* src, size_t len) {
671 // 16 bytes reserved for grid points, 2 for precision, 2 for padding. 671 // 16 bytes reserved for grid points, 2 for precision, 2 for padding.
672 // The color LUT data follows after this header. 672 // The color LUT data follows after this header.
673 static constexpr uint32_t kColorLUTHeaderSize = 20; 673 static constexpr uint32_t kColorLUTHeaderSize = 20;
674 if (len < kColorLUTHeaderSize) { 674 if (len < kColorLUTHeaderSize) {
675 SkColorSpacePrintf("Color LUT tag is too small (%d bytes).", len); 675 SkColorSpacePrintf("Color LUT tag is too small (%d bytes).", len);
676 return false; 676 return false;
677 } 677 }
678 size_t dataLen = len - kColorLUTHeaderSize; 678 size_t dataLen = len - kColorLUTHeaderSize;
679 679
680 SkASSERT(inputChannels <= SkColorLookUpTable::kMaxChannels && 3 == outputCha nnels); 680 SkASSERT(3 == inputChannels && 3 == outputChannels);
681 colorLUT->fInputChannels = inputChannels; 681 colorLUT->fInputChannels = inputChannels;
682 colorLUT->fOutputChannels = outputChannels; 682 colorLUT->fOutputChannels = outputChannels;
683 uint32_t numEntries = 1; 683 uint32_t numEntries = 1;
684 for (uint32_t i = 0; i < inputChannels; i++) { 684 for (uint32_t i = 0; i < inputChannels; i++) {
685 colorLUT->fGridPoints[i] = src[i]; 685 colorLUT->fGridPoints[i] = src[i];
686 if (0 == src[i]) { 686 if (0 == src[i]) {
687 SkColorSpacePrintf("Each input channel must have at least one grid p oint."); 687 SkColorSpacePrintf("Each input channel must have at least one grid p oint.");
688 return false; 688 return false;
689 } 689 }
690 690
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 if (kTAG_AtoBType != type) { 776 if (kTAG_AtoBType != type) {
777 // FIXME (msarett): Need to support lut8Type and lut16Type. 777 // FIXME (msarett): Need to support lut8Type and lut16Type.
778 SkColorSpacePrintf("Unsupported A to B tag type.\n"); 778 SkColorSpacePrintf("Unsupported A to B tag type.\n");
779 return false; 779 return false;
780 } 780 }
781 781
782 // Read the number of channels. The four bytes that we skipped are reserved and 782 // Read the number of channels. The four bytes that we skipped are reserved and
783 // must be zero. 783 // must be zero.
784 uint8_t inputChannels = src[8]; 784 uint8_t inputChannels = src[8];
785 uint8_t outputChannels = src[9]; 785 uint8_t outputChannels = src[9];
786 if (0 == inputChannels || inputChannels > SkColorLookUpTable::kMaxChannels | | 786 if (3 != inputChannels || 3 != outputChannels) {
787 3 != outputChannels) { 787 // We only handle (supposedly) RGB inputs and RGB outputs. The numbers of input
788 // The color LUT assumes that there are at most 16 input channels. For RGB 788 // channels and output channels both must be 3.
789 // profiles, output channels should be 3. 789 SkColorSpacePrintf("Input and output channels must equal 3 in A to B tag .\n");
790 SkColorSpacePrintf("Too many input or output channels in A to B tag.\n") ;
791 return false; 790 return false;
792 } 791 }
793 792
794 // Read the offsets of each element in the A to B tag. With the exception o f A curves and 793 // Read the offsets of each element in the A to B tag. With the exception o f A curves and
795 // B curves (which we do not yet support), we will handle these elements in the order in 794 // B curves (which we do not yet support), we will handle these elements in the order in
796 // which they should be applied (rather than the order in which they occur i n the tag). 795 // which they should be applied (rather than the order in which they occur i n the tag).
797 // If the offset is non-zero it indicates that the element is present. 796 // If the offset is non-zero it indicates that the element is present.
798 uint32_t offsetToACurves = read_big_endian_int(src + 28); 797 uint32_t offsetToACurves = read_big_endian_int(src + 28);
799 uint32_t offsetToBCurves = read_big_endian_int(src + 12); 798 uint32_t offsetToBCurves = read_big_endian_int(src + 12);
800 if ((0 != offsetToACurves) || (0 != offsetToBCurves)) { 799 if ((0 != offsetToACurves) || (0 != offsetToBCurves)) {
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, st d::move(gammas), 928 return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, st d::move(gammas),
930 mat, std::m ove(data))); 929 mat, std::m ove(data)));
931 } else { 930 } else {
932 return SkColorSpace_Base::NewRGB(gammaNamed, mat); 931 return SkColorSpace_Base::NewRGB(gammaNamed, mat);
933 } 932 }
934 } 933 }
935 934
936 // Recognize color profile specified by A2B0 tag. 935 // Recognize color profile specified by A2B0 tag.
937 const ICCTag* a2b0 = ICCTag::Find(tags.get(), tagCount, kTAG_A2B0); 936 const ICCTag* a2b0 = ICCTag::Find(tags.get(), tagCount, kTAG_A2B0);
938 if (a2b0) { 937 if (a2b0) {
939 SkAutoTDelete<SkColorLookUpTable> colorLUT(new SkColorLookUpTabl e()); 938 sk_sp<SkColorLookUpTable> colorLUT = sk_make_sp<SkColorLookUpTab le>();
940 SkGammaCurve curves[3]; 939 SkGammaCurve curves[3];
941 SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); 940 SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor);
942 if (!load_a2b0(colorLUT, curves, &toXYZ, a2b0->addr((const uint8 _t*) base), 941 if (!load_a2b0(colorLUT.get(), curves, &toXYZ, a2b0->addr((const uint8_t*) base),
943 a2b0->fLength)) { 942 a2b0->fLength)) {
944 return_null("Failed to parse A2B0 tag"); 943 return_null("Failed to parse A2B0 tag");
945 } 944 }
946 945
947 GammaNamed gammaNamed = SkGammas::Named(curves); 946 GammaNamed gammaNamed = SkGammas::Named(curves);
948 if (colorLUT->fTable || kNonStandard_GammaNamed == gammaNamed) { 947 colorLUT = colorLUT->fTable ? colorLUT : nullptr;
948 if (colorLUT || kNonStandard_GammaNamed == gammaNamed) {
949 sk_sp<SkGammas> gammas = sk_make_sp<SkGammas>(std::move(curv es[0]), 949 sk_sp<SkGammas> gammas = sk_make_sp<SkGammas>(std::move(curv es[0]),
950 std::move(curv es[1]), 950 std::move(curv es[1]),
951 std::move(curv es[2])); 951 std::move(curv es[2]));
952 952
953 return sk_sp<SkColorSpace>(new SkColorSpace_Base(colorLUT.re lease(), 953 return sk_sp<SkColorSpace>(new SkColorSpace_Base(std::move(c olorLUT),
954 std::move(g ammas), toXYZ, 954 std::move(g ammas), toXYZ,
955 std::move(d ata))); 955 std::move(d ata)));
956 } else { 956 } else {
957 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZ); 957 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZ);
958 } 958 }
959 } 959 }
960 } 960 }
961 default: 961 default:
962 break; 962 break;
963 } 963 }
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 1350
1351 uint32_t profileSize = *((uint32_t*) data); 1351 uint32_t profileSize = *((uint32_t*) data);
1352 data = SkTAddOffset<const void>(data, sizeof(uint32_t)); 1352 data = SkTAddOffset<const void>(data, sizeof(uint32_t));
1353 length -= sizeof(uint32_t); 1353 length -= sizeof(uint32_t);
1354 if (length < profileSize) { 1354 if (length < profileSize) {
1355 return nullptr; 1355 return nullptr;
1356 } 1356 }
1357 1357
1358 return NewICC(data, profileSize); 1358 return NewICC(data, profileSize);
1359 } 1359 }
OLDNEW
« no previous file with comments | « dm/DMSrcSink.cpp ('k') | src/core/SkColorSpaceXform.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698