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

Side by Side Diff: Source/core/rendering/RenderMultiColumnFlowThread.cpp

Issue 856383002: [New Multicolumn] Add RenderMultiColumnFlowThread::findSetRendering(). (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Final code review. Created 5 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 /* 1 /*
2 * Copyright (C) 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2012 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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 66
67 RenderMultiColumnSet* RenderMultiColumnFlowThread::lastMultiColumnSet() const 67 RenderMultiColumnSet* RenderMultiColumnFlowThread::lastMultiColumnSet() const
68 { 68 {
69 for (RenderObject* sibling = multiColumnBlockFlow()->lastChild(); sibling; s ibling = sibling->previousSibling()) { 69 for (RenderObject* sibling = multiColumnBlockFlow()->lastChild(); sibling; s ibling = sibling->previousSibling()) {
70 if (sibling->isRenderMultiColumnSet()) 70 if (sibling->isRenderMultiColumnSet())
71 return toRenderMultiColumnSet(sibling); 71 return toRenderMultiColumnSet(sibling);
72 } 72 }
73 return 0; 73 return 0;
74 } 74 }
75 75
76 static RenderObject* firstRendererInSet(RenderMultiColumnSet* multicolSet)
77 {
78 RenderBox* sibling = multicolSet->previousSiblingMultiColumnBox();
79 if (!sibling)
80 return multicolSet->flowThread()->firstChild();
81 // Adjacent column content sets should not occur. We would have no way of fi guring out what each
82 // of them contains then.
83 ASSERT(sibling->isRenderMultiColumnSpannerPlaceholder());
84 return toRenderMultiColumnSpannerPlaceholder(sibling)->rendererInFlowThread( )->nextInPreOrderAfterChildren(multicolSet->flowThread());
85 }
86
87 static RenderObject* lastRendererInSet(RenderMultiColumnSet* multicolSet)
88 {
89 RenderBox* sibling = multicolSet->nextSiblingMultiColumnBox();
90 if (!sibling)
91 return 0; // By right we should return lastLeafChild() here, but the cal ler doesn't care, so just return 0.
92 // Adjacent column content sets should not occur. We would have no way of fi guring out what each
93 // of them contains then.
94 ASSERT(sibling->isRenderMultiColumnSpannerPlaceholder());
95 return toRenderMultiColumnSpannerPlaceholder(sibling)->rendererInFlowThread( )->previousInPreOrder(multicolSet->flowThread());
96 }
97
98 RenderMultiColumnSet* RenderMultiColumnFlowThread::findSetRendering(RenderObject * renderer) const
99 {
100 ASSERT(!containingColumnSpannerPlaceholder(renderer)); // should not be used for spanners or content inside them.
101 ASSERT(renderer != this);
102 ASSERT(renderer->isDescendantOf(this));
103 RenderMultiColumnSet* multicolSet = firstMultiColumnSet();
104 if (!multicolSet)
105 return 0;
106 if (!multicolSet->nextSiblingMultiColumnSet())
107 return multicolSet;
108
109 // This is potentially SLOW! But luckily very uncommon. You would have to dy namically insert a
110 // spanner into the middle of column contents to need this.
111 for (; multicolSet; multicolSet = multicolSet->nextSiblingMultiColumnSet()) {
112 RenderObject* firstRenderer = firstRendererInSet(multicolSet);
113 RenderObject* lastRenderer = lastRendererInSet(multicolSet);
114 ASSERT(firstRenderer);
115
116 for (RenderObject* walker = firstRenderer; walker; walker = walker->next InPreOrder(this)) {
117 if (walker == renderer)
118 return multicolSet;
119 if (walker == lastRenderer)
120 break;
121 }
122 }
123
124 return 0;
125 }
126
76 RenderMultiColumnSpannerPlaceholder* RenderMultiColumnFlowThread::containingColu mnSpannerPlaceholder(const RenderObject* descendant) const 127 RenderMultiColumnSpannerPlaceholder* RenderMultiColumnFlowThread::containingColu mnSpannerPlaceholder(const RenderObject* descendant) const
77 { 128 {
78 ASSERT(descendant->isDescendantOf(this)); 129 ASSERT(descendant->isDescendantOf(this));
79 130
80 // Before we spend time on searching the ancestry, see if there's a quick wa y to determine 131 // Before we spend time on searching the ancestry, see if there's a quick wa y to determine
81 // whether there might be any spanners at all. 132 // whether there might be any spanners at all.
82 RenderBox* firstBox = firstMultiColumnBox(); 133 RenderBox* firstBox = firstMultiColumnBox();
83 if (!firstBox || (firstBox == lastMultiColumnBox() && firstBox->isRenderMult iColumnSet())) 134 if (!firstBox || (firstBox == lastMultiColumnBox() && firstBox->isRenderMult iColumnSet()))
84 return 0; 135 return 0;
85 136
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 } 547 }
497 548
498 bool RenderMultiColumnFlowThread::isPageLogicalHeightKnown() const 549 bool RenderMultiColumnFlowThread::isPageLogicalHeightKnown() const
499 { 550 {
500 if (RenderMultiColumnSet* columnSet = lastMultiColumnSet()) 551 if (RenderMultiColumnSet* columnSet = lastMultiColumnSet())
501 return columnSet->pageLogicalHeight(); 552 return columnSet->pageLogicalHeight();
502 return false; 553 return false;
503 } 554 }
504 555
505 } 556 }
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderMultiColumnFlowThread.h ('k') | Source/core/rendering/RenderMultiColumnFlowThreadTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698