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

Side by Side Diff: third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp

Issue 2203903002: Color: Read embedded ICC profiles regardless of QCMS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update tests 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 2 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
3 * 3 *
4 * This library is free software; you can redistribute it and/or 4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public 5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either 6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version. 7 * version 2 of the License, or (at your option) any later version.
8 * 8 *
9 * This library is distributed in the hope that it will be useful, 9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 ASSERT((i >= 0) && i < 3); 287 ASSERT((i >= 0) && i < 3);
288 return m_planes[i]; 288 return m_planes[i];
289 } 289 }
290 290
291 size_t ImagePlanes::rowBytes(int i) const 291 size_t ImagePlanes::rowBytes(int i) const
292 { 292 {
293 ASSERT((i >= 0) && i < 3); 293 ASSERT((i >= 0) && i < 3);
294 return m_rowBytes[i]; 294 return m_rowBytes[i];
295 } 295 }
296 296
297 namespace {
298
297 #if USE(QCMSLIB) 299 #if USE(QCMSLIB)
298 namespace {
299 300
300 const unsigned kIccColorProfileHeaderLength = 128; 301 const unsigned kIccColorProfileHeaderLength = 128;
301 302
302 bool rgbColorProfile(const char* profileData, unsigned profileLength) 303 bool rgbColorProfile(const char* profileData, unsigned profileLength)
303 { 304 {
304 ASSERT_UNUSED(profileLength, profileLength >= kIccColorProfileHeaderLength); 305 ASSERT_UNUSED(profileLength, profileLength >= kIccColorProfileHeaderLength);
305 306
306 return !memcmp(&profileData[16], "RGB ", 4); 307 return !memcmp(&profileData[16], "RGB ", 4);
307 } 308 }
308 309
309 bool inputDeviceColorProfile(const char* profileData, unsigned profileLength) 310 bool inputDeviceColorProfile(const char* profileData, unsigned profileLength)
310 { 311 {
311 ASSERT_UNUSED(profileLength, profileLength >= kIccColorProfileHeaderLength); 312 ASSERT_UNUSED(profileLength, profileLength >= kIccColorProfileHeaderLength);
312 313
313 return !memcmp(&profileData[12], "mntr", 4) || !memcmp(&profileData[12], "sc nr", 4); 314 return !memcmp(&profileData[12], "mntr", 4) || !memcmp(&profileData[12], "sc nr", 4);
314 } 315 }
315 316
316 // The output device color profile is global and shared across multiple threads. 317 // The output device color profile is global and shared across multiple threads.
317 SpinLock gTargetColorProfileLock; 318 SpinLock gTargetColorProfileLock;
318 qcms_profile* gTargetColorProfile = nullptr; 319 qcms_profile* gTargetColorProfile = nullptr;
319 320
321 #endif // USE(QCMSLIB)
322
320 } // namespace 323 } // namespace
321 324
322 // static 325 // static
323 void ImageDecoder::setTargetColorProfile(const WebVector<char>& profile) 326 void ImageDecoder::setTargetColorProfile(const WebVector<char>& profile)
324 { 327 {
328 #if USE(QCMSLIB)
325 if (profile.isEmpty()) 329 if (profile.isEmpty())
326 return; 330 return;
327 331
328 // Take a lock around initializing and accessing the global device color pro file. 332 // Take a lock around initializing and accessing the global device color pro file.
329 SpinLock::Guard guard(gTargetColorProfileLock); 333 SpinLock::Guard guard(gTargetColorProfileLock);
330 334
331 // Layout tests expect that only the first call will take effect. 335 // Layout tests expect that only the first call will take effect.
332 if (gTargetColorProfile) 336 if (gTargetColorProfile)
333 return; 337 return;
334 338
335 { 339 {
336 sk_sp<SkColorSpace> colorSpace = SkColorSpace::NewICC(profile.data(), pr ofile.size()); 340 sk_sp<SkColorSpace> colorSpace = SkColorSpace::NewICC(profile.data(), pr ofile.size());
337 BitmapImageMetrics::countGamma(colorSpace.get()); 341 BitmapImageMetrics::countGamma(colorSpace.get());
338 } 342 }
339 343
340 // FIXME: Add optional ICCv4 support and support for multiple monitors. 344 // FIXME: Add optional ICCv4 support and support for multiple monitors.
341 gTargetColorProfile = qcms_profile_from_memory(profile.data(), profile.size( )); 345 gTargetColorProfile = qcms_profile_from_memory(profile.data(), profile.size( ));
342 if (!gTargetColorProfile) 346 if (!gTargetColorProfile)
343 return; 347 return;
344 348
345 if (qcms_profile_is_bogus(gTargetColorProfile)) { 349 if (qcms_profile_is_bogus(gTargetColorProfile)) {
346 qcms_profile_release(gTargetColorProfile); 350 qcms_profile_release(gTargetColorProfile);
347 gTargetColorProfile = nullptr; 351 gTargetColorProfile = nullptr;
348 return; 352 return;
349 } 353 }
350 354
351 qcms_profile_precache_output_transform(gTargetColorProfile); 355 qcms_profile_precache_output_transform(gTargetColorProfile);
356 #endif // USE(QCMSLIB)
352 } 357 }
353 358
354 bool ImageDecoder::hasColorProfile() const 359 void ImageDecoder::setColorProfileAndComputeTransform(const char* iccData, unsig ned iccLength, bool hasAlpha, bool useSRGB)
355 { 360 {
356 return m_sourceToOutputDeviceColorTransform.get(); 361 // Sub-classes should not call this if they were instructed to ignore embedd ed color profiles.
357 } 362 DCHECK(!m_ignoreGammaAndColorProfile);
358 363
359 void ImageDecoder::setColorProfileAndTransform(const char* iccData, unsigned icc Length, bool hasAlpha, bool useSRGB) 364 m_colorProfile.assign(iccData, iccLength);
360 { 365 m_hasColorProfile = true;
366
367 #if USE(QCMSLIB)
361 m_sourceToOutputDeviceColorTransform.reset(); 368 m_sourceToOutputDeviceColorTransform.reset();
362 369
363 // Create the input profile 370 // Create the input profile
364 QCMSProfileUniquePtr inputProfile; 371 QCMSProfileUniquePtr inputProfile;
365 if (useSRGB) { 372 if (useSRGB) {
366 inputProfile.reset(qcms_profile_sRGB()); 373 inputProfile.reset(qcms_profile_sRGB());
367 } else { 374 } else {
368 // Only accept RGB color profiles from input class devices. 375 // Only accept RGB color profiles from input class devices.
369 if (iccLength < kIccColorProfileHeaderLength) 376 if (iccLength < kIccColorProfileHeaderLength)
370 return; 377 return;
(...skipping 18 matching lines...) Expand all
389 qcms_profile_precache_output_transform(gTargetColorProfile); 396 qcms_profile_precache_output_transform(gTargetColorProfile);
390 } 397 }
391 398
392 if (qcms_profile_match(inputProfile.get(), gTargetColorProfile)) 399 if (qcms_profile_match(inputProfile.get(), gTargetColorProfile))
393 return; 400 return;
394 401
395 qcms_data_type dataFormat = hasAlpha ? QCMS_DATA_RGBA_8 : QCMS_DATA_RGB_8; 402 qcms_data_type dataFormat = hasAlpha ? QCMS_DATA_RGBA_8 : QCMS_DATA_RGB_8;
396 403
397 // FIXME: Don't force perceptual intent if the image profile contains an int ent. 404 // FIXME: Don't force perceptual intent if the image profile contains an int ent.
398 m_sourceToOutputDeviceColorTransform.reset(qcms_transform_create(inputProfil e.get(), dataFormat, gTargetColorProfile, QCMS_DATA_RGBA_8, QCMS_INTENT_PERCEPTU AL)); 405 m_sourceToOutputDeviceColorTransform.reset(qcms_transform_create(inputProfil e.get(), dataFormat, gTargetColorProfile, QCMS_DATA_RGBA_8, QCMS_INTENT_PERCEPTU AL));
406 #endif // USE(QCMSLIB)
399 } 407 }
400 408
401 #else // USE(QCMSLIB)
402
403 void ImageDecoder::setTargetColorProfile(const WebVector<char>&)
404 {
405 }
406
407 bool ImageDecoder::hasColorProfile() const
408 {
409 return false;
410 }
411
412 #endif // USE(QCMSLIB)
413
414 } // namespace blink 409 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698