Index: third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp |
diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp |
index 686f2ada187a97216ac8c8b2d231486b72b5a9d9..bef3bebc3625e8180a43e6c94992f9c687579a5f 100644 |
--- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp |
+++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp |
@@ -295,7 +295,7 @@ CanvasRenderingContext* HTMLCanvasElement::GetCanvasRenderingContext( |
bool HTMLCanvasElement::ShouldBeDirectComposited() const { |
return (context_ && context_->IsComposited()) || |
- (HasImageBuffer() && Buffer()->IsExpensiveToPaint()) || |
+ (GetImageBuffer() && GetImageBuffer()->IsExpensiveToPaint()) || |
(!!surface_layer_bridge_); |
} |
@@ -323,8 +323,8 @@ void HTMLCanvasElement::DidDraw(const FloatRect& rect) { |
} else { |
dirty_rect_.Unite(rect); |
} |
- if (Is2d() && HasImageBuffer()) |
- Buffer()->DidDraw(rect); |
+ if (Is2d() && GetImageBuffer()) |
+ GetImageBuffer()->DidDraw(rect); |
} |
void HTMLCanvasElement::DidDraw() { |
@@ -332,7 +332,7 @@ void HTMLCanvasElement::DidDraw() { |
} |
void HTMLCanvasElement::FinalizeFrame() { |
- if (HasImageBuffer()) |
+ if (GetImageBuffer()) |
image_buffer_->FinalizeFrame(); |
// If the canvas is visible, notifying listeners is taken |
@@ -387,7 +387,7 @@ void HTMLCanvasElement::DoDeferredPaintInvalidation() { |
if (dirty_rect_.IsEmpty()) |
return; |
- if (HasImageBuffer()) { |
+ if (GetImageBuffer()) { |
image_buffer_->DoPaintInvalidation(invalidation_rect); |
} |
} |
@@ -432,7 +432,7 @@ void HTMLCanvasElement::DoDeferredPaintInvalidation() { |
if (RuntimeEnabledFeatures:: |
enableCanvas2dDynamicRenderingModeSwitchingEnabled() && |
!RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled()) { |
- if (Is2d() && HasImageBuffer() && Buffer()->IsAccelerated() && |
+ if (Is2d() && GetImageBuffer() && GetImageBuffer()->IsAccelerated() && |
num_frames_since_last_rendering_mode_switch_ >= |
ExpensiveCanvasHeuristicParameters::kMinFramesBeforeSwitch && |
!pending_rendering_mode_switch_) { |
@@ -454,8 +454,8 @@ void HTMLCanvasElement::DoDeferredPaintInvalidation() { |
} |
} |
- if (pending_rendering_mode_switch_ && Buffer() && |
- !Buffer()->IsAccelerated()) { |
+ if (pending_rendering_mode_switch_ && GetOrCreateImageBuffer() && |
+ !GetOrCreateImageBuffer()->IsAccelerated()) { |
pending_rendering_mode_switch_ = false; |
} |
@@ -469,7 +469,7 @@ void HTMLCanvasElement::Reset() { |
dirty_rect_ = FloatRect(); |
bool ok; |
- bool had_image_buffer = HasImageBuffer(); |
+ bool had_image_buffer = GetImageBuffer(); |
int w = getAttribute(widthAttr).ToInt(&ok); |
if (!ok || w < 0) |
@@ -488,7 +488,7 @@ void HTMLCanvasElement::Reset() { |
// If the size of an existing buffer matches, we can just clear it instead of |
// reallocating. This optimization is only done for 2D canvases for now. |
if (had_image_buffer && old_size == new_size && Is2d() && |
- !Buffer()->IsRecording()) { |
+ !GetOrCreateImageBuffer()->IsRecording()) { |
if (!image_buffer_is_clear_) { |
image_buffer_is_clear_ = true; |
context_->clearRect(0, 0, width(), height()); |
@@ -572,11 +572,11 @@ void HTMLCanvasElement::Paint(GraphicsContext& context, const LayoutRect& r) { |
if (Is3d()) { |
context_->SetFilterQuality(filter_quality); |
- } else if (HasImageBuffer()) { |
+ } else if (GetImageBuffer()) { |
image_buffer_->SetFilterQuality(filter_quality); |
} |
- if (HasImageBuffer() && !image_buffer_is_clear_) |
+ if (GetImageBuffer() && !image_buffer_is_clear_) |
PaintTiming::From(GetDocument()).MarkFirstContentfulPaint(); |
if (!PaintsIntoCanvasBuffer() && !GetDocument().Printing()) |
@@ -595,13 +595,14 @@ void HTMLCanvasElement::Paint(GraphicsContext& context, const LayoutRect& r) { |
return; |
context_->PaintRenderingResultsToCanvas(kFrontBuffer); |
- if (HasImageBuffer()) { |
+ if (GetImageBuffer()) { |
if (!context.ContextDisabled()) { |
SkBlendMode composite_operator = |
!context_ || context_->CreationAttributes().alpha() |
? SkBlendMode::kSrcOver |
: SkBlendMode::kSrc; |
- Buffer()->Draw(context, PixelSnappedIntRect(r), 0, composite_operator); |
+ GetImageBuffer()->Draw(context, PixelSnappedIntRect(r), 0, |
+ composite_operator); |
} |
} else { |
// When alpha is false, we should draw to opaque black. |
@@ -622,7 +623,8 @@ bool HTMLCanvasElement::Is2d() const { |
} |
bool HTMLCanvasElement::IsAnimated2d() const { |
- return Is2d() && HasImageBuffer() && image_buffer_->WasDrawnToAfterSnapshot(); |
+ return Is2d() && GetImageBuffer() && |
+ GetImageBuffer()->WasDrawnToAfterSnapshot(); |
} |
void HTMLCanvasElement::SetSurfaceSize(const IntSize& size) { |
@@ -640,9 +642,9 @@ const AtomicString HTMLCanvasElement::ImageSourceURL() const { |
ToDataURLInternal(ImageEncoderUtils::kDefaultMimeType, 0, kFrontBuffer)); |
} |
-void HTMLCanvasElement::PrepareSurfaceForPaintingIfNeeded() const { |
+void HTMLCanvasElement::PrepareSurfaceForPaintingIfNeeded() { |
DCHECK(Is2d()); // This function is called by the 2d context |
- if (Buffer()) |
+ if (GetOrCreateImageBuffer()) |
image_buffer_->PrepareSurfaceForPaintingIfNeeded(); |
} |
@@ -658,9 +660,9 @@ ImageData* HTMLCanvasElement::ToImageData(SourceDrawingBuffer source_buffer, |
context_->PaintRenderingResultsToCanvas(source_buffer); |
image_data = ImageData::Create(size_); |
- if (image_data && HasImageBuffer()) { |
+ if (image_data && GetImageBuffer()) { |
sk_sp<SkImage> snapshot = |
- Buffer()->NewSkImageSnapshot(kPreferNoAcceleration, reason); |
+ GetImageBuffer()->NewSkImageSnapshot(kPreferNoAcceleration, reason); |
if (snapshot) { |
SkImageInfo image_info = SkImageInfo::Make( |
width(), height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType); |
@@ -678,8 +680,9 @@ ImageData* HTMLCanvasElement::ToImageData(SourceDrawingBuffer source_buffer, |
DCHECK(Is2d() || PlaceholderFrame()); |
sk_sp<SkImage> snapshot; |
- if (HasImageBuffer()) { |
- snapshot = Buffer()->NewSkImageSnapshot(kPreferNoAcceleration, reason); |
+ if (GetImageBuffer()) { |
+ snapshot = |
+ GetImageBuffer()->NewSkImageSnapshot(kPreferNoAcceleration, reason); |
} else if (PlaceholderFrame()) { |
DCHECK(PlaceholderFrame()->OriginClean()); |
snapshot = PlaceholderFrame()->ImageForCurrentFrame(); |
@@ -1094,28 +1097,28 @@ void HTMLCanvasElement::UpdateExternallyAllocatedMemory() const { |
externally_allocated_memory_ = externally_allocated_memory; |
} |
-PaintCanvas* HTMLCanvasElement::DrawingCanvas() const { |
- return Buffer() ? image_buffer_->Canvas() : nullptr; |
+PaintCanvas* HTMLCanvasElement::DrawingCanvas() { |
+ return GetOrCreateImageBuffer() ? GetImageBuffer()->Canvas() : nullptr; |
} |
-void HTMLCanvasElement::DisableDeferral(DisableDeferralReason reason) const { |
- if (Buffer()) |
+void HTMLCanvasElement::DisableDeferral(DisableDeferralReason reason) { |
+ if (GetOrCreateImageBuffer()) |
image_buffer_->DisableDeferral(reason); |
} |
PaintCanvas* HTMLCanvasElement::ExistingDrawingCanvas() const { |
- if (!HasImageBuffer()) |
+ if (!GetImageBuffer()) |
return nullptr; |
return image_buffer_->Canvas(); |
} |
-ImageBuffer* HTMLCanvasElement::Buffer() const { |
+ImageBuffer* HTMLCanvasElement::GetOrCreateImageBuffer() { |
DCHECK(context_); |
DCHECK(context_->GetContextType() != |
CanvasRenderingContext::kContextImageBitmap); |
- if (!HasImageBuffer() && !did_fail_to_create_image_buffer_) |
- const_cast<HTMLCanvasElement*>(this)->CreateImageBuffer(); |
+ if (!image_buffer_ && !did_fail_to_create_image_buffer_) |
+ CreateImageBuffer(); |
return image_buffer_.get(); |
} |
@@ -1129,7 +1132,7 @@ void HTMLCanvasElement::CreateImageBufferUsingSurfaceForTesting( |
void HTMLCanvasElement::EnsureUnacceleratedImageBuffer() { |
DCHECK(context_); |
- if ((HasImageBuffer() && !image_buffer_->IsAccelerated()) || |
+ if ((GetImageBuffer() && !GetImageBuffer()->IsAccelerated()) || |
did_fail_to_create_image_buffer_) |
return; |
DiscardImageBuffer(); |
@@ -1142,7 +1145,7 @@ void HTMLCanvasElement::EnsureUnacceleratedImageBuffer() { |
PassRefPtr<Image> HTMLCanvasElement::CopiedImage( |
SourceDrawingBuffer source_buffer, |
AccelerationHint hint, |
- SnapshotReason snapshot_reason) const { |
+ SnapshotReason snapshot_reason) { |
if (!IsPaintable()) |
return nullptr; |
if (!context_) |
@@ -1151,6 +1154,7 @@ PassRefPtr<Image> HTMLCanvasElement::CopiedImage( |
if (context_->GetContextType() == |
CanvasRenderingContext::kContextImageBitmap) { |
RefPtr<Image> image = context_->GetImage(hint, snapshot_reason); |
+ // TODO(fserb): return image? |
if (image) |
return context_->GetImage(hint, snapshot_reason); |
// Special case: transferFromImageBitmap is not yet called. |
@@ -1163,8 +1167,8 @@ PassRefPtr<Image> HTMLCanvasElement::CopiedImage( |
// The concept of SourceDrawingBuffer is valid on only WebGL. |
if (context_->Is3d()) |
need_to_update |= context_->PaintRenderingResultsToCanvas(source_buffer); |
- if (need_to_update && Buffer()) { |
- copied_image_ = Buffer()->NewImageSnapshot(hint, snapshot_reason); |
+ if (need_to_update && GetOrCreateImageBuffer()) { |
+ copied_image_ = GetImageBuffer()->NewImageSnapshot(hint, snapshot_reason); |
UpdateExternallyAllocatedMemory(); |
} |
return copied_image_; |
@@ -1184,7 +1188,7 @@ void HTMLCanvasElement::ClearCopiedImage() { |
} |
AffineTransform HTMLCanvasElement::BaseTransform() const { |
- DCHECK(HasImageBuffer() && !did_fail_to_create_image_buffer_); |
+ DCHECK(GetImageBuffer() && !did_fail_to_create_image_buffer_); |
return image_buffer_->BaseTransform(); |
} |
@@ -1222,7 +1226,7 @@ void HTMLCanvasElement::DidMoveToNewDocument(Document& old_document) { |
void HTMLCanvasElement::WillDrawImageTo2DContext(CanvasImageSource* source) { |
if (ExpensiveCanvasHeuristicParameters::kEnableAccelerationToAvoidReadbacks && |
SharedGpuContext::AllowSoftwareToAcceleratedCanvasUpgrade() && |
- source->IsAccelerated() && !Buffer()->IsAccelerated() && |
+ source->IsAccelerated() && !GetOrCreateImageBuffer()->IsAccelerated() && |
ShouldAccelerate(kIgnoreResourceLimitCriteria)) { |
OpacityMode opacity_mode = |
context_->CreationAttributes().alpha() ? kNonOpaque : kOpaque; |
@@ -1230,7 +1234,7 @@ void HTMLCanvasElement::WillDrawImageTo2DContext(CanvasImageSource* source) { |
std::unique_ptr<ImageBufferSurface> surface = |
CreateAcceleratedImageBufferSurface(opacity_mode, &msaa_sample_count); |
if (surface) { |
- Buffer()->SetSurface(std::move(surface)); |
+ GetOrCreateImageBuffer()->SetSurface(std::move(surface)); |
SetNeedsCompositingUpdate(); |
} |
} |
@@ -1240,7 +1244,7 @@ PassRefPtr<Image> HTMLCanvasElement::GetSourceImageForCanvas( |
SourceImageStatus* status, |
AccelerationHint hint, |
SnapshotReason reason, |
- const FloatSize&) const { |
+ const FloatSize&) { |
if (!width() || !height()) { |
*status = kZeroSizeCanvasSourceImageStatus; |
return nullptr; |
@@ -1276,8 +1280,8 @@ PassRefPtr<Image> HTMLCanvasElement::GetSourceImageForCanvas( |
// use paintRenderingResultsToCanvas instead of getImage in order to keep a |
// cached copy of the backing in the canvas's ImageBuffer. |
RenderingContext()->PaintRenderingResultsToCanvas(kBackBuffer); |
- if (HasImageBuffer()) { |
- sk_image = Buffer()->NewSkImageSnapshot(hint, reason); |
+ if (GetImageBuffer()) { |
+ sk_image = GetImageBuffer()->NewSkImageSnapshot(hint, reason); |
} else { |
sk_image = CreateTransparentSkImage(Size()); |
} |
@@ -1285,9 +1289,9 @@ PassRefPtr<Image> HTMLCanvasElement::GetSourceImageForCanvas( |
if (ExpensiveCanvasHeuristicParameters:: |
kDisableAccelerationToAvoidReadbacks && |
!RuntimeEnabledFeatures::canvas2dFixedRenderingModeEnabled() && |
- hint == kPreferNoAcceleration && HasImageBuffer() && |
- Buffer()->IsAccelerated()) { |
- Buffer()->DisableAcceleration(); |
+ hint == kPreferNoAcceleration && GetImageBuffer() && |
+ GetImageBuffer()->IsAccelerated()) { |
+ GetImageBuffer()->DisableAcceleration(); |
} |
RefPtr<Image> image = RenderingContext()->GetImage(hint, reason); |
if (image) { |