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

Side by Side Diff: third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp

Issue 2774903003: Fix the compositing of placeholder canvas backgrounds (Closed)
Patch Set: un-dupe function 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2009, 2010, 2011 Apple 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 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 112
113 static inline bool isAcceleratedCanvas(const LayoutObject& layoutObject) { 113 static inline bool isAcceleratedCanvas(const LayoutObject& layoutObject) {
114 if (layoutObject.isCanvas()) { 114 if (layoutObject.isCanvas()) {
115 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node()); 115 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node());
116 if (CanvasRenderingContext* context = canvas->renderingContext()) 116 if (CanvasRenderingContext* context = canvas->renderingContext())
117 return context->isAccelerated(); 117 return context->isAccelerated();
118 } 118 }
119 return false; 119 return false;
120 } 120 }
121 121
122 static inline bool isCanvasControlledByOffscreen( 122 static inline bool isPlaceholderCanvas(const LayoutObject& layoutObject) {
123 const LayoutObject& layoutObject) {
124 if (layoutObject.isCanvas()) { 123 if (layoutObject.isCanvas()) {
125 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node()); 124 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node());
126 if (canvas->surfaceLayerBridge()) 125 return canvas->surfaceLayerBridge();
127 return true;
128 } 126 }
129 return false; 127 return false;
130 } 128 }
131 129
132 static bool hasBoxDecorationsOrBackgroundImage(const ComputedStyle& style) { 130 static bool hasBoxDecorationsOrBackgroundImage(const ComputedStyle& style) {
133 return style.hasBoxDecorations() || style.hasBackgroundImage(); 131 return style.hasBoxDecorations() || style.hasBackgroundImage();
134 } 132 }
135 133
136 static bool contentLayerSupportsDirectBackgroundComposition( 134 static bool contentLayerSupportsDirectBackgroundComposition(
137 const LayoutObject& layoutObject) { 135 const LayoutObject& layoutObject) {
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 m_graphicsLayer->setContentsOpaque( 418 m_graphicsLayer->setContentsOpaque(
421 !Color(layer->backgroundColor()).hasAlpha()); 419 !Color(layer->backgroundColor()).hasAlpha());
422 } 420 }
423 } else { 421 } else {
424 m_graphicsLayer->setContentsOpaque(false); 422 m_graphicsLayer->setContentsOpaque(false);
425 } 423 }
426 } else if (m_backgroundLayer) { 424 } else if (m_backgroundLayer) {
427 m_graphicsLayer->setContentsOpaque(false); 425 m_graphicsLayer->setContentsOpaque(false);
428 m_backgroundLayer->setContentsOpaque( 426 m_backgroundLayer->setContentsOpaque(
429 m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds())); 427 m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds()));
428 } else if (isPlaceholderCanvas(layoutObject())) {
429 // TODO(crbug.com/705019): Contents could be opaque, but that cannot be
430 // determined from the main thread. Or can it?
431 m_graphicsLayer->setContentsOpaque(false);
430 } else { 432 } else {
431 // For non-root layers, background is painted by the scrolling contents 433 // For non-root layers, background is painted by the scrolling contents
432 // layer if all backgrounds are background attachment local, otherwise 434 // layer if all backgrounds are background attachment local, otherwise
433 // background is painted by the primary graphics layer. 435 // background is painted by the primary graphics layer.
434 if (hasScrollingLayer() && m_backgroundPaintsOntoScrollingContentsLayer) { 436 if (hasScrollingLayer() && m_backgroundPaintsOntoScrollingContentsLayer) {
435 // Backgrounds painted onto the foreground are clipped by the padding box 437 // Backgrounds painted onto the foreground are clipped by the padding box
436 // rect. 438 // rect.
437 // TODO(flackr): This should actually check the entire overflow rect 439 // TODO(flackr): This should actually check the entire overflow rect
438 // within the scrolling contents layer but since we currently only trigger 440 // within the scrolling contents layer but since we currently only trigger
439 // this for solid color backgrounds the answer will be the same. 441 // this for solid color backgrounds the answer will be the same.
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 layoutObject.node()->isFrameOwnerElement() && 749 layoutObject.node()->isFrameOwnerElement() &&
748 toHTMLFrameOwnerElement(layoutObject.node())->contentFrame()) { 750 toHTMLFrameOwnerElement(layoutObject.node())->contentFrame()) {
749 Frame* frame = toHTMLFrameOwnerElement(layoutObject.node())->contentFrame(); 751 Frame* frame = toHTMLFrameOwnerElement(layoutObject.node())->contentFrame();
750 if (frame->isRemoteFrame()) { 752 if (frame->isRemoteFrame()) {
751 WebLayer* layer = toRemoteFrame(frame)->webLayer(); 753 WebLayer* layer = toRemoteFrame(frame)->webLayer();
752 m_graphicsLayer->setContentsToPlatformLayer(layer); 754 m_graphicsLayer->setContentsToPlatformLayer(layer);
753 } 755 }
754 } else if (layoutObject.isVideo()) { 756 } else if (layoutObject.isVideo()) {
755 HTMLMediaElement* mediaElement = toHTMLMediaElement(layoutObject.node()); 757 HTMLMediaElement* mediaElement = toHTMLMediaElement(layoutObject.node());
756 m_graphicsLayer->setContentsToPlatformLayer(mediaElement->platformLayer()); 758 m_graphicsLayer->setContentsToPlatformLayer(mediaElement->platformLayer());
757 } else if (isCanvasControlledByOffscreen(layoutObject)) { 759 } else if (isPlaceholderCanvas(layoutObject)) {
758 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node()); 760 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node());
759 m_graphicsLayer->setContentsToPlatformLayer( 761 m_graphicsLayer->setContentsToPlatformLayer(
760 canvas->surfaceLayerBridge()->getWebLayer()); 762 canvas->surfaceLayerBridge()->getWebLayer());
761 layerConfigChanged = true; 763 layerConfigChanged = true;
762 } else if (isAcceleratedCanvas(layoutObject)) { 764 } else if (isAcceleratedCanvas(layoutObject)) {
763 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node()); 765 HTMLCanvasElement* canvas = toHTMLCanvasElement(layoutObject.node());
764 if (CanvasRenderingContext* context = canvas->renderingContext()) 766 if (CanvasRenderingContext* context = canvas->renderingContext())
765 m_graphicsLayer->setContentsToPlatformLayer(context->platformLayer()); 767 m_graphicsLayer->setContentsToPlatformLayer(context->platformLayer());
766 layerConfigChanged = true; 768 layerConfigChanged = true;
767 } 769 }
(...skipping 2730 matching lines...) Expand 10 before | Expand all | Expand 10 after
3498 } else if (graphicsLayer == m_decorationOutlineLayer.get()) { 3500 } else if (graphicsLayer == m_decorationOutlineLayer.get()) {
3499 name = "Decoration Layer"; 3501 name = "Decoration Layer";
3500 } else { 3502 } else {
3501 ASSERT_NOT_REACHED(); 3503 ASSERT_NOT_REACHED();
3502 } 3504 }
3503 3505
3504 return name; 3506 return name;
3505 } 3507 }
3506 3508
3507 } // namespace blink 3509 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698