OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
5 * | 5 * |
6 * Other contributors: | 6 * Other contributors: |
7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 RenderLayer::~RenderLayer() | 100 RenderLayer::~RenderLayer() |
101 { | 101 { |
102 removeFilterInfoIfNeeded(); | 102 removeFilterInfoIfNeeded(); |
103 } | 103 } |
104 | 104 |
105 String RenderLayer::debugName() const | 105 String RenderLayer::debugName() const |
106 { | 106 { |
107 return renderer()->debugName(); | 107 return renderer()->debugName(); |
108 } | 108 } |
109 | 109 |
110 bool RenderLayer::paintsWithFilters() const | |
111 { | |
112 // FIXME(sky): Remove | |
113 return renderer()->hasFilter(); | |
114 } | |
115 | |
116 bool RenderLayer::requiresFullLayerImageForFilters() const | |
117 { | |
118 if (!paintsWithFilters()) | |
119 return false; | |
120 FilterEffectRenderer* filter = filterRenderer(); | |
121 return filter ? filter->hasFilterThatMovesPixels() : false; | |
122 } | |
123 | |
124 LayoutSize RenderLayer::subpixelAccumulation() const | 110 LayoutSize RenderLayer::subpixelAccumulation() const |
125 { | 111 { |
126 return m_subpixelAccumulation; | 112 return m_subpixelAccumulation; |
127 } | 113 } |
128 | 114 |
129 void RenderLayer::setSubpixelAccumulation(const LayoutSize& size) | 115 void RenderLayer::setSubpixelAccumulation(const LayoutSize& size) |
130 { | 116 { |
131 m_subpixelAccumulation = size; | 117 m_subpixelAccumulation = size; |
132 } | 118 } |
133 | 119 |
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 convertToLayerCoords(ancestorLayer, delta); | 709 convertToLayerCoords(ancestorLayer, delta); |
724 result.moveBy(delta); | 710 result.moveBy(delta); |
725 return result; | 711 return result; |
726 } | 712 } |
727 | 713 |
728 bool RenderLayer::shouldBeSelfPaintingLayer() const | 714 bool RenderLayer::shouldBeSelfPaintingLayer() const |
729 { | 715 { |
730 return m_layerType == NormalLayer; | 716 return m_layerType == NormalLayer; |
731 } | 717 } |
732 | 718 |
733 bool RenderLayer::hasNonEmptyChildRenderers() const | |
734 { | |
735 // Some HTML can cause whitespace text nodes to have renderers, like: | |
736 // <div> | |
737 // <img src=...> | |
738 // </div> | |
739 // so test for 0x0 RenderTexts here | |
740 for (RenderObject* child = renderer()->slowFirstChild(); child; child = chil
d->nextSibling()) { | |
741 if (!child->hasLayer()) { | |
742 if (child->isRenderInline() || !child->isBox()) | |
743 return true; | |
744 | |
745 if (toRenderBox(child)->width() > 0 || toRenderBox(child)->height()
> 0) | |
746 return true; | |
747 } | |
748 } | |
749 return false; | |
750 } | |
751 | |
752 bool RenderLayer::hasBoxDecorationsOrBackground() const | 719 bool RenderLayer::hasBoxDecorationsOrBackground() const |
753 { | 720 { |
754 return renderer()->style()->hasBoxDecorations() || renderer()->style()->hasB
ackground(); | 721 return renderer()->style()->hasBoxDecorations() || renderer()->style()->hasB
ackground(); |
755 } | 722 } |
756 | 723 |
757 bool RenderLayer::hasVisibleBoxDecorations() const | 724 bool RenderLayer::hasVisibleBoxDecorations() const |
758 { | 725 { |
759 return hasBoxDecorationsOrBackground(); | 726 return hasBoxDecorationsOrBackground(); |
760 } | 727 } |
761 | 728 |
762 bool RenderLayer::isVisuallyNonEmpty() const | |
763 { | |
764 if (hasNonEmptyChildRenderers()) | |
765 return true; | |
766 | |
767 if (renderer()->isReplaced()) | |
768 return true; | |
769 | |
770 if (hasVisibleBoxDecorations()) | |
771 return true; | |
772 | |
773 return false; | |
774 } | |
775 | |
776 void RenderLayer::updateFilters(const RenderStyle* oldStyle, const RenderStyle*
newStyle) | 729 void RenderLayer::updateFilters(const RenderStyle* oldStyle, const RenderStyle*
newStyle) |
777 { | 730 { |
778 if (!newStyle->hasFilter() && (!oldStyle || !oldStyle->hasFilter())) | 731 if (!newStyle->hasFilter() && (!oldStyle || !oldStyle->hasFilter())) |
779 return; | 732 return; |
780 | 733 |
781 updateOrRemoveFilterClients(); | |
782 updateOrRemoveFilterEffectRenderer(); | |
783 } | |
784 | |
785 void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle
) | |
786 { | |
787 m_stackingNode->updateIsNormalFlowOnly(); | |
788 m_stackingNode->updateStackingNodesAfterStyleChange(oldStyle); | |
789 | |
790 // Overlay scrollbars can make this layer self-painting so we need | |
791 // to recompute the bit once scrollbars have been updated. | |
792 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer(); | |
793 | |
794 updateTransform(oldStyle, renderer()->style()); | |
795 updateFilters(oldStyle, renderer()->style()); | |
796 } | |
797 | |
798 FilterOperations RenderLayer::computeFilterOperations(const RenderStyle* style) | |
799 { | |
800 return style->filter(); | |
801 } | |
802 | |
803 void RenderLayer::updateOrRemoveFilterClients() | |
804 { | |
805 if (!hasFilter()) { | 734 if (!hasFilter()) { |
806 removeFilterInfoIfNeeded(); | 735 removeFilterInfoIfNeeded(); |
807 return; | 736 return; |
808 } | 737 } |
809 | 738 |
810 if (renderer()->style()->filter().hasReferenceFilter()) | 739 if (renderer()->style()->filter().hasReferenceFilter()) |
811 ensureFilterInfo()->updateReferenceFilterClients(renderer()->style()->fi
lter()); | 740 ensureFilterInfo()->updateReferenceFilterClients(renderer()->style()->fi
lter()); |
812 else if (hasFilterInfo()) | 741 else if (hasFilterInfo()) |
813 filterInfo()->removeReferenceFilterClients(); | 742 filterInfo()->removeReferenceFilterClients(); |
814 } | |
815 | 743 |
816 void RenderLayer::updateOrRemoveFilterEffectRenderer() | |
817 { | |
818 // FilterEffectRenderer is only used to render the filters in software mode, | 744 // FilterEffectRenderer is only used to render the filters in software mode, |
819 // so we always need to run updateOrRemoveFilterEffectRenderer after the com
posited | 745 // so we always need to run updateOrRemoveFilterEffectRenderer after the com
posited |
820 // mode might have changed for this layer. | 746 // mode might have changed for this layer. |
821 if (!paintsWithFilters()) { | 747 if (!renderer()->hasFilter()) { |
822 // Don't delete the whole filter info here, because we might use it | 748 // Don't delete the whole filter info here, because we might use it |
823 // for loading CSS shader files. | 749 // for loading CSS shader files. |
824 if (RenderLayerFilterInfo* filterInfo = this->filterInfo()) | 750 if (RenderLayerFilterInfo* filterInfo = this->filterInfo()) |
825 filterInfo->setRenderer(nullptr); | 751 filterInfo->setRenderer(nullptr); |
826 | 752 |
827 return; | 753 return; |
828 } | 754 } |
829 | 755 |
830 RenderLayerFilterInfo* filterInfo = ensureFilterInfo(); | 756 RenderLayerFilterInfo* filterInfo = ensureFilterInfo(); |
831 if (!filterInfo->renderer()) { | 757 if (!filterInfo->renderer()) { |
832 RefPtr<FilterEffectRenderer> filterRenderer = FilterEffectRenderer::crea
te(); | 758 RefPtr<FilterEffectRenderer> filterRenderer = FilterEffectRenderer::crea
te(); |
833 filterInfo->setRenderer(filterRenderer.release()); | 759 filterInfo->setRenderer(filterRenderer.release()); |
834 | 760 |
835 // We can optimize away code paths in other places if we know that there
are no software filters. | 761 // We can optimize away code paths in other places if we know that there
are no software filters. |
836 renderer()->document().view()->setHasSoftwareFilters(true); | 762 renderer()->document().view()->setHasSoftwareFilters(true); |
837 } | 763 } |
838 | 764 |
839 // If the filter fails to build, remove it from the layer. It will still att
empt to | 765 // If the filter fails to build, remove it from the layer. It will still att
empt to |
840 // go through regular processing (e.g. compositing), but never apply anythin
g. | 766 // go through regular processing (e.g. compositing), but never apply anythin
g. |
841 if (!filterInfo->renderer()->build(renderer(), computeFilterOperations(rende
rer()->style()))) | 767 if (!filterInfo->renderer()->build(renderer(), renderer()->style()->filter()
)) |
842 filterInfo->setRenderer(nullptr); | 768 filterInfo->setRenderer(nullptr); |
843 } | 769 } |
844 | 770 |
| 771 void RenderLayer::styleChanged(StyleDifference diff, const RenderStyle* oldStyle
) |
| 772 { |
| 773 m_stackingNode->updateIsNormalFlowOnly(); |
| 774 m_stackingNode->updateStackingNodesAfterStyleChange(oldStyle); |
| 775 |
| 776 // Overlay scrollbars can make this layer self-painting so we need |
| 777 // to recompute the bit once scrollbars have been updated. |
| 778 m_isSelfPaintingLayer = shouldBeSelfPaintingLayer(); |
| 779 |
| 780 updateTransform(oldStyle, renderer()->style()); |
| 781 updateFilters(oldStyle, renderer()->style()); |
| 782 } |
| 783 |
845 } // namespace blink | 784 } // namespace blink |
OLD | NEW |