diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/core/SkICC.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/include/core/SkICC.h b/include/core/SkICC.h new file mode 100644 index 0000000000..3780498df9 --- /dev/null +++ b/include/core/SkICC.h @@ -0,0 +1,73 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkICC_DEFINED +#define SkICC_DEFINED + +#include "SkRefCnt.h" + +struct SkColorSpaceTransferFn; +class SkColorSpace; +class SkData; +class SkMatrix44; + +class SK_API SkICC : public SkRefCnt { +public: + + /** + * 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); + + /** + * 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; + + /** + * If the transfer function can be approximated 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 is not increasing with + * end points at zero and one. + * (3) The ICC data is too complex to isolate a single transfer function. + */ + bool approximateNumericalTransferFn(SkColorSpaceTransferFn* fn) 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; +}; + +#endif |