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

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

Issue 775753002: Remove RenderFlowThread::offsetFromLogicalTopOfFirstRegion(). (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: code review Created 6 years 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
« no previous file with comments | « Source/core/rendering/RenderFlowThread.h ('k') | Source/core/rendering/RenderView.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved. 2 * Copyright (C) 2011 Adobe Systems Incorporated. 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 * 7 *
8 * 1. Redistributions of source code must retain the above 8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following 9 * copyright notice, this list of conditions and the following
10 * disclaimer. 10 * disclaimer.
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 LayoutRect fragmentRect(layerBoundingBox); 213 LayoutRect fragmentRect(layerBoundingBox);
214 fragmentRect.intersect(fragment.paginationClip); 214 fragmentRect.intersect(fragment.paginationClip);
215 fragmentRect.moveBy(fragment.paginationOffset); 215 fragmentRect.moveBy(fragment.paginationOffset);
216 result.unite(fragmentRect); 216 result.unite(fragmentRect);
217 } 217 }
218 } 218 }
219 219
220 return result; 220 return result;
221 } 221 }
222 222
223 bool RenderFlowThread::cachedOffsetFromLogicalTopOfFirstRegion(const RenderBox* box, LayoutUnit& result) const
224 {
225 RenderBoxToOffsetMap::const_iterator offsetIterator = m_boxesToOffsetMap.fin d(box);
226 if (offsetIterator == m_boxesToOffsetMap.end())
227 return false;
228
229 result = offsetIterator->value;
230 return true;
231 }
232
233 void RenderFlowThread::setOffsetFromLogicalTopOfFirstRegion(const RenderBox* box , LayoutUnit offset)
234 {
235 m_boxesToOffsetMap.set(box, offset);
236 }
237
238 void RenderFlowThread::clearOffsetFromLogicalTopOfFirstRegion(const RenderBox* b ox)
239 {
240 ASSERT(m_boxesToOffsetMap.contains(box));
241 m_boxesToOffsetMap.remove(box);
242 }
243
244 const RenderBox* RenderFlowThread::currentStatePusherRenderBox() const
245 {
246 const RenderObject* currentObject = m_statePusherObjectsStack.isEmpty() ? 0 : m_statePusherObjectsStack.last();
247 if (currentObject && currentObject->isBox())
248 return toRenderBox(currentObject);
249
250 return 0;
251 }
252
253 void RenderFlowThread::pushFlowThreadLayoutState(const RenderObject& object)
254 {
255 if (const RenderBox* currentBoxDescendant = currentStatePusherRenderBox()) {
256 LayoutState* layoutState = currentBoxDescendant->view()->layoutState();
257 if (layoutState && layoutState->isPaginated()) {
258 ASSERT(layoutState->renderer() == currentBoxDescendant);
259 LayoutSize offsetDelta = layoutState->layoutOffset() - layoutState-> pageOffset();
260 setOffsetFromLogicalTopOfFirstRegion(currentBoxDescendant, currentBo xDescendant->isHorizontalWritingMode() ? offsetDelta.height() : offsetDelta.widt h());
261 }
262 }
263
264 ASSERT(!m_statePusherObjectsStack.contains(&object));
265 m_statePusherObjectsStack.add(&object);
266 }
267
268 void RenderFlowThread::popFlowThreadLayoutState()
269 {
270 m_statePusherObjectsStack.removeLast();
271
272 if (const RenderBox* currentBoxDescendant = currentStatePusherRenderBox()) {
273 LayoutState* layoutState = currentBoxDescendant->view()->layoutState();
274 if (layoutState && layoutState->isPaginated())
275 clearOffsetFromLogicalTopOfFirstRegion(currentBoxDescendant);
276 }
277 }
278
279 LayoutUnit RenderFlowThread::offsetFromLogicalTopOfFirstRegion(const RenderBlock * currentBlock) const
280 {
281 // First check if we cached the offset for the block if it's an ancestor con taining block of the box
282 // being currently laid out.
283 LayoutUnit offset;
284 if (cachedOffsetFromLogicalTopOfFirstRegion(currentBlock, offset))
285 return offset;
286
287 // If it's the current box being laid out, use the layout state.
288 const RenderBox* currentBoxDescendant = currentStatePusherRenderBox();
289 if (currentBlock == currentBoxDescendant) {
290 LayoutState* layoutState = view()->layoutState();
291 ASSERT(layoutState->renderer() == currentBlock);
292 ASSERT(layoutState && layoutState->isPaginated());
293 LayoutSize offsetDelta = layoutState->layoutOffset() - layoutState->page Offset();
294 return currentBoxDescendant->isHorizontalWritingMode() ? offsetDelta.hei ght() : offsetDelta.width();
295 }
296
297 // As a last resort, take the slow path.
298 LayoutRect blockRect(0, 0, currentBlock->width(), currentBlock->height());
299 while (currentBlock && !currentBlock->isRenderFlowThread()) {
300 RenderBlock* containerBlock = currentBlock->containingBlock();
301 ASSERT(containerBlock);
302 if (!containerBlock)
303 return 0;
304 LayoutPoint currentBlockLocation = currentBlock->location();
305
306 if (containerBlock->style()->writingMode() != currentBlock->style()->wri tingMode()) {
307 // We have to put the block rect in container coordinates
308 // and we have to take into account both the container and current b lock flipping modes
309 if (containerBlock->style()->isFlippedBlocksWritingMode()) {
310 if (containerBlock->isHorizontalWritingMode())
311 blockRect.setY(currentBlock->height() - blockRect.maxY());
312 else
313 blockRect.setX(currentBlock->width() - blockRect.maxX());
314 }
315 currentBlock->flipForWritingMode(blockRect);
316 }
317 blockRect.moveBy(currentBlockLocation);
318 currentBlock = containerBlock;
319 }
320
321 return currentBlock->isHorizontalWritingMode() ? blockRect.y() : blockRect.x ();
322 }
323
324 void RenderFlowThread::RegionSearchAdapter::collectIfNeeded(const MultiColumnSet Interval& interval) 223 void RenderFlowThread::RegionSearchAdapter::collectIfNeeded(const MultiColumnSet Interval& interval)
325 { 224 {
326 if (m_result) 225 if (m_result)
327 return; 226 return;
328 if (interval.low() <= m_offset && interval.high() > m_offset) 227 if (interval.low() <= m_offset && interval.high() > m_offset)
329 m_result = interval.data(); 228 m_result = interval.data();
330 } 229 }
331 230
332 } // namespace blink 231 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderFlowThread.h ('k') | Source/core/rendering/RenderView.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698