| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |