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

Side by Side Diff: sky/engine/core/rendering/line/BreakingContextInlineHeaders.h

Issue 944073006: Remove the concept of staticly positioned absolutes. (Closed) Base URL: git@github.com:domokit/mojo.git@position
Patch Set: Created 5 years, 10 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) 2000 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved. 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved.
4 * Copyright (C) 2010 Google Inc. All rights reserved. 4 * Copyright (C) 2010 Google Inc. All rights reserved.
5 * Copyright (C) 2013 Adobe Systems Incorporated. 5 * Copyright (C) 2013 Adobe Systems Incorporated.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 void commitAndUpdateLineBreakIfNeeded(); 92 void commitAndUpdateLineBreakIfNeeded();
93 InlineIterator handleEndOfLine(); 93 InlineIterator handleEndOfLine();
94 94
95 void clearLineBreakIfFitsOnLine() 95 void clearLineBreakIfFitsOnLine()
96 { 96 {
97 if (m_width.fitsOnLine() || m_lastWS == NOWRAP) 97 if (m_width.fitsOnLine() || m_lastWS == NOWRAP)
98 m_lineBreak.clear(); 98 m_lineBreak.clear();
99 } 99 }
100 100
101 private: 101 private:
102 void skipTrailingWhitespace(InlineIterator&, const LineInfo&);
103
104 InlineBidiResolver& m_resolver; 102 InlineBidiResolver& m_resolver;
105 103
106 InlineIterator m_current; 104 InlineIterator m_current;
107 InlineIterator m_lineBreak; 105 InlineIterator m_lineBreak;
108 InlineIterator m_startOfIgnoredSpaces; 106 InlineIterator m_startOfIgnoredSpaces;
109 107
110 RenderBlockFlow* m_block; 108 RenderBlockFlow* m_block;
111 RenderObject* m_lastObject; 109 RenderObject* m_lastObject;
112 RenderObject* m_nextObject; 110 RenderObject* m_nextObject;
113 111
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 return false; 176 return false;
179 177
180 if (!shouldCollapseWhiteSpace(it.object()->style(), lineInfo, whitespacePosi tion)) 178 if (!shouldCollapseWhiteSpace(it.object()->style(), lineInfo, whitespacePosi tion))
181 return true; 179 return true;
182 180
183 UChar current = it.current(); 181 UChar current = it.current();
184 bool notJustWhitespace = current != ' ' && current != '\t' && current != sof tHyphen && (current != '\n' || it.object()->preservesNewline()); 182 bool notJustWhitespace = current != ' ' && current != '\t' && current != sof tHyphen && (current != '\n' || it.object()->preservesNewline());
185 return notJustWhitespace || isEmptyInline(it.object()); 183 return notJustWhitespace || isEmptyInline(it.object());
186 } 184 }
187 185
188 inline void setStaticPositions(RenderBlockFlow* block, RenderBox* child)
189 {
190 ASSERT(child->isOutOfFlowPositioned());
191 // FIXME: The math here is actually not really right. It's a best-guess appr oximation that
192 // will work for the common cases
193 RenderObject* containerBlock = child->container();
194 LayoutUnit blockHeight = block->logicalHeight();
195 if (containerBlock->isRenderInline()) {
196 // A relative positioned inline encloses us. In this case, we also have to determine our
197 // position as though we were an inline. Set |staticInlinePosition| and |staticBlockPosition| on the relative positioned
198 // inline so that we can obtain the value later.
199 toRenderInline(containerBlock)->layer()->setStaticInlinePosition(block-> startAlignedOffsetForLine(false));
200 toRenderInline(containerBlock)->layer()->setStaticBlockPosition(blockHei ght);
201 }
202 block->updateStaticInlinePositionForChild(child);
203 child->layer()->setStaticBlockPosition(blockHeight);
204 }
205
206 // FIXME: The entire concept of the skipTrailingWhitespace function is flawed, s ince we really need to be building
207 // line boxes even for containers that may ultimately collapse away. Otherwise w e'll never get positioned
208 // elements quite right. In other words, we need to build this function's work i nto the normal line
209 // object iteration process.
210 // NB. this function will insert any floating elements that would otherwise
211 // be skipped but it will not position them.
212 inline void BreakingContext::skipTrailingWhitespace(InlineIterator& iterator, co nst LineInfo& lineInfo)
213 {
214 while (!iterator.atEnd() && !requiresLineBox(iterator, lineInfo, TrailingWhi tespace)) {
215 RenderObject* object = iterator.object();
216 if (object->isOutOfFlowPositioned())
217 setStaticPositions(m_block, toRenderBox(object));
218 iterator.increment();
219 }
220 }
221
222 inline void BreakingContext::initializeForCurrentObject() 186 inline void BreakingContext::initializeForCurrentObject()
223 { 187 {
224 m_currentStyle = m_current.object()->style(); 188 m_currentStyle = m_current.object()->style();
225 m_nextObject = bidiNextSkippingEmptyInlines(m_block, m_current.object()); 189 m_nextObject = bidiNextSkippingEmptyInlines(m_block, m_current.object());
226 if (m_nextObject && m_nextObject->parent() && !m_nextObject->parent()->isDes cendantOf(m_current.object()->parent())) 190 if (m_nextObject && m_nextObject->parent() && !m_nextObject->parent()->isDes cendantOf(m_current.object()->parent()))
227 m_includeEndWidth = true; 191 m_includeEndWidth = true;
228 192
229 m_currWS = m_current.object()->isReplaced() ? m_current.object()->parent()-> style()->whiteSpace() : m_currentStyle->whiteSpace(); 193 m_currWS = m_current.object()->isReplaced() ? m_current.object()->parent()-> style()->whiteSpace() : m_currentStyle->whiteSpace();
230 m_lastWS = m_lastObject->isReplaced() ? m_lastObject->parent()->style()->whi teSpace() : m_lastObject->style()->whiteSpace(); 194 m_lastWS = m_lastObject->isReplaced() ? m_lastObject->parent()->style()->whi teSpace() : m_lastObject->style()->whiteSpace();
231 195
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 parent = child->parent(); 268 parent = child->parent();
305 } 269 }
306 return extraWidth; 270 return extraWidth;
307 } 271 }
308 272
309 inline void BreakingContext::handleOutOfFlowPositioned(Vector<RenderBox*>& posit ionedObjects) 273 inline void BreakingContext::handleOutOfFlowPositioned(Vector<RenderBox*>& posit ionedObjects)
310 { 274 {
311 // If our original display wasn't an inline type, then we can 275 // If our original display wasn't an inline type, then we can
312 // go ahead and determine our static inline position now. 276 // go ahead and determine our static inline position now.
313 RenderBox* box = toRenderBox(m_current.object()); 277 RenderBox* box = toRenderBox(m_current.object());
314 bool isInlineType = box->style()->isOriginalDisplayInlineType();
315 if (!isInlineType) {
316 m_block->setStaticInlinePositionForChild(box, m_block->startOffsetForCon tent());
317 } else {
318 // If our original display was an INLINE type, then we can go ahead
319 // and determine our static y position now.
320 box->layer()->setStaticBlockPosition(m_block->logicalHeight());
321 }
322 278
323 // If we're ignoring spaces, we have to stop and include this object and 279 // If we're ignoring spaces, we have to stop and include this object and
324 // then start ignoring spaces again. 280 // then start ignoring spaces again.
325 if (isInlineType || box->container()->isRenderInline()) { 281 if (box->style()->isOriginalDisplayInlineType() || box->container()->isRende rInline()) {
326 if (m_ignoringSpaces) 282 if (m_ignoringSpaces)
327 m_lineMidpointState.ensureLineBoxInsideIgnoredSpaces(box); 283 m_lineMidpointState.ensureLineBoxInsideIgnoredSpaces(box);
328 m_trailingObjects.appendObjectIfNeeded(box); 284 m_trailingObjects.appendObjectIfNeeded(box);
329 } else { 285 } else {
330 positionedObjects.append(box); 286 positionedObjects.append(box);
331 } 287 }
332 m_width.addUncommittedWidth(inlineLogicalWidth(box).toFloat()); 288 m_width.addUncommittedWidth(inlineLogicalWidth(box).toFloat());
333 // Reset prior line break context characters. 289 // Reset prior line break context characters.
334 m_renderTextInfo.m_lineBreakIterator.resetPriorContext(); 290 m_renderTextInfo.m_lineBreakIterator.resetPriorContext();
335 } 291 }
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 540
585 if (m_autoWrap || breakWords) { 541 if (m_autoWrap || breakWords) {
586 // If we break only after white-space, consider the current char acter 542 // If we break only after white-space, consider the current char acter
587 // as candidate width for this line. 543 // as candidate width for this line.
588 bool lineWasTooWide = false; 544 bool lineWasTooWide = false;
589 if (m_width.fitsOnLine() && m_currentCharacterIsSpace && m_curre ntStyle->breakOnlyAfterWhiteSpace() && !midWordBreak) { 545 if (m_width.fitsOnLine() && m_currentCharacterIsSpace && m_curre ntStyle->breakOnlyAfterWhiteSpace() && !midWordBreak) {
590 float charWidth = textWidth(renderText, m_current.offset(), 1, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasur ement.fallbackFonts) + (applyWordSpacing ? wordSpacing : 0); 546 float charWidth = textWidth(renderText, m_current.offset(), 1, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpace, &wordMeasur ement.fallbackFonts) + (applyWordSpacing ? wordSpacing : 0);
591 // Check if line is too big even without the extra space 547 // Check if line is too big even without the extra space
592 // at the end of the line. If it is not, do nothing. 548 // at the end of the line. If it is not, do nothing.
593 // If the line needs the extra whitespace to be too long, 549 // If the line needs the extra whitespace to be too long,
594 // then move the line break to the space and skip all 550 // then move the line break to the space.
595 // additional whitespace.
596 if (!m_width.fitsOnLine(charWidth)) { 551 if (!m_width.fitsOnLine(charWidth)) {
597 lineWasTooWide = true; 552 lineWasTooWide = true;
598 m_lineBreak.moveTo(m_current.object(), m_current.offset( ), m_current.nextBreakablePosition()); 553 m_lineBreak.moveTo(m_current.object(), m_current.offset( ), m_current.nextBreakablePosition());
599 skipTrailingWhitespace(m_lineBreak, m_lineInfo);
600 } 554 }
601 } 555 }
602 if (lineWasTooWide || !m_width.fitsOnLine()) { 556 if (lineWasTooWide || !m_width.fitsOnLine()) {
603 if (m_lineBreak.atTextParagraphSeparator()) { 557 if (m_lineBreak.atTextParagraphSeparator()) {
604 if (!stoppedIgnoringSpaces && m_current.offset() > 0) 558 if (!stoppedIgnoringSpaces && m_current.offset() > 0)
605 m_lineMidpointState.ensureCharacterGetsLineBox(m_cur rent); 559 m_lineMidpointState.ensureCharacterGetsLineBox(m_cur rent);
606 m_lineBreak.increment(); 560 m_lineBreak.increment();
607 m_lineInfo.setPreviousLineBrokeCleanly(true); 561 m_lineInfo.setPreviousLineBrokeCleanly(true);
608 wordMeasurement.endOffset = m_lineBreak.offset(); 562 wordMeasurement.endOffset = m_lineBreak.offset();
609 } 563 }
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 761
808 if (style->textIndentType() == TextIndentHanging) 762 if (style->textIndentType() == TextIndentHanging)
809 shouldIndentText = shouldIndentText == IndentText ? DoNotIndentText : In dentText; 763 shouldIndentText = shouldIndentText == IndentText ? DoNotIndentText : In dentText;
810 764
811 return shouldIndentText; 765 return shouldIndentText;
812 } 766 }
813 767
814 } 768 }
815 769
816 #endif // SKY_ENGINE_CORE_RENDERING_LINE_BREAKINGCONTEXTINLINEHEADERS_H_ 770 #endif // SKY_ENGINE_CORE_RENDERING_LINE_BREAKINGCONTEXTINLINEHEADERS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698