OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. |
3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> | 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> |
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 | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 } | 483 } |
484 } | 484 } |
485 | 485 |
486 if (listenerNeedsNewFrameCapture) { | 486 if (listenerNeedsNewFrameCapture) { |
487 SourceImageStatus status; | 487 SourceImageStatus status; |
488 RefPtr<Image> sourceImage = getSourceImageForCanvas( | 488 RefPtr<Image> sourceImage = getSourceImageForCanvas( |
489 &status, PreferNoAcceleration, SnapshotReasonCanvasListenerCapture, | 489 &status, PreferNoAcceleration, SnapshotReasonCanvasListenerCapture, |
490 FloatSize()); | 490 FloatSize()); |
491 if (status != NormalSourceImageStatus) | 491 if (status != NormalSourceImageStatus) |
492 return; | 492 return; |
493 sk_sp<SkImage> image = sourceImage->imageForCurrentFrame(); | 493 // TODO(ccameron): Canvas should produce sRGB images. |
| 494 // https://crbug.com/672299 |
| 495 sk_sp<SkImage> image = sourceImage->imageForCurrentFrame( |
| 496 ColorBehavior::transformToGlobalTarget()); |
494 for (CanvasDrawListener* listener : m_listeners) { | 497 for (CanvasDrawListener* listener : m_listeners) { |
495 if (listener->needsNewFrame()) { | 498 if (listener->needsNewFrame()) { |
496 listener->sendNewFrame(image); | 499 listener->sendNewFrame(image); |
497 } | 500 } |
498 } | 501 } |
499 } | 502 } |
500 } | 503 } |
501 | 504 |
502 void HTMLCanvasElement::paint(GraphicsContext& context, const LayoutRect& r) { | 505 void HTMLCanvasElement::paint(GraphicsContext& context, const LayoutRect& r) { |
503 // FIXME: crbug.com/438240; there is a bug with the new CSS blending and | 506 // FIXME: crbug.com/438240; there is a bug with the new CSS blending and |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 imageData = ImageData::create(m_size); | 616 imageData = ImageData::create(m_size); |
614 | 617 |
615 if ((!m_context || !imageData) && !placeholderFrame()) | 618 if ((!m_context || !imageData) && !placeholderFrame()) |
616 return imageData; | 619 return imageData; |
617 | 620 |
618 DCHECK((m_context && m_context->is2d()) || placeholderFrame()); | 621 DCHECK((m_context && m_context->is2d()) || placeholderFrame()); |
619 sk_sp<SkImage> snapshot; | 622 sk_sp<SkImage> snapshot; |
620 if (hasImageBuffer()) { | 623 if (hasImageBuffer()) { |
621 snapshot = buffer()->newSkImageSnapshot(PreferNoAcceleration, reason); | 624 snapshot = buffer()->newSkImageSnapshot(PreferNoAcceleration, reason); |
622 } else if (placeholderFrame()) { | 625 } else if (placeholderFrame()) { |
623 snapshot = placeholderFrame()->imageForCurrentFrame(); | 626 // TODO(ccameron): Canvas should produce sRGB images. |
| 627 // https://crbug.com/672299 |
| 628 snapshot = placeholderFrame()->imageForCurrentFrame( |
| 629 ColorBehavior::transformToGlobalTarget()); |
624 } | 630 } |
625 | 631 |
626 if (snapshot) { | 632 if (snapshot) { |
627 SkImageInfo imageInfo = SkImageInfo::Make( | 633 SkImageInfo imageInfo = SkImageInfo::Make( |
628 width(), height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); | 634 width(), height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); |
629 snapshot->readPixels(imageInfo, imageData->data()->data(), | 635 snapshot->readPixels(imageInfo, imageData->data()->data(), |
630 imageInfo.minRowBytes(), 0, 0); | 636 imageInfo.minRowBytes(), 0, 0); |
631 } | 637 } |
632 | 638 |
633 return imageData; | 639 return imageData; |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1200 | 1206 |
1201 if (!m_context) { | 1207 if (!m_context) { |
1202 *status = NormalSourceImageStatus; | 1208 *status = NormalSourceImageStatus; |
1203 return createTransparentImage(size()); | 1209 return createTransparentImage(size()); |
1204 } | 1210 } |
1205 | 1211 |
1206 if (m_context->getContextType() == CanvasRenderingContext::ContextImageBitmap) | 1212 if (m_context->getContextType() == CanvasRenderingContext::ContextImageBitmap) |
1207 return m_context->getImage(hint, reason); | 1213 return m_context->getImage(hint, reason); |
1208 | 1214 |
1209 sk_sp<SkImage> skImage; | 1215 sk_sp<SkImage> skImage; |
| 1216 // TODO(ccameron): Canvas should produce sRGB images. |
| 1217 // https://crbug.com/672299 |
1210 if (m_context->is3d()) { | 1218 if (m_context->is3d()) { |
1211 // Because WebGL sources always require making a copy of the back buffer, we | 1219 // Because WebGL sources always require making a copy of the back buffer, we |
1212 // use paintRenderingResultsToCanvas instead of getImage in order to keep a | 1220 // use paintRenderingResultsToCanvas instead of getImage in order to keep a |
1213 // cached copy of the backing in the canvas's ImageBuffer. | 1221 // cached copy of the backing in the canvas's ImageBuffer. |
1214 renderingContext()->paintRenderingResultsToCanvas(BackBuffer); | 1222 renderingContext()->paintRenderingResultsToCanvas(BackBuffer); |
1215 skImage = hasImageBuffer() | 1223 skImage = hasImageBuffer() |
1216 ? buffer()->newSkImageSnapshot(hint, reason) | 1224 ? buffer()->newSkImageSnapshot(hint, reason) |
1217 : createTransparentImage(size())->imageForCurrentFrame(); | 1225 : createTransparentImage(size())->imageForCurrentFrame( |
| 1226 ColorBehavior::transformToGlobalTarget()); |
1218 } else { | 1227 } else { |
1219 if (ExpensiveCanvasHeuristicParameters:: | 1228 if (ExpensiveCanvasHeuristicParameters:: |
1220 DisableAccelerationToAvoidReadbacks && | 1229 DisableAccelerationToAvoidReadbacks && |
1221 !RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled() && | 1230 !RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled() && |
1222 hint == PreferNoAcceleration && m_context->isAccelerated() && | 1231 hint == PreferNoAcceleration && m_context->isAccelerated() && |
1223 hasImageBuffer()) | 1232 hasImageBuffer()) |
1224 buffer()->disableAcceleration(); | 1233 buffer()->disableAcceleration(); |
1225 RefPtr<blink::Image> image = renderingContext()->getImage(hint, reason); | 1234 RefPtr<blink::Image> image = renderingContext()->getImage(hint, reason); |
1226 skImage = image ? image->imageForCurrentFrame() | 1235 skImage = image |
1227 : createTransparentImage(size())->imageForCurrentFrame(); | 1236 ? image->imageForCurrentFrame( |
| 1237 ColorBehavior::transformToGlobalTarget()) |
| 1238 : createTransparentImage(size())->imageForCurrentFrame( |
| 1239 ColorBehavior::transformToGlobalTarget()); |
1228 } | 1240 } |
1229 | 1241 |
1230 if (skImage) { | 1242 if (skImage) { |
1231 *status = NormalSourceImageStatus; | 1243 *status = NormalSourceImageStatus; |
1232 return StaticBitmapImage::create(std::move(skImage)); | 1244 return StaticBitmapImage::create(std::move(skImage)); |
1233 } | 1245 } |
1234 | 1246 |
1235 *status = InvalidSourceImageStatus; | 1247 *status = InvalidSourceImageStatus; |
1236 return nullptr; | 1248 return nullptr; |
1237 } | 1249 } |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1369 mojom::blink::OffscreenCanvasSurfacePtr service; | 1381 mojom::blink::OffscreenCanvasSurfacePtr service; |
1370 Platform::current()->interfaceProvider()->getInterface( | 1382 Platform::current()->interfaceProvider()->getInterface( |
1371 mojo::GetProxy(&service)); | 1383 mojo::GetProxy(&service)); |
1372 m_surfaceLayerBridge = | 1384 m_surfaceLayerBridge = |
1373 wrapUnique(new CanvasSurfaceLayerBridge(std::move(service))); | 1385 wrapUnique(new CanvasSurfaceLayerBridge(std::move(service))); |
1374 return m_surfaceLayerBridge->createSurfaceLayer(this->width(), | 1386 return m_surfaceLayerBridge->createSurfaceLayer(this->width(), |
1375 this->height()); | 1387 this->height()); |
1376 } | 1388 } |
1377 | 1389 |
1378 } // namespace blink | 1390 } // namespace blink |
OLD | NEW |