| 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. | 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. |
| 5 * All rights reserved. | 5 * All rights reserved. |
| 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 | 54 |
| 55 void InlineTextBox::destroy() { | 55 void InlineTextBox::destroy() { |
| 56 AbstractInlineTextBox::willDestroy(this); | 56 AbstractInlineTextBox::willDestroy(this); |
| 57 | 57 |
| 58 if (!knownToHaveNoOverflow() && gTextBoxesWithOverflow) | 58 if (!knownToHaveNoOverflow() && gTextBoxesWithOverflow) |
| 59 gTextBoxesWithOverflow->erase(this); | 59 gTextBoxesWithOverflow->erase(this); |
| 60 InlineBox::destroy(); | 60 InlineBox::destroy(); |
| 61 } | 61 } |
| 62 | 62 |
| 63 void InlineTextBox::offsetRun(int delta) { | 63 void InlineTextBox::offsetRun(int delta) { |
| 64 ASSERT(!isDirty()); | 64 DCHECK(!isDirty()); |
| 65 m_start += delta; | 65 m_start += delta; |
| 66 } | 66 } |
| 67 | 67 |
| 68 void InlineTextBox::markDirty() { | 68 void InlineTextBox::markDirty() { |
| 69 m_len = 0; | 69 m_len = 0; |
| 70 m_start = 0; | 70 m_start = 0; |
| 71 InlineBox::markDirty(); | 71 InlineBox::markDirty(); |
| 72 } | 72 } |
| 73 | 73 |
| 74 LayoutRect InlineTextBox::logicalOverflowRect() const { | 74 LayoutRect InlineTextBox::logicalOverflowRect() const { |
| 75 if (knownToHaveNoOverflow() || !gTextBoxesWithOverflow) | 75 if (knownToHaveNoOverflow() || !gTextBoxesWithOverflow) |
| 76 return logicalFrameRect(); | 76 return logicalFrameRect(); |
| 77 | 77 |
| 78 const auto& it = gTextBoxesWithOverflow->find(this); | 78 const auto& it = gTextBoxesWithOverflow->find(this); |
| 79 if (it != gTextBoxesWithOverflow->end()) | 79 if (it != gTextBoxesWithOverflow->end()) |
| 80 return it->value; | 80 return it->value; |
| 81 | 81 |
| 82 return logicalFrameRect(); | 82 return logicalFrameRect(); |
| 83 } | 83 } |
| 84 | 84 |
| 85 void InlineTextBox::setLogicalOverflowRect(const LayoutRect& rect) { | 85 void InlineTextBox::setLogicalOverflowRect(const LayoutRect& rect) { |
| 86 ASSERT(!knownToHaveNoOverflow()); | 86 DCHECK(!knownToHaveNoOverflow()); |
| 87 DCHECK(rect != logicalFrameRect()); | 87 DCHECK(rect != logicalFrameRect()); |
| 88 if (!gTextBoxesWithOverflow) | 88 if (!gTextBoxesWithOverflow) |
| 89 gTextBoxesWithOverflow = new InlineTextBoxOverflowMap; | 89 gTextBoxesWithOverflow = new InlineTextBoxOverflowMap; |
| 90 gTextBoxesWithOverflow->set(this, rect); | 90 gTextBoxesWithOverflow->set(this, rect); |
| 91 } | 91 } |
| 92 | 92 |
| 93 void InlineTextBox::move(const LayoutSize& delta) { | 93 void InlineTextBox::move(const LayoutSize& delta) { |
| 94 InlineBox::move(delta); | 94 InlineBox::move(delta); |
| 95 | 95 |
| 96 if (!knownToHaveNoOverflow() && gTextBoxesWithOverflow) { | 96 if (!knownToHaveNoOverflow() && gTextBoxesWithOverflow) { |
| (...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 | 569 |
| 570 LineLayoutText text = getLineLayoutItem(); | 570 LineLayoutText text = getLineLayoutItem(); |
| 571 const ComputedStyle& style = text.styleRef(isFirstLineStyle()); | 571 const ComputedStyle& style = text.styleRef(isFirstLineStyle()); |
| 572 const Font& font = style.font(); | 572 const Font& font = style.font(); |
| 573 return font.offsetForPosition(constructTextRun(style), | 573 return font.offsetForPosition(constructTextRun(style), |
| 574 (lineOffset - logicalLeft()).toFloat(), | 574 (lineOffset - logicalLeft()).toFloat(), |
| 575 includePartialGlyphs); | 575 includePartialGlyphs); |
| 576 } | 576 } |
| 577 | 577 |
| 578 LayoutUnit InlineTextBox::positionForOffset(int offset) const { | 578 LayoutUnit InlineTextBox::positionForOffset(int offset) const { |
| 579 ASSERT(offset >= m_start); | 579 DCHECK_GE(offset, m_start); |
| 580 ASSERT(offset <= m_start + m_len); | 580 DCHECK_LE(offset, m_start + m_len); |
| 581 | 581 |
| 582 if (isLineBreak()) | 582 if (isLineBreak()) |
| 583 return logicalLeft(); | 583 return logicalLeft(); |
| 584 | 584 |
| 585 LineLayoutText text = getLineLayoutItem(); | 585 LineLayoutText text = getLineLayoutItem(); |
| 586 const ComputedStyle& styleToUse = text.styleRef(isFirstLineStyle()); | 586 const ComputedStyle& styleToUse = text.styleRef(isFirstLineStyle()); |
| 587 const Font& font = styleToUse.font(); | 587 const Font& font = styleToUse.font(); |
| 588 int from = !isLeftToRightDirection() ? offset - m_start : 0; | 588 int from = !isLeftToRightDirection() ? offset - m_start : 0; |
| 589 int to = !isLeftToRightDirection() ? m_len : offset - m_start; | 589 int to = !isLeftToRightDirection() ? m_len : offset - m_start; |
| 590 // FIXME: Do we need to add rightBearing here? | 590 // FIXME: Do we need to add rightBearing here? |
| (...skipping 25 matching lines...) Expand all Loading... |
| 616 // Offsets at the end are "in" for normal boxes (but the caller has to check | 616 // Offsets at the end are "in" for normal boxes (but the caller has to check |
| 617 // affinity). | 617 // affinity). |
| 618 return true; | 618 return true; |
| 619 } | 619 } |
| 620 | 620 |
| 621 void InlineTextBox::characterWidths(Vector<float>& widths) const { | 621 void InlineTextBox::characterWidths(Vector<float>& widths) const { |
| 622 if (!m_len) | 622 if (!m_len) |
| 623 return; | 623 return; |
| 624 | 624 |
| 625 FontCachePurgePreventer fontCachePurgePreventer; | 625 FontCachePurgePreventer fontCachePurgePreventer; |
| 626 ASSERT(getLineLayoutItem().text()); | 626 DCHECK(getLineLayoutItem().text()); |
| 627 | 627 |
| 628 const ComputedStyle& styleToUse = | 628 const ComputedStyle& styleToUse = |
| 629 getLineLayoutItem().styleRef(isFirstLineStyle()); | 629 getLineLayoutItem().styleRef(isFirstLineStyle()); |
| 630 const Font& font = styleToUse.font(); | 630 const Font& font = styleToUse.font(); |
| 631 | 631 |
| 632 TextRun textRun = constructTextRun(styleToUse); | 632 TextRun textRun = constructTextRun(styleToUse); |
| 633 Vector<CharacterRange> ranges = font.individualCharacterRanges(textRun); | 633 Vector<CharacterRange> ranges = font.individualCharacterRanges(textRun); |
| 634 DCHECK_EQ(ranges.size(), m_len); | 634 DCHECK_EQ(ranges.size(), m_len); |
| 635 | 635 |
| 636 widths.resize(ranges.size()); | 636 widths.resize(ranges.size()); |
| 637 for (unsigned i = 0; i < ranges.size(); i++) | 637 for (unsigned i = 0; i < ranges.size(); i++) |
| 638 widths[i] = ranges[i].width(); | 638 widths[i] = ranges[i].width(); |
| 639 } | 639 } |
| 640 | 640 |
| 641 TextRun InlineTextBox::constructTextRun( | 641 TextRun InlineTextBox::constructTextRun( |
| 642 const ComputedStyle& style, | 642 const ComputedStyle& style, |
| 643 StringBuilder* charactersWithHyphen) const { | 643 StringBuilder* charactersWithHyphen) const { |
| 644 ASSERT(getLineLayoutItem().text()); | 644 DCHECK(getLineLayoutItem().text()); |
| 645 | 645 |
| 646 String string = getLineLayoutItem().text(); | 646 String string = getLineLayoutItem().text(); |
| 647 unsigned startPos = start(); | 647 unsigned startPos = start(); |
| 648 unsigned length = len(); | 648 unsigned length = len(); |
| 649 // Ensure |this| is in sync with the corresponding LayoutText. Checking here | 649 // Ensure |this| is in sync with the corresponding LayoutText. Checking here |
| 650 // has less binary size/perf impact than in StringView(). | 650 // has less binary size/perf impact than in StringView(). |
| 651 CHECK_LE(startPos, string.length()); | 651 CHECK_LE(startPos, string.length()); |
| 652 CHECK_LE(length, string.length() - startPos); | 652 CHECK_LE(length, string.length() - startPos); |
| 653 return constructTextRun(style, StringView(string, startPos, length), | 653 return constructTextRun(style, StringView(string, startPos, length), |
| 654 getLineLayoutItem().textLength() - startPos, | 654 getLineLayoutItem().textLength() - startPos, |
| 655 charactersWithHyphen); | 655 charactersWithHyphen); |
| 656 } | 656 } |
| 657 | 657 |
| 658 TextRun InlineTextBox::constructTextRun( | 658 TextRun InlineTextBox::constructTextRun( |
| 659 const ComputedStyle& style, | 659 const ComputedStyle& style, |
| 660 StringView string, | 660 StringView string, |
| 661 int maximumLength, | 661 int maximumLength, |
| 662 StringBuilder* charactersWithHyphen) const { | 662 StringBuilder* charactersWithHyphen) const { |
| 663 if (charactersWithHyphen) { | 663 if (charactersWithHyphen) { |
| 664 const AtomicString& hyphenString = style.hyphenString(); | 664 const AtomicString& hyphenString = style.hyphenString(); |
| 665 charactersWithHyphen->reserveCapacity(string.length() + | 665 charactersWithHyphen->reserveCapacity(string.length() + |
| 666 hyphenString.length()); | 666 hyphenString.length()); |
| 667 charactersWithHyphen->append(string); | 667 charactersWithHyphen->append(string); |
| 668 charactersWithHyphen->append(hyphenString); | 668 charactersWithHyphen->append(hyphenString); |
| 669 string = charactersWithHyphen->toString(); | 669 string = charactersWithHyphen->toString(); |
| 670 maximumLength = string.length(); | 670 maximumLength = string.length(); |
| 671 } | 671 } |
| 672 | 672 |
| 673 ASSERT(maximumLength >= static_cast<int>(string.length())); | 673 DCHECK_GE(maximumLength, static_cast<int>(string.length())); |
| 674 | 674 |
| 675 TextRun run(string, textPos().toFloat(), expansion(), expansionBehavior(), | 675 TextRun run(string, textPos().toFloat(), expansion(), expansionBehavior(), |
| 676 direction(), | 676 direction(), |
| 677 dirOverride() || style.rtlOrdering() == EOrder::kVisual); | 677 dirOverride() || style.rtlOrdering() == EOrder::kVisual); |
| 678 run.setTabSize(!style.collapseWhiteSpace(), style.getTabSize()); | 678 run.setTabSize(!style.collapseWhiteSpace(), style.getTabSize()); |
| 679 run.setTextJustify(style.getTextJustify()); | 679 run.setTextJustify(style.getTextJustify()); |
| 680 | 680 |
| 681 // Propagate the maximum length of the characters buffer to the TextRun, even | 681 // Propagate the maximum length of the characters buffer to the TextRun, even |
| 682 // when we're only processing a substring. | 682 // when we're only processing a substring. |
| 683 run.setCharactersLength(maximumLength); | 683 run.setCharactersLength(maximumLength); |
| 684 ASSERT(run.charactersLength() >= run.length()); | 684 DCHECK_GE(run.charactersLength(), run.length()); |
| 685 return run; | 685 return run; |
| 686 } | 686 } |
| 687 | 687 |
| 688 TextRun InlineTextBox::constructTextRunForInspector( | 688 TextRun InlineTextBox::constructTextRunForInspector( |
| 689 const ComputedStyle& style) const { | 689 const ComputedStyle& style) const { |
| 690 return InlineTextBox::constructTextRun(style); | 690 return InlineTextBox::constructTextRun(style); |
| 691 } | 691 } |
| 692 | 692 |
| 693 const char* InlineTextBox::boxName() const { | 693 const char* InlineTextBox::boxName() const { |
| 694 return "InlineTextBox"; | 694 return "InlineTextBox"; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 717 const int layoutObjectCharacterOffset = 75; | 717 const int layoutObjectCharacterOffset = 75; |
| 718 for (; printedCharacters < layoutObjectCharacterOffset; printedCharacters++) | 718 for (; printedCharacters < layoutObjectCharacterOffset; printedCharacters++) |
| 719 fputc(' ', stderr); | 719 fputc(' ', stderr); |
| 720 fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(), | 720 fprintf(stderr, "(%d,%d) \"%s\"\n", start(), start() + len(), |
| 721 value.utf8().data()); | 721 value.utf8().data()); |
| 722 } | 722 } |
| 723 | 723 |
| 724 #endif | 724 #endif |
| 725 | 725 |
| 726 } // namespace blink | 726 } // namespace blink |
| OLD | NEW |