OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/color_space.h" | 5 #include "ui/gfx/color_space.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 | 8 |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/synchronization/lock.h" | 10 #include "base/synchronization/lock.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 ColorSpace::MatrixID ColorSpace::MatrixIDFromInt(int matrix_id) { | 34 ColorSpace::MatrixID ColorSpace::MatrixIDFromInt(int matrix_id) { |
35 if (matrix_id < 0 || matrix_id > static_cast<int>(MatrixID::LAST)) | 35 if (matrix_id < 0 || matrix_id > static_cast<int>(MatrixID::LAST)) |
36 return MatrixID::UNKNOWN; | 36 return MatrixID::UNKNOWN; |
37 if (matrix_id > static_cast<int>(MatrixID::LAST_STANDARD_VALUE) && | 37 if (matrix_id > static_cast<int>(MatrixID::LAST_STANDARD_VALUE) && |
38 matrix_id < 1000) | 38 matrix_id < 1000) |
39 return MatrixID::UNKNOWN; | 39 return MatrixID::UNKNOWN; |
40 return static_cast<MatrixID>(matrix_id); | 40 return static_cast<MatrixID>(matrix_id); |
41 } | 41 } |
42 | 42 |
43 ColorSpace::ColorSpace() { | 43 ColorSpace::ColorSpace() { |
| 44 memset(custom_transfer_params_, 0, sizeof(custom_transfer_params_)); |
44 memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_)); | 45 memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_)); |
45 } | 46 } |
46 | 47 |
47 ColorSpace::ColorSpace(PrimaryID primaries, | 48 ColorSpace::ColorSpace(PrimaryID primaries, |
48 TransferID transfer, | 49 TransferID transfer, |
49 MatrixID matrix, | 50 MatrixID matrix, |
50 RangeID range) | 51 RangeID range) |
51 : primaries_(primaries), | 52 : primaries_(primaries), |
52 transfer_(transfer), | 53 transfer_(transfer), |
53 matrix_(matrix), | 54 matrix_(matrix), |
54 range_(range) { | 55 range_(range) { |
| 56 memset(custom_transfer_params_, 0, sizeof(custom_transfer_params_)); |
55 memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_)); | 57 memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_)); |
56 // TODO: Set profile_id_ | |
57 } | 58 } |
58 | 59 |
59 ColorSpace::ColorSpace(int primaries, int transfer, int matrix, RangeID range) | 60 ColorSpace::ColorSpace(int primaries, int transfer, int matrix, RangeID range) |
60 : primaries_(PrimaryIDFromInt(primaries)), | 61 : primaries_(PrimaryIDFromInt(primaries)), |
61 transfer_(TransferIDFromInt(transfer)), | 62 transfer_(TransferIDFromInt(transfer)), |
62 matrix_(MatrixIDFromInt(matrix)), | 63 matrix_(MatrixIDFromInt(matrix)), |
63 range_(range) { | 64 range_(range) { |
| 65 memset(custom_transfer_params_, 0, sizeof(custom_transfer_params_)); |
64 memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_)); | 66 memset(custom_primary_matrix_, 0, sizeof(custom_primary_matrix_)); |
65 // TODO: Set profile_id_ | |
66 } | 67 } |
67 | 68 |
68 ColorSpace::ColorSpace(const ColorSpace& other) | 69 ColorSpace::ColorSpace(const ColorSpace& other) |
69 : primaries_(other.primaries_), | 70 : primaries_(other.primaries_), |
70 transfer_(other.transfer_), | 71 transfer_(other.transfer_), |
71 matrix_(other.matrix_), | 72 matrix_(other.matrix_), |
72 range_(other.range_), | 73 range_(other.range_), |
73 icc_profile_id_(other.icc_profile_id_), | 74 icc_profile_id_(other.icc_profile_id_), |
74 sk_color_space_(other.sk_color_space_) { | 75 sk_color_space_(other.sk_color_space_) { |
| 76 memcpy(custom_transfer_params_, other.custom_transfer_params_, |
| 77 sizeof(custom_transfer_params_)); |
75 memcpy(custom_primary_matrix_, other.custom_primary_matrix_, | 78 memcpy(custom_primary_matrix_, other.custom_primary_matrix_, |
76 sizeof(custom_primary_matrix_)); | 79 sizeof(custom_primary_matrix_)); |
77 } | 80 } |
78 | 81 |
79 ColorSpace::~ColorSpace() = default; | 82 ColorSpace::~ColorSpace() = default; |
80 | 83 |
81 // static | 84 // static |
82 ColorSpace ColorSpace::CreateSRGB() { | 85 ColorSpace ColorSpace::CreateSRGB() { |
83 ColorSpace result(PrimaryID::BT709, TransferID::IEC61966_2_1, MatrixID::RGB, | 86 ColorSpace result(PrimaryID::BT709, TransferID::IEC61966_2_1, MatrixID::RGB, |
84 RangeID::FULL); | 87 RangeID::FULL); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 } | 120 } |
118 | 121 |
119 bool ColorSpace::operator==(const ColorSpace& other) const { | 122 bool ColorSpace::operator==(const ColorSpace& other) const { |
120 if (primaries_ != other.primaries_ || transfer_ != other.transfer_ || | 123 if (primaries_ != other.primaries_ || transfer_ != other.transfer_ || |
121 matrix_ != other.matrix_ || range_ != other.range_) | 124 matrix_ != other.matrix_ || range_ != other.range_) |
122 return false; | 125 return false; |
123 if (primaries_ == PrimaryID::CUSTOM && | 126 if (primaries_ == PrimaryID::CUSTOM && |
124 memcmp(custom_primary_matrix_, other.custom_primary_matrix_, | 127 memcmp(custom_primary_matrix_, other.custom_primary_matrix_, |
125 sizeof(custom_primary_matrix_))) | 128 sizeof(custom_primary_matrix_))) |
126 return false; | 129 return false; |
| 130 if (transfer_ == TransferID::CUSTOM && |
| 131 memcmp(custom_transfer_params_, other.custom_transfer_params_, |
| 132 sizeof(custom_transfer_params_))) |
| 133 return false; |
127 return true; | 134 return true; |
128 } | 135 } |
129 | 136 |
130 bool ColorSpace::IsHDR() const { | 137 bool ColorSpace::IsHDR() const { |
131 return transfer_ == TransferID::SMPTEST2084 || | 138 return transfer_ == TransferID::SMPTEST2084 || |
132 transfer_ == TransferID::ARIB_STD_B67; | 139 transfer_ == TransferID::ARIB_STD_B67; |
133 } | 140 } |
134 | 141 |
135 bool ColorSpace::operator!=(const ColorSpace& other) const { | 142 bool ColorSpace::operator!=(const ColorSpace& other) const { |
136 return !(*this == other); | 143 return !(*this == other); |
(...skipping 18 matching lines...) Expand all Loading... |
155 return false; | 162 return false; |
156 if (primaries_ == PrimaryID::CUSTOM) { | 163 if (primaries_ == PrimaryID::CUSTOM) { |
157 int primary_result = | 164 int primary_result = |
158 memcmp(custom_primary_matrix_, other.custom_primary_matrix_, | 165 memcmp(custom_primary_matrix_, other.custom_primary_matrix_, |
159 sizeof(custom_primary_matrix_)); | 166 sizeof(custom_primary_matrix_)); |
160 if (primary_result < 0) | 167 if (primary_result < 0) |
161 return true; | 168 return true; |
162 if (primary_result > 0) | 169 if (primary_result > 0) |
163 return false; | 170 return false; |
164 } | 171 } |
| 172 if (transfer_ == TransferID::CUSTOM) { |
| 173 int transfer_result = |
| 174 memcmp(custom_transfer_params_, other.custom_transfer_params_, |
| 175 sizeof(custom_transfer_params_)); |
| 176 if (transfer_result < 0) |
| 177 return true; |
| 178 if (transfer_result > 0) |
| 179 return false; |
| 180 } |
165 return false; | 181 return false; |
166 } | 182 } |
167 | 183 |
168 ColorSpace ColorSpace::FromSkColorSpace( | 184 ColorSpace ColorSpace::FromSkColorSpace( |
169 const sk_sp<SkColorSpace>& sk_color_space) { | 185 const sk_sp<SkColorSpace>& sk_color_space) { |
170 if (!sk_color_space) | 186 if (!sk_color_space) |
171 return gfx::ColorSpace(); | 187 return gfx::ColorSpace(); |
172 if (SkColorSpace::Equals( | 188 if (SkColorSpace::Equals( |
173 sk_color_space.get(), | 189 sk_color_space.get(), |
174 SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named).get())) | 190 SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named).get())) |
175 return gfx::ColorSpace::CreateSRGB(); | 191 return gfx::ColorSpace::CreateSRGB(); |
176 | 192 |
177 // TODO(crbug.com/634102): Add conversion to gfx::ColorSpace for | 193 // TODO(crbug.com/634102): Add conversion to gfx::ColorSpace for |
178 // non-ICC-profile based color spaces. | 194 // non-ICC-profile based color spaces. |
179 ICCProfile icc_profile = ICCProfile::FromSkColorSpace(sk_color_space); | 195 ICCProfile icc_profile = ICCProfile::FromSkColorSpace(sk_color_space); |
180 return icc_profile.GetColorSpace(); | 196 return icc_profile.GetColorSpace(); |
181 } | 197 } |
182 | 198 |
| 199 bool ColorSpace::GetPrimaryMatrix(SkMatrix44* to_XYZD50) const { |
| 200 if (primaries_ == PrimaryID::CUSTOM) { |
| 201 to_XYZD50->set3x3RowMajorf(custom_primary_matrix_); |
| 202 return true; |
| 203 } |
| 204 // TODO(ccameron): Merge with primary look-up in ColorTransform. |
| 205 return false; |
| 206 } |
| 207 |
| 208 bool ColorSpace::GetTransferFunction(SkColorSpaceTransferFn* fn) const { |
| 209 if (transfer_ == TransferID::CUSTOM) { |
| 210 fn->fA = custom_transfer_params_[0]; |
| 211 fn->fB = custom_transfer_params_[1]; |
| 212 fn->fC = custom_transfer_params_[2]; |
| 213 fn->fD = custom_transfer_params_[3]; |
| 214 fn->fE = custom_transfer_params_[4]; |
| 215 fn->fF = custom_transfer_params_[5]; |
| 216 fn->fG = custom_transfer_params_[6]; |
| 217 return true; |
| 218 } |
| 219 // TODO(ccameron): Add transfer look-up for non-CUSTOM transfer functions. |
| 220 return false; |
| 221 } |
| 222 |
183 } // namespace gfx | 223 } // namespace gfx |
OLD | NEW |