diff options
author | Mike Klein <mtklein@chromium.org> | 2018-05-10 17:08:33 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-05-10 21:44:56 +0000 |
commit | 27fe397bc0cc1b091f9f85863c62b88156239cf0 (patch) | |
tree | deef5933f642e01717f4eacf2ed50c400157f9b8 /include/core | |
parent | 959fc245a92af65fb8bb4a78db53aec188c812be (diff) |
Revert "strip down SkICC.cpp"
This reverts commit eab50eb9c6117c2a9d0e5648f89cebbb4dbd9d30
and this tiny bit of e61b969a07ba3ebe9e47e61381ad16c5d2c549a2:
https://skia-review.googlesource.com/c/skia/+/127122/3/tests/ICCTest.cpp
Change-Id: I4306e5118a4e5eb88c05078186a28bd443fd76f7
Reviewed-on: https://skia-review.googlesource.com/127305
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'include/core')
-rw-r--r-- | include/core/SkICC.h | 106 |
1 files changed, 89 insertions, 17 deletions
diff --git a/include/core/SkICC.h b/include/core/SkICC.h index 9d2ada347e..8c5ec566b7 100644 --- a/include/core/SkICC.h +++ b/include/core/SkICC.h @@ -12,26 +12,98 @@ #include "SkRefCnt.h" struct SkColorSpaceTransferFn; +class SkColorSpace; +class SkData; +class SkMatrix44; -SK_API sk_sp<SkData> SkWriteICCProfile(const SkColorSpaceTransferFn&, const float toXYZD50[9]); +class SK_API SkICC : public SkRefCnt { +public: -namespace SkICC { - static inline sk_sp<SkData> WriteToICC(const SkColorSpaceTransferFn& fn, - const SkMatrix44& toXYZD50) { - if (toXYZD50.get(3,0) == 0 && toXYZD50.get(3,1) == 0 && toXYZD50.get(3,2) == 0 && - toXYZD50.get(3,3) == 1 && - toXYZD50.get(0,3) == 0 && toXYZD50.get(1,3) == 0 && toXYZD50.get(2,3) == 0) { + /** + * Parse an ICC profile. + * + * Returns nullptr if the data is not a valid ICC profile or if the profile + * input space is not RGB. + */ + static sk_sp<SkICC> Make(const void*, size_t); - float m33[9]; - for (int r = 0; r < 3; r++) - for (int c = 0; c < 3; c++) { - m33[3*r+c] = toXYZD50.get(r,c); - } - return SkWriteICCProfile(fn, m33); + /** + * If the gamut can be represented as transformation into XYZ D50, returns + * true and sets the proper values in |toXYZD50|. + * + * If not, returns false. This indicates that the ICC data is too complex + * to isolate a simple gamut transformation. + */ + bool toXYZD50(SkMatrix44* toXYZD50) const; + /** + * If the transfer function can be represented as coefficients to the standard + * equation, returns true and sets |fn| to the proper values. + * + * If not, returns false. This indicates one of the following: + * (1) The R, G, and B transfer functions are not the same. + * (2) The transfer function is represented as a table that we have not managed + * to match to a standard curve. + * (3) The ICC data is too complex to isolate a single transfer function. + */ + bool isNumericalTransferFn(SkColorSpaceTransferFn* fn) const; + + /** + * Please do not call this unless isNumericalTransferFn() has been called and it + * fails. SkColorSpaceTransferFn is the preferred representation. + * + * If it is not possible to represent the R, G, and B transfer functions numerically + * and it is still necessary to get the transfer function, this will return the + * transfer functions as three tables (R, G, and B). + * + * If possible, this will return tables of the same length as they were specified in + * the ICC profile. This means that the lengths of the three tables are not + * guaranteed to be the same. If the ICC representation was not a table, the length + * will be chosen arbitrarily. + * + * The lengths of the tables are all guaranteed to be at least 2. Entries in the + * tables are guaranteed to be in [0, 1]. + * + * This API may be deleted in favor of a numerical approximation of the raw data. + * + * This function may fail, indicating that the ICC profile does not have transfer + * functions. + */ + struct Channel { + // Byte offset of the start of the table in |fStorage| + size_t fOffset; + int fCount; + }; + struct Tables { + Channel fRed; + Channel fGreen; + Channel fBlue; + + const float* red() { + return (const float*) (fStorage->bytes() + fRed.fOffset); + } + const float* green() { + return (const float*) (fStorage->bytes() + fGreen.fOffset); } - return nullptr; - } -} + const float* blue() { + return (const float*) (fStorage->bytes() + fBlue.fOffset); + } + + sk_sp<SkData> fStorage; + }; + bool rawTransferFnData(Tables* tables) const; + + /** + * Write an ICC profile with transfer function |fn| and gamut |toXYZD50|. + */ + static sk_sp<SkData> WriteToICC(const SkColorSpaceTransferFn& fn, const SkMatrix44& toXYZD50); + +private: + SkICC(sk_sp<SkColorSpace> colorSpace); + + sk_sp<SkColorSpace> fColorSpace; + + friend class ICCTest; +}; -#endif//SkICC_DEFINED +#endif |