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

Unified Diff: src/core/SkColorSpace.h

Issue 1928123002: Introduce SkGammas type to represent ICC gamma curves (Closed) Base URL: https://skia.googlesource.com/skia.git@delcolorspace
Patch Set: Fix Mac clang again Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/codec/SkPngCodec.cpp ('k') | src/core/SkColorSpace.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkColorSpace.h
diff --git a/src/core/SkColorSpace.h b/src/core/SkColorSpace.h
index 2b3b15fe95576c33f5def8e4a341c5797a9bac30..a1ccf13fe0c61af76922e50c9f2d9ac538b260a2 100644
--- a/src/core/SkColorSpace.h
+++ b/src/core/SkColorSpace.h
@@ -35,57 +35,121 @@ struct SkFloat3x3 {
void dump() const;
};
-struct SkColorLookUpTable {
- static const uint8_t kMaxChannels = 16;
-
- uint8_t fInputChannels;
- uint8_t fOutputChannels;
- uint8_t fGridPoints[kMaxChannels];
- std::unique_ptr<float[]> fTable;
-
- SkColorLookUpTable() {
- memset(this, 0, sizeof(struct SkColorLookUpTable));
- }
-
- SkColorLookUpTable(SkColorLookUpTable&& that)
- : fInputChannels(that.fInputChannels)
- , fOutputChannels(that.fOutputChannels)
- , fTable(std::move(that.fTable))
- {
- memcpy(fGridPoints, that.fGridPoints, kMaxChannels);
- }
-};
-
class SkColorSpace : public SkRefCnt {
+private:
+ struct SkGammaCurve {
+ bool isValue() const {
+ bool result = (0.0f != fValue);
+ SkASSERT(!result || (0 == fTableSize));
+ return result;
+ }
+
+ bool isTable() const {
+ bool result = (0 != fTableSize);
+ SkASSERT(!result || (0.0f == fValue));
+ SkASSERT(!result || fTable);
+ return result;
+ }
+
+ bool isParametric() const { return false; }
+
+ // We have three different ways to represent gamma.
+ // (1) A single value:
+ float fValue;
+
+ // (2) A lookup table:
+ uint32_t fTableSize;
+ std::unique_ptr<float[]> fTable;
+
+ // (3) Parameters for a curve:
+ // FIXME (msarett): Handle parametric curves.
+
+ SkGammaCurve() {
+ memset(this, 0, sizeof(struct SkGammaCurve));
+ }
+
+ SkGammaCurve(float value)
+ : fValue(value)
+ , fTableSize(0)
+ , fTable(nullptr)
+ {}
+ };
+
+ struct SkColorLookUpTable {
+ static const uint8_t kMaxChannels = 16;
+
+ uint8_t fInputChannels;
+ uint8_t fOutputChannels;
+ uint8_t fGridPoints[kMaxChannels];
+ std::unique_ptr<float[]> fTable;
+
+ SkColorLookUpTable() {
+ memset(this, 0, sizeof(struct SkColorLookUpTable));
+ }
+ };
+
public:
enum Named {
kUnknown_Named,
kSRGB_Named,
};
+ struct SkGammas {
+ public:
+ SkGammas(float red, float green, float blue)
+ : fRed(red)
+ , fGreen(green)
+ , fBlue(blue)
+ {}
+
+ SkGammas() {}
+
+ SkDEBUGCODE(float red() const { return fRed.fValue; })
+ SkDEBUGCODE(float green() const { return fGreen.fValue; })
+ SkDEBUGCODE(float blue() const { return fBlue.fValue; })
+
+ private:
+ SkGammaCurve fRed;
+ SkGammaCurve fGreen;
+ SkGammaCurve fBlue;
+
+ friend class SkColorSpace;
+ };
+
/**
* Return a colorspace instance, given a 3x3 transform from linear_RGB to D50_XYZ
* and the src-gamma, return a ColorSpace
*/
- static sk_sp<SkColorSpace> NewRGB(const SkFloat3x3& toXYZD50, const SkFloat3& gamma);
+ static sk_sp<SkColorSpace> NewRGB(const SkFloat3x3& toXYZD50, SkGammas gammas);
static sk_sp<SkColorSpace> NewNamed(Named);
static sk_sp<SkColorSpace> NewICC(const void*, size_t);
- SkFloat3 gamma() const { return fGamma; }
+ const SkGammas& gammas() const { return fGammas; }
SkFloat3x3 xyz() const { return fToXYZD50; }
SkFloat3 xyzOffset() const { return fToXYZOffset; }
Named named() const { return fNamed; }
uint32_t uniqueID() const { return fUniqueID; }
private:
- SkColorSpace(const SkFloat3& gamma, const SkFloat3x3& toXYZ, Named);
- SkColorSpace(SkColorLookUpTable colorLUT, const SkFloat3& gamma, const SkFloat3x3& toXYZ,
- const SkFloat3& toXYZOffset);
+ static bool LoadGammas(SkGammaCurve* gammas, uint32_t num, const uint8_t* src, size_t len);
+
+
+ static bool LoadColorLUT(SkColorLookUpTable* colorLUT, uint32_t inputChannels,
+ uint32_t outputChannels, const uint8_t* src, size_t len);
+
+
+ static bool LoadA2B0(SkColorLookUpTable* colorLUT, SkGammas* gammas, SkFloat3x3* toXYZ,
+ SkFloat3* toXYZOffset, const uint8_t* src, size_t len);
+
+ SkColorSpace(SkGammas gammas, const SkFloat3x3& toXYZ, Named);
+
+ SkColorSpace(SkColorLookUpTable colorLUT, SkGammas gammas,
+ const SkFloat3x3& toXYZ, const SkFloat3& toXYZOffset);
const SkColorLookUpTable fColorLUT;
- const SkFloat3 fGamma;
+ const SkGammas fGammas;
const SkFloat3x3 fToXYZD50;
const SkFloat3 fToXYZOffset;
« no previous file with comments | « src/codec/SkPngCodec.cpp ('k') | src/core/SkColorSpace.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698