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

Side by Side Diff: third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp

Issue 2393693002: Reformat comments in core/layout/line (Closed)
Patch Set: Created 4 years, 2 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 * (C) 1999 Lars Knoll (knoll@kde.org) 2 * (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 2000 Dirk Mueller (mueller@kde.org) 3 * (C) 2000 Dirk Mueller (mueller@kde.org)
4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved. 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
5 * All rights reserved.
5 * 6 *
6 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
9 * 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.
10 * 11 *
11 * This library is distributed in the hope that it will be useful, 12 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details. 15 * Library General Public License for more details.
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 else if (state == SelectionBoth) 171 else if (state == SelectionBoth)
171 state = SelectionNone; 172 state = SelectionNone;
172 } 173 }
173 174
174 // If there are ellipsis following, make sure their selection is updated. 175 // If there are ellipsis following, make sure their selection is updated.
175 if (m_truncation != cNoTruncation && root().ellipsisBox()) { 176 if (m_truncation != cNoTruncation && root().ellipsisBox()) {
176 EllipsisBox* ellipsis = root().ellipsisBox(); 177 EllipsisBox* ellipsis = root().ellipsisBox();
177 if (state != SelectionNone) { 178 if (state != SelectionNone) {
178 int start, end; 179 int start, end;
179 selectionStartEnd(start, end); 180 selectionStartEnd(start, end);
180 // The ellipsis should be considered to be selected if the end of 181 // The ellipsis should be considered to be selected if the end of the
181 // the selection is past the beginning of the truncation and the 182 // selection is past the beginning of the truncation and the beginning of
182 // beginning of the selection is before or at the beginning of the 183 // the selection is before or at the beginning of the truncation.
183 // truncation.
184 ellipsis->setSelectionState(end >= m_truncation && start <= m_truncation 184 ellipsis->setSelectionState(end >= m_truncation && start <= m_truncation
185 ? SelectionInside 185 ? SelectionInside
186 : SelectionNone); 186 : SelectionNone);
187 } else { 187 } else {
188 ellipsis->setSelectionState(SelectionNone); 188 ellipsis->setSelectionState(SelectionNone);
189 } 189 }
190 } 190 }
191 191
192 return state; 192 return state;
193 } 193 }
194 194
195 bool InlineTextBox::hasWrappedSelectionNewline() const { 195 bool InlineTextBox::hasWrappedSelectionNewline() const {
196 // TODO(wkorman): We shouldn't need layout at this point and it should 196 // TODO(wkorman): We shouldn't need layout at this point and it should be
197 // be enforced by DocumentLifecycle. http://crbug.com/537821 197 // enforced by DocumentLifecycle. http://crbug.com/537821
198 // Bail out as currently looking up selection state can cause the editing 198 // Bail out as currently looking up selection state can cause the editing code
199 // code can force a re-layout while scrutinizing the editing position, and 199 // can force a re-layout while scrutinizing the editing position, and
200 // InlineTextBox instances are not guaranteed to survive a re-layout. 200 // InlineTextBox instances are not guaranteed to survive a re-layout.
201 if (getLineLayoutItem().needsLayout()) 201 if (getLineLayoutItem().needsLayout())
202 return false; 202 return false;
203 203
204 SelectionState state = getSelectionState(); 204 SelectionState state = getSelectionState();
205 return (state == SelectionStart || state == SelectionInside) 205 return (state == SelectionStart || state == SelectionInside)
206 // Checking last leaf child can be slow, so we make sure to do this onl y 206 // Checking last leaf child can be slow, so we make sure to do this
207 // after the other simple conditionals. 207 // only after the other simple conditionals.
208 && (root().lastLeafChild() == this) 208 && (root().lastLeafChild() == this)
209 // It's possible to have mixed LTR/RTL on a single line, and we only 209 // It's possible to have mixed LTR/RTL on a single line, and we only
210 // want to paint a newline when we're the last leaf child and we make 210 // want to paint a newline when we're the last leaf child and we make
211 // sure there isn't a differently-directioned box following us. 211 // sure there isn't a differently-directioned box following us.
212 && ((!isLeftToRightDirection() && root().firstSelectedBox() == this) || 212 && ((!isLeftToRightDirection() && root().firstSelectedBox() == this) ||
213 (isLeftToRightDirection() && root().lastSelectedBox() == this)); 213 (isLeftToRightDirection() && root().lastSelectedBox() == this));
214 } 214 }
215 215
216 float InlineTextBox::newlineSpaceWidth() const { 216 float InlineTextBox::newlineSpaceWidth() const {
217 const ComputedStyle& styleToUse = 217 const ComputedStyle& styleToUse =
(...skipping 19 matching lines...) Expand all
237 StringBuilder charactersWithHyphen; 237 StringBuilder charactersWithHyphen;
238 bool respectHyphen = ePos == m_len && hasHyphen(); 238 bool respectHyphen = ePos == m_len && hasHyphen();
239 TextRun textRun = 239 TextRun textRun =
240 constructTextRun(styleToUse, respectHyphen ? &charactersWithHyphen : 0); 240 constructTextRun(styleToUse, respectHyphen ? &charactersWithHyphen : 0);
241 241
242 LayoutPoint startingPoint = LayoutPoint(logicalLeft(), selTop); 242 LayoutPoint startingPoint = LayoutPoint(logicalLeft(), selTop);
243 LayoutRect r; 243 LayoutRect r;
244 if (sPos || ePos != static_cast<int>(m_len)) { 244 if (sPos || ePos != static_cast<int>(m_len)) {
245 r = LayoutRect(enclosingIntRect(font.selectionRectForText( 245 r = LayoutRect(enclosingIntRect(font.selectionRectForText(
246 textRun, FloatPoint(startingPoint), selHeight.toInt(), sPos, ePos))); 246 textRun, FloatPoint(startingPoint), selHeight.toInt(), sPos, ePos)));
247 } else { // Avoid computing the font width when the entire line box is select ed as an optimization. 247 } else {
248 // Avoid computing the font width when the entire line box is selected as an
249 // optimization.
248 r = LayoutRect(enclosingIntRect( 250 r = LayoutRect(enclosingIntRect(
249 LayoutRect(startingPoint, LayoutSize(m_logicalWidth, selHeight)))); 251 LayoutRect(startingPoint, LayoutSize(m_logicalWidth, selHeight))));
250 } 252 }
251 253
252 LayoutUnit logicalWidth = r.width(); 254 LayoutUnit logicalWidth = r.width();
253 if (r.x() > logicalRight()) 255 if (r.x() > logicalRight())
254 logicalWidth = LayoutUnit(); 256 logicalWidth = LayoutUnit();
255 else if (r.maxX() > logicalRight()) 257 else if (r.maxX() > logicalRight())
256 logicalWidth = logicalRight() - r.x(); 258 logicalWidth = logicalRight() - r.x();
257 259
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 LayoutUnit visibleLeftEdge, 317 LayoutUnit visibleLeftEdge,
316 LayoutUnit visibleRightEdge, 318 LayoutUnit visibleRightEdge,
317 LayoutUnit ellipsisWidth, 319 LayoutUnit ellipsisWidth,
318 LayoutUnit& truncatedWidth, 320 LayoutUnit& truncatedWidth,
319 bool& foundBox) { 321 bool& foundBox) {
320 if (foundBox) { 322 if (foundBox) {
321 setTruncation(cFullTruncation); 323 setTruncation(cFullTruncation);
322 return LayoutUnit(-1); 324 return LayoutUnit(-1);
323 } 325 }
324 326
325 // For LTR this is the left edge of the box, for RTL, the right edge in parent coordinates. 327 // For LTR this is the left edge of the box, for RTL, the right edge in parent
328 // coordinates.
326 LayoutUnit ellipsisX = flowIsLTR ? visibleRightEdge - ellipsisWidth 329 LayoutUnit ellipsisX = flowIsLTR ? visibleRightEdge - ellipsisWidth
327 : visibleLeftEdge + ellipsisWidth; 330 : visibleLeftEdge + ellipsisWidth;
328 331
329 // Criteria for full truncation: 332 // Criteria for full truncation:
330 // LTR: the left edge of the ellipsis is to the left of our text run. 333 // LTR: the left edge of the ellipsis is to the left of our text run.
331 // RTL: the right edge of the ellipsis is to the right of our text run. 334 // RTL: the right edge of the ellipsis is to the right of our text run.
332 bool ltrFullTruncation = flowIsLTR && ellipsisX <= logicalLeft(); 335 bool ltrFullTruncation = flowIsLTR && ellipsisX <= logicalLeft();
333 bool rtlFullTruncation = 336 bool rtlFullTruncation =
334 !flowIsLTR && ellipsisX >= logicalLeft() + logicalWidth(); 337 !flowIsLTR && ellipsisX >= logicalLeft() + logicalWidth();
335 if (ltrFullTruncation || rtlFullTruncation) { 338 if (ltrFullTruncation || rtlFullTruncation) {
336 // Too far. Just set full truncation, but return -1 and let the ellipsis ju st be placed at the edge of the box. 339 // Too far. Just set full truncation, but return -1 and let the ellipsis
340 // just be placed at the edge of the box.
337 setTruncation(cFullTruncation); 341 setTruncation(cFullTruncation);
338 foundBox = true; 342 foundBox = true;
339 return LayoutUnit(-1); 343 return LayoutUnit(-1);
340 } 344 }
341 345
342 bool ltrEllipsisWithinBox = flowIsLTR && (ellipsisX < logicalRight()); 346 bool ltrEllipsisWithinBox = flowIsLTR && (ellipsisX < logicalRight());
343 bool rtlEllipsisWithinBox = !flowIsLTR && (ellipsisX > logicalLeft()); 347 bool rtlEllipsisWithinBox = !flowIsLTR && (ellipsisX > logicalLeft());
344 if (ltrEllipsisWithinBox || rtlEllipsisWithinBox) { 348 if (ltrEllipsisWithinBox || rtlEllipsisWithinBox) {
345 foundBox = true; 349 foundBox = true;
346 350
347 // The inline box may have different directionality than it's parent. Since truncation 351 // The inline box may have different directionality than it's parent. Since
348 // behavior depends both on both the parent and the inline block's direction ality, we 352 // truncation behavior depends both on both the parent and the inline
349 // must keep track of these separately. 353 // block's directionality, we must keep track of these separately.
350 bool ltr = isLeftToRightDirection(); 354 bool ltr = isLeftToRightDirection();
351 if (ltr != flowIsLTR) { 355 if (ltr != flowIsLTR) {
352 // Width in pixels of the visible portion of the box, excluding the ellips is. 356 // Width in pixels of the visible portion of the box, excluding the
357 // ellipsis.
353 int visibleBoxWidth = 358 int visibleBoxWidth =
354 (visibleRightEdge - visibleLeftEdge - ellipsisWidth).toInt(); 359 (visibleRightEdge - visibleLeftEdge - ellipsisWidth).toInt();
355 ellipsisX = flowIsLTR ? logicalLeft() + visibleBoxWidth 360 ellipsisX = flowIsLTR ? logicalLeft() + visibleBoxWidth
356 : logicalRight() - visibleBoxWidth; 361 : logicalRight() - visibleBoxWidth;
357 } 362 }
358 363
359 int offset = offsetForPosition(ellipsisX, false); 364 int offset = offsetForPosition(ellipsisX, false);
360 if (offset == 0 && ltr == flowIsLTR) { 365 if (offset == 0 && ltr == flowIsLTR) {
361 // No characters should be laid out. Set ourselves to full truncation and place the ellipsis at the min of our start 366 // No characters should be laid out. Set ourselves to full truncation and
362 // and the ellipsis edge. 367 // place the ellipsis at the min of our start and the ellipsis edge.
363 setTruncation(cFullTruncation); 368 setTruncation(cFullTruncation);
364 truncatedWidth += ellipsisWidth; 369 truncatedWidth += ellipsisWidth;
365 return std::min(ellipsisX, logicalLeft()); 370 return std::min(ellipsisX, logicalLeft());
366 } 371 }
367 372
368 // Set the truncation index on the text run. 373 // Set the truncation index on the text run.
369 setTruncation(offset); 374 setTruncation(offset);
370 375
371 // If we got here that means that we were only partially truncated and we ne ed to return the pixel offset at which 376 // If we got here that means that we were only partially truncated and we
372 // to place the ellipsis. Where the text and its flow have opposite directio ns then our offset into the text is at 377 // need to return the pixel offset at which to place the ellipsis. Where the
373 // the start of the part that will be visible. 378 // text and its flow have opposite directions then our offset into the text
379 // is at the start of the part that will be visible.
374 LayoutUnit widthOfVisibleText(getLineLayoutItem().width( 380 LayoutUnit widthOfVisibleText(getLineLayoutItem().width(
375 ltr == flowIsLTR ? m_start : offset, 381 ltr == flowIsLTR ? m_start : offset,
376 ltr == flowIsLTR ? offset : m_len - offset, textPos(), 382 ltr == flowIsLTR ? offset : m_len - offset, textPos(),
377 flowIsLTR ? LTR : RTL, isFirstLineStyle())); 383 flowIsLTR ? LTR : RTL, isFirstLineStyle()));
378 384
379 // The ellipsis needs to be placed just after the last visible character. 385 // The ellipsis needs to be placed just after the last visible character.
380 // Where "after" is defined by the flow directionality, not the inline 386 // Where "after" is defined by the flow directionality, not the inline
381 // box directionality. 387 // box directionality.
382 // e.g. In the case of an LTR inline box truncated in an RTL flow then we ca n 388 // e.g. In the case of an LTR inline box truncated in an RTL flow then we
383 // have a situation such as |Hello| -> |...He| 389 // can have a situation such as |Hello| -> |...He|
384 truncatedWidth += widthOfVisibleText + ellipsisWidth; 390 truncatedWidth += widthOfVisibleText + ellipsisWidth;
385 if (flowIsLTR) 391 if (flowIsLTR)
386 return logicalLeft() + widthOfVisibleText; 392 return logicalLeft() + widthOfVisibleText;
387 return logicalRight() - widthOfVisibleText - ellipsisWidth; 393 return logicalRight() - widthOfVisibleText - ellipsisWidth;
388 } 394 }
389 truncatedWidth += logicalWidth(); 395 truncatedWidth += logicalWidth();
390 return LayoutUnit(-1); 396 return LayoutUnit(-1);
391 } 397 }
392 398
393 bool InlineTextBox::isLineBreak() const { 399 bool InlineTextBox::isLineBreak() const {
(...skipping 22 matching lines...) Expand all
416 locationInContainer, 422 locationInContainer,
417 rect) == StopHitTesting) 423 rect) == StopHitTesting)
418 return true; 424 return true;
419 } 425 }
420 return false; 426 return false;
421 } 427 }
422 428
423 bool InlineTextBox::getEmphasisMarkPosition( 429 bool InlineTextBox::getEmphasisMarkPosition(
424 const ComputedStyle& style, 430 const ComputedStyle& style,
425 TextEmphasisPosition& emphasisPosition) const { 431 TextEmphasisPosition& emphasisPosition) const {
426 // This function returns true if there are text emphasis marks and they are su ppressed by ruby text. 432 // This function returns true if there are text emphasis marks and they are
433 // suppressed by ruby text.
427 if (style.getTextEmphasisMark() == TextEmphasisMarkNone) 434 if (style.getTextEmphasisMark() == TextEmphasisMarkNone)
428 return false; 435 return false;
429 436
430 emphasisPosition = style.getTextEmphasisPosition(); 437 emphasisPosition = style.getTextEmphasisPosition();
438 // Ruby text is always over, so it cannot suppress emphasis marks under.
431 if (emphasisPosition == TextEmphasisPositionUnder) 439 if (emphasisPosition == TextEmphasisPositionUnder)
432 return true; // Ruby text is always over, so it cannot suppress emphasis ma rks under. 440 return true;
433 441
434 LineLayoutBox containingBlock = getLineLayoutItem().containingBlock(); 442 LineLayoutBox containingBlock = getLineLayoutItem().containingBlock();
443 // This text is not inside a ruby base, so it does not have ruby text over it.
435 if (!containingBlock.isRubyBase()) 444 if (!containingBlock.isRubyBase())
436 return true; // This text is not inside a ruby base, so it does not have ru by text over it. 445 return true;
437 446
447 // Cannot get the ruby text.
438 if (!containingBlock.parent().isRubyRun()) 448 if (!containingBlock.parent().isRubyRun())
439 return true; // Cannot get the ruby text. 449 return true;
440 450
441 LineLayoutRubyText rubyText = 451 LineLayoutRubyText rubyText =
442 LineLayoutRubyRun(containingBlock.parent()).rubyText(); 452 LineLayoutRubyRun(containingBlock.parent()).rubyText();
443 453
444 // The emphasis marks over are suppressed only if there is a ruby text box and it not empty. 454 // The emphasis marks over are suppressed only if there is a ruby text box and
455 // it not empty.
445 return !rubyText || !rubyText.firstLineBox(); 456 return !rubyText || !rubyText.firstLineBox();
446 } 457 }
447 458
448 void InlineTextBox::paint(const PaintInfo& paintInfo, 459 void InlineTextBox::paint(const PaintInfo& paintInfo,
449 const LayoutPoint& paintOffset, 460 const LayoutPoint& paintOffset,
450 LayoutUnit /*lineTop*/, 461 LayoutUnit /*lineTop*/,
451 LayoutUnit /*lineBottom*/) const { 462 LayoutUnit /*lineBottom*/) const {
452 InlineTextBoxPainter(*this).paint(paintInfo, paintOffset); 463 InlineTextBoxPainter(*this).paint(paintInfo, paintOffset);
453 } 464 }
454 465
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 510
500 int InlineTextBox::caretMinOffset() const { 511 int InlineTextBox::caretMinOffset() const {
501 return m_start; 512 return m_start;
502 } 513 }
503 514
504 int InlineTextBox::caretMaxOffset() const { 515 int InlineTextBox::caretMaxOffset() const {
505 return m_start + m_len; 516 return m_start + m_len;
506 } 517 }
507 518
508 LayoutUnit InlineTextBox::textPos() const { 519 LayoutUnit InlineTextBox::textPos() const {
509 // When computing the width of a text run, LayoutBlock::computeInlineDirection PositionsForLine() doesn't include the actual offset 520 // When computing the width of a text run, LayoutBlock::
510 // from the containing block edge in its measurement. textPos() should be cons istent so the text are laid out in the same width. 521 // computeInlineDirectionPositionsForLine() doesn't include the actual offset
522 // from the containing block edge in its measurement. textPos() should be
523 // consistent so the text are laid out in the same width.
511 if (logicalLeft() == 0) 524 if (logicalLeft() == 0)
512 return LayoutUnit(); 525 return LayoutUnit();
513 return logicalLeft() - root().logicalLeft(); 526 return logicalLeft() - root().logicalLeft();
514 } 527 }
515 528
516 int InlineTextBox::offsetForPosition(LayoutUnit lineOffset, 529 int InlineTextBox::offsetForPosition(LayoutUnit lineOffset,
517 bool includePartialGlyphs) const { 530 bool includePartialGlyphs) const {
518 if (isLineBreak()) 531 if (isLineBreak())
519 return 0; 532 return 0;
520 533
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 return true; 575 return true;
563 576
564 // Offsets outside the box are always "out". 577 // Offsets outside the box are always "out".
565 if (offset > pastEnd) 578 if (offset > pastEnd)
566 return false; 579 return false;
567 580
568 // Offsets at the end are "out" for line breaks (they are on the next line). 581 // Offsets at the end are "out" for line breaks (they are on the next line).
569 if (isLineBreak()) 582 if (isLineBreak())
570 return false; 583 return false;
571 584
572 // Offsets at the end are "in" for normal boxes (but the caller has to check a ffinity). 585 // Offsets at the end are "in" for normal boxes (but the caller has to check
586 // affinity).
573 return true; 587 return true;
574 } 588 }
575 589
576 void InlineTextBox::characterWidths(Vector<float>& widths) const { 590 void InlineTextBox::characterWidths(Vector<float>& widths) const {
577 if (!m_len) 591 if (!m_len)
578 return; 592 return;
579 593
580 FontCachePurgePreventer fontCachePurgePreventer; 594 FontCachePurgePreventer fontCachePurgePreventer;
581 ASSERT(getLineLayoutItem().text()); 595 ASSERT(getLineLayoutItem().text());
582 596
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 maximumLength = string.length(); 635 maximumLength = string.length();
622 } 636 }
623 637
624 ASSERT(maximumLength >= static_cast<int>(string.length())); 638 ASSERT(maximumLength >= static_cast<int>(string.length()));
625 639
626 TextRun run(string, textPos().toFloat(), expansion(), expansionBehavior(), 640 TextRun run(string, textPos().toFloat(), expansion(), expansionBehavior(),
627 direction(), dirOverride() || style.rtlOrdering() == VisualOrder); 641 direction(), dirOverride() || style.rtlOrdering() == VisualOrder);
628 run.setTabSize(!style.collapseWhiteSpace(), style.getTabSize()); 642 run.setTabSize(!style.collapseWhiteSpace(), style.getTabSize());
629 run.setTextJustify(style.getTextJustify()); 643 run.setTextJustify(style.getTextJustify());
630 644
631 // Propagate the maximum length of the characters buffer to the TextRun, even when we're only processing a substring. 645 // Propagate the maximum length of the characters buffer to the TextRun, even
646 // when we're only processing a substring.
632 run.setCharactersLength(maximumLength); 647 run.setCharactersLength(maximumLength);
633 ASSERT(run.charactersLength() >= run.length()); 648 ASSERT(run.charactersLength() >= run.length());
634 return run; 649 return run;
635 } 650 }
636 651
637 TextRun InlineTextBox::constructTextRunForInspector( 652 TextRun InlineTextBox::constructTextRunForInspector(
638 const ComputedStyle& style) const { 653 const ComputedStyle& style) const {
639 return InlineTextBox::constructTextRun(style); 654 return InlineTextBox::constructTextRun(style);
640 } 655 }
641 656
(...skipping 24 matching lines...) Expand all
666 const int layoutObjectCharacterOffset = 75; 681 const int layoutObjectCharacterOffset = 75;
667 for (; printedCharacters < layoutObjectCharacterOffset; printedCharacters++) 682 for (; printedCharacters < layoutObjectCharacterOffset; printedCharacters++)
668 fputc(' ', stderr); 683 fputc(' ', stderr);
669 fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(), 684 fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(),
670 value.utf8().data()); 685 value.utf8().data());
671 } 686 }
672 687
673 #endif 688 #endif
674 689
675 } // namespace blink 690 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698