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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp

Issue 2797213002: Fix BaseRenderingContext2D create/put/get-ImageData() for color managed canvas (Closed)
Patch Set: Rebaseline Created 3 years, 7 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 | « third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp ('k') | no next file » | 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 (c) 2008, Google Inc. All rights reserved. 2 * Copyright (c) 2008, Google Inc. All rights reserved.
3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are 7 * modification, are permitted provided that the following conditions are
8 * met: 8 * met:
9 * 9 *
10 * * Redistributions of source code must retain the above copyright 10 * * Redistributions of source code must retain the above copyright
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 WTF::ArrayBufferContents::InitializationPolicy initialization_policy = 383 WTF::ArrayBufferContents::InitializationPolicy initialization_policy =
384 may_have_stray_area ? WTF::ArrayBufferContents::kZeroInitialize 384 may_have_stray_area ? WTF::ArrayBufferContents::kZeroInitialize
385 : WTF::ArrayBufferContents::kDontInitialize; 385 : WTF::ArrayBufferContents::kDontInitialize;
386 auto data = WTF::ArrayBufferContents::CreateDataHandle(alloc_size_in_bytes, 386 auto data = WTF::ArrayBufferContents::CreateDataHandle(alloc_size_in_bytes,
387 initialization_policy); 387 initialization_policy);
388 if (!data) 388 if (!data)
389 return false; 389 return false;
390 WTF::ArrayBufferContents result(std::move(data), alloc_size_in_bytes, 390 WTF::ArrayBufferContents result(std::move(data), alloc_size_in_bytes,
391 WTF::ArrayBufferContents::kNotShared); 391 WTF::ArrayBufferContents::kNotShared);
392 392
393 // Skia does not support unpremultiplied read with an F16 to 8888 conversion 393 SkAlphaType alpha_type = (multiplied == kPremultiplied)
394 bool use_f16_workaround =
395 surface_->color_params().GetSkColorType() == kRGBA_F16_SkColorType;
396
397 SkAlphaType alpha_type = (multiplied == kPremultiplied || use_f16_workaround)
398 ? kPremul_SkAlphaType 394 ? kPremul_SkAlphaType
399 : kUnpremul_SkAlphaType; 395 : kUnpremul_SkAlphaType;
400 // The workaround path use a canvas draw under the hood, which can only
401 // use N32 at this time.
402 SkColorType color_type = 396 SkColorType color_type =
403 use_f16_workaround ? kN32_SkColorType : kRGBA_8888_SkColorType; 397 (surface_->color_params().GetSkColorType() == kRGBA_F16_SkColorType)
398 ? kRGBA_F16_SkColorType
399 : kRGBA_8888_SkColorType;
404 400
405 // Only use sRGB when the surface has a color space. Converting untagged 401 SkImageInfo info = SkImageInfo::Make(
406 // pixels to a particular color space is not well-defined in Skia. 402 rect.Width(), rect.Height(), color_type, alpha_type,
407 sk_sp<SkColorSpace> color_space = 403 surface_->color_params().GetSkColorSpaceForSkSurfaces());
408 surface_->color_params().GetSkColorSpaceForSkSurfaces();
409
410 SkImageInfo info = SkImageInfo::Make(rect.Width(), rect.Height(), color_type,
411 alpha_type, std::move(color_space));
412 404
413 snapshot->readPixels(info, result.Data(), bytes_per_pixel * rect.Width(), 405 snapshot->readPixels(info, result.Data(), bytes_per_pixel * rect.Width(),
414 rect.X(), rect.Y()); 406 rect.X(), rect.Y());
415 gpu_readback_invoked_in_current_frame_ = true; 407 gpu_readback_invoked_in_current_frame_ = true;
416
417 if (use_f16_workaround) {
418 uint32_t* pixel = (uint32_t*)result.Data();
419 size_t pixel_count = alloc_size_in_bytes / sizeof(uint32_t);
420 // TODO(skbug.com/5853): make readPixels support RGBA output so that we no
421 // longer
422 // have to do this.
423 if (kN32_SkColorType == kBGRA_8888_SkColorType) {
424 // Convert BGRA to RGBA if necessary on this platform.
425 SkSwapRB(pixel, pixel, pixel_count);
426 }
427 // TODO(skbug.com/5853): We should really be doing the unpremultiply in
428 // linear space
429 // and skia should provide that service.
430 if (multiplied == kUnmultiplied) {
431 for (; pixel_count; --pixel_count) {
432 *pixel = SkUnPreMultiply::UnPreMultiplyPreservingByteOrder(*pixel);
433 ++pixel;
434 }
435 }
436 }
437
438 result.Transfer(contents); 408 result.Transfer(contents);
439 return true; 409 return true;
440 } 410 }
441 411
442 void ImageBuffer::PutByteArray(Multiply multiplied, 412 void ImageBuffer::PutByteArray(Multiply multiplied,
443 const unsigned char* source, 413 const unsigned char* source,
444 const IntSize& source_size, 414 const IntSize& source_size,
445 const IntRect& source_rect, 415 const IntRect& source_rect,
446 const IntPoint& dest_point) { 416 const IntPoint& dest_point) {
447 if (!IsSurfaceValid()) 417 if (!IsSurfaceValid())
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 DCHECK(MIMETypeRegistry::IsSupportedImageMIMETypeForEncoding(mime_type)); 566 DCHECK(MIMETypeRegistry::IsSupportedImageMIMETypeForEncoding(mime_type));
597 567
598 Vector<unsigned char> result; 568 Vector<unsigned char> result;
599 if (!EncodeImage(mime_type, quality, &result)) 569 if (!EncodeImage(mime_type, quality, &result))
600 return "data:,"; 570 return "data:,";
601 571
602 return "data:" + mime_type + ";base64," + Base64Encode(result); 572 return "data:" + mime_type + ";base64," + Base64Encode(result);
603 } 573 }
604 574
605 } // namespace blink 575 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/CanvasColorParams.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698