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

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

Issue 1488133002: Add usage metrics for display and image color profiles (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changed histograms to use suffixes Created 5 years 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) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 // where 0 means "infinite". But ImageSource::repetitionCount() 232 // where 0 means "infinite". But ImageSource::repetitionCount()
233 // returns -1 for "infinite", and 0 and up for "show the image 233 // returns -1 for "infinite", and 0 and up for "show the image
234 // animation one cycle more than the value". Subtract one here 234 // animation one cycle more than the value". Subtract one here
235 // to correctly handle the finite and infinite cases. 235 // to correctly handle the finite and infinite cases.
236 --m_repetitionCount; 236 --m_repetitionCount;
237 // FIXME: Implement ICC profile support for animated images. 237 // FIXME: Implement ICC profile support for animated images.
238 m_formatFlags &= ~ICCP_FLAG; 238 m_formatFlags &= ~ICCP_FLAG;
239 } 239 }
240 240
241 #if USE(QCMSLIB) 241 #if USE(QCMSLIB)
242 if ((m_formatFlags & ICCP_FLAG) && !ignoresGammaAndColorProfile()) 242 if (!ignoresGammaAndColorProfile()) {
243 readColorProfile(); 243 ColorProfileStatus status;
244 if ((m_formatFlags & ICCP_FLAG)) {
245 status = readColorProfile();
246 } else {
247 status = ColorProfileNone;
Noel Gordon 2015/12/23 15:28:48 ColorProfileEmpty
248 }
249 Platform::current()->histogramEnumeration("ColorManagement.ColorProf ileStatus.WEBP", status, ColorProfileStatus::ValueCount);
250 }
244 #endif 251 #endif
245 } 252 }
246 253
247 ASSERT(isDecodedSizeAvailable()); 254 ASSERT(isDecodedSizeAvailable());
248 return true; 255 return true;
249 } 256 }
250 257
251 bool WEBPImageDecoder::initFrameBuffer(size_t frameIndex) 258 bool WEBPImageDecoder::initFrameBuffer(size_t frameIndex)
252 { 259 {
253 ImageFrame& buffer = m_frameBufferCache[frameIndex]; 260 ImageFrame& buffer = m_frameBufferCache[frameIndex];
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 316
310 #if USE(QCMSLIB) 317 #if USE(QCMSLIB)
311 318
312 void WEBPImageDecoder::clearColorTransform() 319 void WEBPImageDecoder::clearColorTransform()
313 { 320 {
314 if (m_transform) 321 if (m_transform)
315 qcms_transform_release(m_transform); 322 qcms_transform_release(m_transform);
316 m_transform = 0; 323 m_transform = 0;
317 } 324 }
318 325
319 bool WEBPImageDecoder::createColorTransform(const char* data, size_t size) 326 bool WEBPImageDecoder::createColorTransform(const char* data, size_t size, Color ProfileStatus& status)
320 { 327 {
321 clearColorTransform(); 328 clearColorTransform();
322 329
330 qcms_profile* inputProfile = qcms_profile_from_memory(data, size);
331 if (!inputProfile) {
332 status = ColorProfileFailedDecode;
Noel Gordon 2015/12/23 15:28:48 ColorProfileFailedDecode -> ColorProfileInvalidCon
333 return false;
334 }
335
323 qcms_profile* deviceProfile = ImageDecoder::qcmsOutputDeviceProfile(); 336 qcms_profile* deviceProfile = ImageDecoder::qcmsOutputDeviceProfile();
324 if (!deviceProfile) 337 if (!deviceProfile)
325 return false; 338 return false;
326 qcms_profile* inputProfile = qcms_profile_from_memory(data, size);
327 if (!inputProfile)
328 return false;
329
330 // We currently only support color profiles for RGB profiled images. 339 // We currently only support color profiles for RGB profiled images.
331 ASSERT(rgbData == qcms_profile_get_color_space(inputProfile)); 340 ASSERT(rgbData == qcms_profile_get_color_space(inputProfile));
332 // The input image pixels are RGBA format. 341 // The input image pixels are RGBA format.
333 qcms_data_type format = QCMS_DATA_RGBA_8; 342 qcms_data_type format = QCMS_DATA_RGBA_8;
334 // FIXME: Don't force perceptual intent if the image profile contains an int ent. 343 // FIXME: Don't force perceptual intent if the image profile contains an int ent.
335 m_transform = qcms_transform_create(inputProfile, format, deviceProfile, QCM S_DATA_RGBA_8, QCMS_INTENT_PERCEPTUAL); 344 m_transform = qcms_transform_create(inputProfile, format, deviceProfile, QCM S_DATA_RGBA_8, QCMS_INTENT_PERCEPTUAL);
336 345
337 qcms_profile_release(inputProfile); 346 qcms_profile_release(inputProfile);
338 return !!m_transform; 347 return !!m_transform;
339 } 348 }
340 349
341 void WEBPImageDecoder::readColorProfile() 350 ColorProfileStatus WEBPImageDecoder::readColorProfile()
342 { 351 {
343 WebPChunkIterator chunkIterator; 352 WebPChunkIterator chunkIterator;
344 if (!WebPDemuxGetChunk(m_demux, "ICCP", 1, &chunkIterator)) { 353 if (!WebPDemuxGetChunk(m_demux, "ICCP", 1, &chunkIterator)) {
345 WebPDemuxReleaseChunkIterator(&chunkIterator); 354 WebPDemuxReleaseChunkIterator(&chunkIterator);
346 return; 355 return ColorProfileNotFound;
Noel Gordon 2015/12/23 15:28:48 ColorProfileNotFound -> ColorProfileEmpty
347 } 356 }
348 357
349 const char* profileData = reinterpret_cast<const char*>(chunkIterator.chunk. bytes); 358 const char* profileData = reinterpret_cast<const char*>(chunkIterator.chunk. bytes);
350 size_t profileSize = chunkIterator.chunk.size; 359 size_t profileSize = chunkIterator.chunk.size;
351 360
352 // Only accept RGB color profiles from input class devices. 361 // Only accept RGB color profiles from input class devices.
353 bool ignoreProfile = false; 362 ColorProfileStatus status = ColorProfileSuccess;
Noel Gordon 2015/12/23 15:28:48 362-370, same as per the JPEG decoder.
354 if (profileSize < ImageDecoder::iccColorProfileHeaderLength) 363 if (profileSize < ImageDecoder::iccColorProfileHeaderLength)
355 ignoreProfile = true; 364 status = ColorProfileIsCorrupted;
365 else if (ImageDecoder::isICCv4(profileData, profileSize))
366 status = ColorProfileIsV4;
356 else if (!ImageDecoder::rgbColorProfile(profileData, profileSize)) 367 else if (!ImageDecoder::rgbColorProfile(profileData, profileSize))
357 ignoreProfile = true; 368 status = ColorProfileIsNotRGB;
358 else if (!ImageDecoder::inputDeviceColorProfile(profileData, profileSize)) 369 else if (!ImageDecoder::inputDeviceColorProfile(profileData, profileSize))
359 ignoreProfile = true; 370 status = ColorProfileIsNotAnInputProfile;
360 371
361 if (!ignoreProfile) 372 if (status == ColorProfileSuccess)
362 m_hasColorProfile = createColorTransform(profileData, profileSize); 373 m_hasColorProfile = createColorTransform(profileData, profileSize, statu s);
363 374
364 WebPDemuxReleaseChunkIterator(&chunkIterator); 375 WebPDemuxReleaseChunkIterator(&chunkIterator);
376 return status;
365 } 377 }
366 378
367 #endif // USE(QCMSLIB) 379 #endif // USE(QCMSLIB)
368 380
369 void WEBPImageDecoder::applyPostProcessing(size_t frameIndex) 381 void WEBPImageDecoder::applyPostProcessing(size_t frameIndex)
370 { 382 {
371 ImageFrame& buffer = m_frameBufferCache[frameIndex]; 383 ImageFrame& buffer = m_frameBufferCache[frameIndex];
372 int width; 384 int width;
373 int decodedHeight; 385 int decodedHeight;
374 if (!WebPIDecGetRGB(m_decoder, &decodedHeight, &width, 0, 0)) 386 if (!WebPIDecGetRGB(m_decoder, &decodedHeight, &width, 0, 0))
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 return false; 563 return false;
552 } 564 }
553 // FALLTHROUGH 565 // FALLTHROUGH
554 default: 566 default:
555 clear(); 567 clear();
556 return setFailed(); 568 return setFailed();
557 } 569 }
558 } 570 }
559 571
560 } // namespace blink 572 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698