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

Unified Diff: third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp

Issue 2849463005: Refactor ImageBuffer to make OffscreenCanvas match HTMLCanvasElement (Closed)
Patch Set: x Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
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) {
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLCanvasElement.h ('k') | third_party/WebKit/Source/core/html/HTMLVideoElement.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698