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

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp

Issue 2615203002: Remove multicol special-cases from invalidation and the pre-paint tree walk (Closed)
Patch Set: Cleanup comment Created 3 years, 11 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 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/paint/PaintPropertyTreeBuilder.h" 5 #include "core/paint/PaintPropertyTreeBuilder.h"
6 6
7 #include "core/dom/DOMNodeIds.h" 7 #include "core/dom/DOMNodeIds.h"
8 #include "core/frame/FrameView.h" 8 #include "core/frame/FrameView.h"
9 #include "core/frame/LocalFrame.h" 9 #include "core/frame/LocalFrame.h"
10 #include "core/frame/Settings.h" 10 #include "core/frame/Settings.h"
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 return; 853 return;
854 } 854 }
855 } 855 }
856 856
857 if (object.needsPaintPropertyUpdate() || context.forceSubtreeUpdate) { 857 if (object.needsPaintPropertyUpdate() || context.forceSubtreeUpdate) {
858 if (auto* properties = object.getMutableForPainting().paintProperties()) 858 if (auto* properties = object.getMutableForPainting().paintProperties())
859 context.forceSubtreeUpdate |= properties->clearCssClipFixedPosition(); 859 context.forceSubtreeUpdate |= properties->clearCssClipFixedPosition();
860 } 860 }
861 } 861 }
862 862
863 // Override ContainingBlockContext based on the properties of a containing block
864 // that was previously walked in a subtree other than the current subtree being
865 // walked. Used for out-of-flow positioned descendants of multi-column spanner
866 // when the containing block is not in the normal tree walk order.
867 // For example:
868 // <div id="columns" style="columns: 2">
869 // <div id="relative" style="position: relative">
870 // <div id="spanner" style="column-span: all">
871 // <div id="absolute" style="position: absolute"></div>
872 // </div>
873 // </div>
874 // <div>
875 // The real containing block of "absolute" is "relative" which is not in the
876 // tree-walk order of "columns" -> spanner placeholder -> spanner -> absolute.
877 // Here we rebuild a ContainingBlockContext based on the properties of
878 // "relative" for "absolute".
879 static void overrideContainingBlockContextFromRealContainingBlock(
880 const LayoutBlock& containingBlock,
881 PaintPropertyTreeBuilderContext::ContainingBlockContext& context) {
882 const auto* properties =
883 containingBlock.paintProperties()->localBorderBoxProperties();
884 DCHECK(properties);
885
886 context.transform = properties->transform();
887 context.paintOffset = containingBlock.paintOffset();
888 context.shouldFlattenInheritedTransform =
889 context.transform && context.transform->flattensInheritedTransform();
890 context.renderingContextId =
891 context.transform ? context.transform->renderingContextId() : 0;
892 context.clip = properties->clip();
893 context.scroll = properties->scroll();
894 }
895
896 void PaintPropertyTreeBuilder::updateContextForBoxPosition( 863 void PaintPropertyTreeBuilder::updateContextForBoxPosition(
897 const LayoutObject& object, 864 const LayoutObject& object,
898 PaintPropertyTreeBuilderContext& context) { 865 PaintPropertyTreeBuilderContext& context) {
899 if (!object.isBoxModelObject()) 866 if (!object.isBoxModelObject())
900 return; 867 return;
901 868
902 const LayoutBoxModelObject& boxModelObject = toLayoutBoxModelObject(object); 869 const LayoutBoxModelObject& boxModelObject = toLayoutBoxModelObject(object);
903 870
904 if (boxModelObject.isFloating()) 871 if (boxModelObject.isFloating())
905 context.current.paintOffset = context.paintOffsetForFloat; 872 context.current.paintOffset = context.paintOffsetForFloat;
906 873
874 // Multicolumn spanners are painted starting at the multicolumn container (but
875 // still inherit properties in layout-tree order) so reset the paint offset.
876 if (boxModelObject.isColumnSpanAll())
877 context.current.paintOffset = boxModelObject.container()->paintOffset();
878
907 switch (object.styleRef().position()) { 879 switch (object.styleRef().position()) {
908 case StaticPosition: 880 case StaticPosition:
909 break; 881 break;
910 case RelativePosition: 882 case RelativePosition:
911 context.current.paintOffset += boxModelObject.offsetForInFlowPosition(); 883 context.current.paintOffset += boxModelObject.offsetForInFlowPosition();
912 break; 884 break;
913 case AbsolutePosition: { 885 case AbsolutePosition: {
914 if (context.isUnderMultiColumnSpanner) { 886 DCHECK(context.containerForAbsolutePosition ==
915 const LayoutObject* container = boxModelObject.container(); 887 boxModelObject.container());
916 if (container != context.containerForAbsolutePosition) { 888 context.current = context.absolutePosition;
917 // The container of the absolute-position is not in the normal tree-
918 // walk order.
919 context.containerForAbsolutePosition =
920 toLayoutBoxModelObject(container);
921 // The container is never a LayoutInline. In the example above
922 // overrideContainingBlockContextFromRealContainingBlock(), if we
923 // change the container to an inline, there will be an anonymous
924 // blocks created because the spanner is always a block.
925 overrideContainingBlockContextFromRealContainingBlock(
926 toLayoutBlock(*container), context.current);
927 }
928 } else {
929 DCHECK(context.containerForAbsolutePosition ==
930 boxModelObject.container());
931 context.current = context.absolutePosition;
932 }
933 889
934 // Absolutely positioned content in an inline should be positioned 890 // Absolutely positioned content in an inline should be positioned
935 // relative to the inline. 891 // relative to the inline.
936 const LayoutObject* container = context.containerForAbsolutePosition; 892 const LayoutObject* container = context.containerForAbsolutePosition;
937 if (container && container->isInFlowPositioned() && 893 if (container && container->isInFlowPositioned() &&
938 container->isLayoutInline()) { 894 container->isLayoutInline()) {
939 DCHECK(object.isBox()); 895 DCHECK(object.isBox());
940 context.current.paintOffset += 896 context.current.paintOffset +=
941 toLayoutInline(container)->offsetForInFlowPositionedInline( 897 toLayoutInline(container)->offsetForInFlowPositionedInline(
942 toLayoutBox(object)); 898 toLayoutBox(object));
943 } 899 }
944 break; 900 break;
945 } 901 }
946 case StickyPosition: 902 case StickyPosition:
947 context.current.paintOffset += boxModelObject.offsetForInFlowPosition(); 903 context.current.paintOffset += boxModelObject.offsetForInFlowPosition();
948 break; 904 break;
949 case FixedPosition: 905 case FixedPosition:
950 if (context.isUnderMultiColumnSpanner) { 906 context.current = context.fixedPosition;
951 // The container of the fixed-position object may or may not be in the
952 // normal tree-walk order.
953 overrideContainingBlockContextFromRealContainingBlock(
954 toLayoutBlock(*boxModelObject.container()), context.current);
955 } else {
956 context.current = context.fixedPosition;
957 }
958 break; 907 break;
959 default: 908 default:
960 ASSERT_NOT_REACHED(); 909 ASSERT_NOT_REACHED();
961 } 910 }
962 911
963 if (boxModelObject.isBox()) { 912 if (boxModelObject.isBox()) {
964 // TODO(pdr): Several calls in this function walk back up the tree to 913 // TODO(pdr): Several calls in this function walk back up the tree to
965 // calculate containers (e.g., physicalLocation, offsetForInFlowPosition*). 914 // calculate containers (e.g., physicalLocation, offsetForInFlowPosition*).
966 // The containing block and other containers can be stored on 915 // The containing block and other containers can be stored on
967 // PaintPropertyTreeBuilderContext instead of recomputing them. 916 // PaintPropertyTreeBuilderContext instead of recomputing them.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 updateOverflowClip(object, context); 966 updateOverflowClip(object, context);
1018 updatePerspective(object, context); 967 updatePerspective(object, context);
1019 updateSvgLocalToBorderBoxTransform(object, context); 968 updateSvgLocalToBorderBoxTransform(object, context);
1020 updateScrollAndScrollTranslation(object, context); 969 updateScrollAndScrollTranslation(object, context);
1021 updateOutOfFlowContext(object, context); 970 updateOutOfFlowContext(object, context);
1022 971
1023 context.forceSubtreeUpdate |= object.subtreeNeedsPaintPropertyUpdate(); 972 context.forceSubtreeUpdate |= object.subtreeNeedsPaintPropertyUpdate();
1024 } 973 }
1025 974
1026 } // namespace blink 975 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698