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

Side by Side Diff: src/core/SkColorSpace.cpp

Issue 2194903002: Fix various SkColorSpace bugs (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Use switch statement in nonstandard struct Created 4 years, 4 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 unified diff | Download patch
« no previous file with comments | « resources/monitor_profiles/HP_ZR30w.icc ('k') | src/core/SkColorSpaceXform.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkColorSpace.h" 8 #include "SkColorSpace.h"
9 #include "SkColorSpace_Base.h" 9 #include "SkColorSpace_Base.h"
10 #include "SkColorSpacePriv.h" 10 #include "SkColorSpacePriv.h"
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 return header; 194 return header;
195 } 195 }
196 196
197 uint8_t fVersion; // Always zero 197 uint8_t fVersion; // Always zero
198 uint8_t fNamed; // Must be a SkColorSpace::Named 198 uint8_t fNamed; // Must be a SkColorSpace::Named
199 uint8_t fGammaNamed; // Must be a SkColorSpace::GammaNamed 199 uint8_t fGammaNamed; // Must be a SkColorSpace::GammaNamed
200 uint8_t fFlags; // Some combination of the flags listed above 200 uint8_t fFlags; // Some combination of the flags listed above
201 }; 201 };
202 202
203 size_t SkColorSpace::writeToMemory(void* memory) const { 203 size_t SkColorSpace::writeToMemory(void* memory) const {
204 // If we have a named profile, only write the enum. 204 // Start by trying the serialization fast path. If we haven't saved ICC pro file data,
205 switch (fNamed) { 205 // we must have a profile that we can serialize easily.
206 case kSRGB_Named: 206 if (!as_CSB(this)->fProfileData) {
207 case kAdobeRGB_Named: { 207 // If we have a named profile, only write the enum.
208 if (memory) { 208 switch (fNamed) {
209 *((ColorSpaceHeader*) memory) = 209 case kSRGB_Named:
210 ColorSpaceHeader::Pack(k0_Version, fNamed, fGammaNamed, 0); 210 case kAdobeRGB_Named: {
211 if (memory) {
212 *((ColorSpaceHeader*) memory) =
213 ColorSpaceHeader::Pack(k0_Version, fNamed, fGammaNam ed, 0);
214 }
215 return sizeof(ColorSpaceHeader);
211 } 216 }
212 return sizeof(ColorSpaceHeader); 217 default:
218 break;
213 } 219 }
214 default: 220
215 break; 221 // If we have a named gamma, write the enum and the matrix.
222 switch (fGammaNamed) {
223 case kSRGB_GammaNamed:
224 case k2Dot2Curve_GammaNamed:
225 case kLinear_GammaNamed: {
226 if (memory) {
227 *((ColorSpaceHeader*) memory) =
228 ColorSpaceHeader::Pack(k0_Version, fNamed, fGammaNam ed,
229 ColorSpaceHeader::kMatrix_Fla g);
230 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) );
231 fToXYZD50.as4x3ColMajorf((float*) memory);
232 }
233 return sizeof(ColorSpaceHeader) + 12 * sizeof(float);
234 }
235 default:
236 SkASSERT(false);
237 return 0;
238 }
216 } 239 }
217 240
218 // If we have a named gamma, write the enum and the matrix. 241 // Otherwise, serialize the ICC data.
219 switch (fGammaNamed) {
220 case kSRGB_GammaNamed:
221 case k2Dot2Curve_GammaNamed:
222 case kLinear_GammaNamed: {
223 if (memory) {
224 *((ColorSpaceHeader*) memory) =
225 ColorSpaceHeader::Pack(k0_Version, fNamed, fGammaNamed,
226 ColorSpaceHeader::kMatrix_Flag);
227 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader));
228 fToXYZD50.as4x3ColMajorf((float*) memory);
229 }
230 return sizeof(ColorSpaceHeader) + 12 * sizeof(float);
231 }
232 default:
233 break;
234 }
235
236 // If we do not have a named gamma, this must have been created from an ICC profile.
237 // Since we were unable to recognize the gamma, we will have saved the ICC d ata.
238 SkASSERT(as_CSB(this)->fProfileData);
239
240 size_t profileSize = as_CSB(this)->fProfileData->size(); 242 size_t profileSize = as_CSB(this)->fProfileData->size();
241 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { 243 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) {
242 return 0; 244 return 0;
243 } 245 }
244 246
245 if (memory) { 247 if (memory) {
246 *((ColorSpaceHeader*) memory) = ColorSpaceHeader::Pack(k0_Version, fName d, fGammaNamed, 248 *((ColorSpaceHeader*) memory) = ColorSpaceHeader::Pack(k0_Version, kUnkn own_Named,
249 kNonStandard_Gamm aNamed,
247 ColorSpaceHeader: :kICC_Flag); 250 ColorSpaceHeader: :kICC_Flag);
248 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader)); 251 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader));
249 252
250 *((uint32_t*) memory) = (uint32_t) SkAlign4(profileSize); 253 *((uint32_t*) memory) = (uint32_t) SkAlign4(profileSize);
251 memory = SkTAddOffset<void>(memory, sizeof(uint32_t)); 254 memory = SkTAddOffset<void>(memory, sizeof(uint32_t));
252 255
253 memcpy(memory, as_CSB(this)->fProfileData->data(), profileSize); 256 memcpy(memory, as_CSB(this)->fProfileData->data(), profileSize);
254 memset(SkTAddOffset<void>(memory, profileSize), 0, SkAlign4(profileSize) - profileSize); 257 memset(SkTAddOffset<void>(memory, profileSize), 0, SkAlign4(profileSize) - profileSize);
255 } 258 }
256 return sizeof(ColorSpaceHeader) + sizeof(uint32_t) + SkAlign4(profileSize); 259 return sizeof(ColorSpaceHeader) + sizeof(uint32_t) + SkAlign4(profileSize);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 if (length < profileSize) { 312 if (length < profileSize) {
310 return nullptr; 313 return nullptr;
311 } 314 }
312 315
313 return NewICC(data, profileSize); 316 return NewICC(data, profileSize);
314 } 317 }
315 318
316 bool SkColorSpace::gammasAreMatching() const { 319 bool SkColorSpace::gammasAreMatching() const {
317 const SkGammas* gammas = as_CSB(this)->gammas(); 320 const SkGammas* gammas = as_CSB(this)->gammas();
318 SkASSERT(gammas); 321 SkASSERT(gammas);
319 return gammas->fRedData == gammas->fGreenData && gammas->fGreenData == gamma s->fBlueData; 322 return gammas->fRedType == gammas->fGreenType && gammas->fGreenType == gamma s->fBlueType &&
323 gammas->fRedData == gammas->fGreenData && gammas->fGreenData == gamma s->fBlueData;
320 } 324 }
321 325
322 bool SkColorSpace::gammasAreNamed() const { 326 bool SkColorSpace::gammasAreNamed() const {
323 const SkGammas* gammas = as_CSB(this)->gammas(); 327 const SkGammas* gammas = as_CSB(this)->gammas();
324 SkASSERT(gammas); 328 SkASSERT(gammas);
325 return gammas->fRedType == SkGammas::Type::kNamed_Type && 329 return gammas->fRedType == SkGammas::Type::kNamed_Type &&
326 gammas->fGreenType == SkGammas::Type::kNamed_Type && 330 gammas->fGreenType == SkGammas::Type::kNamed_Type &&
327 gammas->fBlueType == SkGammas::Type::kNamed_Type; 331 gammas->fBlueType == SkGammas::Type::kNamed_Type;
328 } 332 }
329 333
(...skipping 13 matching lines...) Expand all
343 gammas->fBlueType == SkGammas::Type::kTable_Type; 347 gammas->fBlueType == SkGammas::Type::kTable_Type;
344 } 348 }
345 349
346 bool SkColorSpace::gammasAreParams() const { 350 bool SkColorSpace::gammasAreParams() const {
347 const SkGammas* gammas = as_CSB(this)->gammas(); 351 const SkGammas* gammas = as_CSB(this)->gammas();
348 SkASSERT(gammas); 352 SkASSERT(gammas);
349 return gammas->fRedType == SkGammas::Type::kParam_Type && 353 return gammas->fRedType == SkGammas::Type::kParam_Type &&
350 gammas->fGreenType == SkGammas::Type::kParam_Type && 354 gammas->fGreenType == SkGammas::Type::kParam_Type &&
351 gammas->fBlueType == SkGammas::Type::kParam_Type; 355 gammas->fBlueType == SkGammas::Type::kParam_Type;
352 } 356 }
OLDNEW
« no previous file with comments | « resources/monitor_profiles/HP_ZR30w.icc ('k') | src/core/SkColorSpaceXform.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698