aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkColorSpace.h
blob: 7e81b5f335c8ec53cf6352feeef6aaf735125588 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
 * 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 SkColorSpace_DEFINED
#define SkColorSpace_DEFINED

// Some terms
//
//  PCS : Profile Connection Space : where color number values have an absolute meaning.
//        Part of the work float is to convert colors to and from this space...
//        src_linear_unit_floats --> PCS --> PCS' --> dst_linear_unit_floats
//
// Some nice documents
//
// http://www.cambridgeincolour.com/tutorials/color-space-conversion.htm
// https://www.w3.org/Graphics/Color/srgb
// http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html
//

#include "SkRefCnt.h"

struct SkFloat3 {
    float fVec[3];

    void dump() const;
};

struct SkFloat3x3 {
    float fMat[9];

    void dump() const;
};

struct SkPM4f;
void SkApply3x3ToPM4f(const SkFloat3x3&, const SkPM4f src[], SkPM4f dst[], int count);

class SkColorSpace : public SkRefCnt {
public:
    enum Named {
        kUnknown_Named,
        kDevice_Named,
        kSRGB_Named,
    };

    /**
     *  Return a colorspace instance, given a 3x3 transform from linear_RGB to D50_XYZ
     *  and the src-gamma, return a ColorSpace
     */
    static SkColorSpace* NewRGB(const SkFloat3x3& toXYZD50, const SkFloat3& gamma);

    static SkColorSpace* NewNamed(Named);
    static SkColorSpace* NewICC(const void*, size_t);

    SkFloat3 gamma() const { return fGamma; }
    Named named() const { return fNamed; }
    uint32_t uniqueID() const { return fUniqueID; }

    enum Result {
        kFailure_Result,
        kIdentity_Result,
        kNormal_Result,
    };

    /**
     *  Given a src and dst colorspace, return the 3x3 matrix that will convert src_linear_RGB
     *  values into dst_linear_RGB values.
     */
    static Result Concat(const SkColorSpace* src, const SkColorSpace* dst, SkFloat3x3* result);

    static void Test();
    void dump() const;

protected:
    SkColorSpace(const SkFloat3x3& toXYZ, const SkFloat3& gamma, Named);

private:
    const SkFloat3x3 fToXYZD50;
    const SkFloat3   fGamma;
    const uint32_t   fUniqueID;
    const Named      fNamed;
};

#endif