| 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 |