| 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 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
| 5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) | 5 * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) |
| 6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) | 6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) |
| 7 * | 7 * |
| 8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
| 9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
| 10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 bool LayoutText::isTextFragment() const | 176 bool LayoutText::isTextFragment() const |
| 177 { | 177 { |
| 178 return false; | 178 return false; |
| 179 } | 179 } |
| 180 | 180 |
| 181 bool LayoutText::isWordBreak() const | 181 bool LayoutText::isWordBreak() const |
| 182 { | 182 { |
| 183 return false; | 183 return false; |
| 184 } | 184 } |
| 185 | 185 |
| 186 void LayoutText::styleDidChange(StyleDifference diff, const LayoutStyle* oldStyl
e) | 186 void LayoutText::styleDidChange(StyleDifference diff, const ComputedStyle* oldSt
yle) |
| 187 { | 187 { |
| 188 // There is no need to ever schedule paint invalidations from a style change
of a text run, since | 188 // There is no need to ever schedule paint invalidations from a style change
of a text run, since |
| 189 // we already did this for the parent of the text run. | 189 // we already did this for the parent of the text run. |
| 190 // We do have to schedule layouts, though, since a style change can force us
to | 190 // We do have to schedule layouts, though, since a style change can force us
to |
| 191 // need to relayout. | 191 // need to relayout. |
| 192 if (diff.needsFullLayout()) { | 192 if (diff.needsFullLayout()) { |
| 193 setNeedsLayoutAndPrefWidthsRecalc(); | 193 setNeedsLayoutAndPrefWidthsRecalc(); |
| 194 m_knownToHaveNoOverflowAndNoFallbackFonts = false; | 194 m_knownToHaveNoOverflowAndNoFallbackFonts = false; |
| 195 } | 195 } |
| 196 | 196 |
| 197 const LayoutStyle& newStyle = styleRef(); | 197 const ComputedStyle& newStyle = styleRef(); |
| 198 ETextTransform oldTransform = oldStyle ? oldStyle->textTransform() : TTNONE; | 198 ETextTransform oldTransform = oldStyle ? oldStyle->textTransform() : TTNONE; |
| 199 ETextSecurity oldSecurity = oldStyle ? oldStyle->textSecurity() : TSNONE; | 199 ETextSecurity oldSecurity = oldStyle ? oldStyle->textSecurity() : TSNONE; |
| 200 if (oldTransform != newStyle.textTransform() || oldSecurity != newStyle.text
Security()) | 200 if (oldTransform != newStyle.textTransform() || oldSecurity != newStyle.text
Security()) |
| 201 transformText(); | 201 transformText(); |
| 202 | 202 |
| 203 // This is an optimization that kicks off font load before layout. | 203 // This is an optimization that kicks off font load before layout. |
| 204 // In order to make it fast, we only check if the first character of the | 204 // In order to make it fast, we only check if the first character of the |
| 205 // text is included in the unicode ranges of the fonts. | 205 // text is included in the unicode ranges of the fonts. |
| 206 if (!text().containsOnlyWhitespace()) | 206 if (!text().containsOnlyWhitespace()) |
| 207 newStyle.font().willUseFontData(text().characterStartingAt(0)); | 207 newStyle.font().willUseFontData(text().characterStartingAt(0)); |
| (...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 657 | 657 |
| 658 float rootLeft = box->root().logicalLeft(); | 658 float rootLeft = box->root().logicalLeft(); |
| 659 float rootRight = box->root().logicalRight(); | 659 float rootRight = box->root().logicalRight(); |
| 660 | 660 |
| 661 // FIXME: should we use the width of the root inline box or the | 661 // FIXME: should we use the width of the root inline box or the |
| 662 // width of the containing block for this? | 662 // width of the containing block for this? |
| 663 if (extraWidthToEndOfLine) | 663 if (extraWidthToEndOfLine) |
| 664 *extraWidthToEndOfLine = (box->root().logicalWidth() + rootLeft) - (left
+ 1); | 664 *extraWidthToEndOfLine = (box->root().logicalWidth() + rootLeft) - (left
+ 1); |
| 665 | 665 |
| 666 LayoutBlock* cb = containingBlock(); | 666 LayoutBlock* cb = containingBlock(); |
| 667 const LayoutStyle& cbStyle = cb->styleRef(); | 667 const ComputedStyle& cbStyle = cb->styleRef(); |
| 668 | 668 |
| 669 float leftEdge; | 669 float leftEdge; |
| 670 float rightEdge; | 670 float rightEdge; |
| 671 leftEdge = std::min<float>(0, rootLeft); | 671 leftEdge = std::min<float>(0, rootLeft); |
| 672 rightEdge = std::max<float>(cb->logicalWidth().toFloat(), rootRight); | 672 rightEdge = std::max<float>(cb->logicalWidth().toFloat(), rootRight); |
| 673 | 673 |
| 674 bool rightAligned = false; | 674 bool rightAligned = false; |
| 675 switch (cbStyle.textAlign()) { | 675 switch (cbStyle.textAlign()) { |
| 676 case RIGHT: | 676 case RIGHT: |
| 677 case WEBKIT_RIGHT: | 677 case WEBKIT_RIGHT: |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 716 return combineText->combinedTextWidth(f); | 716 return combineText->combinedTextWidth(f); |
| 717 } | 717 } |
| 718 | 718 |
| 719 if (f.isFixedPitch() && f.fontDescription().variant() == FontVariantNormal &
& m_isAllASCII && (!glyphOverflow || !glyphOverflow->computeBounds)) { | 719 if (f.isFixedPitch() && f.fontDescription().variant() == FontVariantNormal &
& m_isAllASCII && (!glyphOverflow || !glyphOverflow->computeBounds)) { |
| 720 bool missingGlyph = false; | 720 bool missingGlyph = false; |
| 721 float monospaceCharacterWidth = f.spaceWidth(); | 721 float monospaceCharacterWidth = f.spaceWidth(); |
| 722 float w = 0; | 722 float w = 0; |
| 723 bool isSpace; | 723 bool isSpace; |
| 724 ASSERT(m_text); | 724 ASSERT(m_text); |
| 725 StringImpl& text = *m_text.impl(); | 725 StringImpl& text = *m_text.impl(); |
| 726 const LayoutStyle& layoutStyle = styleRef(); | 726 const ComputedStyle& computedStyle = styleRef(); |
| 727 for (int i = start; i < start + len; i++) { | 727 for (int i = start; i < start + len; i++) { |
| 728 char c = text[i]; | 728 char c = text[i]; |
| 729 // If glyph is not present in primary font then we cannot calculate
width based on primary | 729 // If glyph is not present in primary font then we cannot calculate
width based on primary |
| 730 // font property, we need to call "width" method of Font Object. | 730 // font property, we need to call "width" method of Font Object. |
| 731 if (!f.primaryFontHasGlyphForCharacter(text[i])) { | 731 if (!f.primaryFontHasGlyphForCharacter(text[i])) { |
| 732 missingGlyph = true; | 732 missingGlyph = true; |
| 733 break; | 733 break; |
| 734 } | 734 } |
| 735 if (c <= space) { | 735 if (c <= space) { |
| 736 if (c == space || c == newlineCharacter) { | 736 if (c == space || c == newlineCharacter) { |
| 737 w += monospaceCharacterWidth; | 737 w += monospaceCharacterWidth; |
| 738 isSpace = true; | 738 isSpace = true; |
| 739 } else if (c == characterTabulation) { | 739 } else if (c == characterTabulation) { |
| 740 if (layoutStyle.collapseWhiteSpace()) { | 740 if (computedStyle.collapseWhiteSpace()) { |
| 741 w += monospaceCharacterWidth; | 741 w += monospaceCharacterWidth; |
| 742 isSpace = true; | 742 isSpace = true; |
| 743 } else { | 743 } else { |
| 744 w += f.tabWidth(layoutStyle.tabSize(), xPos + w); | 744 w += f.tabWidth(computedStyle.tabSize(), xPos + w); |
| 745 isSpace = false; | 745 isSpace = false; |
| 746 } | 746 } |
| 747 } else { | 747 } else { |
| 748 isSpace = false; | 748 isSpace = false; |
| 749 } | 749 } |
| 750 } else { | 750 } else { |
| 751 w += monospaceCharacterWidth; | 751 w += monospaceCharacterWidth; |
| 752 isSpace = false; | 752 isSpace = false; |
| 753 } | 753 } |
| 754 if (isSpace && i > start) | 754 if (isSpace && i > start) |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 GlyphOverflow glyphOverflow; | 888 GlyphOverflow glyphOverflow; |
| 889 computePreferredLogicalWidths(leadWidth, fallbackFonts, glyphOverflow); | 889 computePreferredLogicalWidths(leadWidth, fallbackFonts, glyphOverflow); |
| 890 | 890 |
| 891 // We shouldn't change our mind once we "know". | 891 // We shouldn't change our mind once we "know". |
| 892 ASSERT(!m_knownToHaveNoOverflowAndNoFallbackFonts || (fallbackFonts.isEmpty(
) && glyphOverflow.isZero())); | 892 ASSERT(!m_knownToHaveNoOverflowAndNoFallbackFonts || (fallbackFonts.isEmpty(
) && glyphOverflow.isZero())); |
| 893 m_knownToHaveNoOverflowAndNoFallbackFonts = fallbackFonts.isEmpty() && glyph
Overflow.isZero(); | 893 m_knownToHaveNoOverflowAndNoFallbackFonts = fallbackFonts.isEmpty() && glyph
Overflow.isZero(); |
| 894 } | 894 } |
| 895 | 895 |
| 896 static inline float hyphenWidth(LayoutText* renderer, const Font& font, TextDire
ction direction) | 896 static inline float hyphenWidth(LayoutText* renderer, const Font& font, TextDire
ction direction) |
| 897 { | 897 { |
| 898 const LayoutStyle& style = renderer->styleRef(); | 898 const ComputedStyle& style = renderer->styleRef(); |
| 899 return font.width(constructTextRun(renderer, font, style.hyphenString().stri
ng(), style, direction)); | 899 return font.width(constructTextRun(renderer, font, style.hyphenString().stri
ng(), style, direction)); |
| 900 } | 900 } |
| 901 | 901 |
| 902 void LayoutText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
mpleFontData*>& fallbackFonts, GlyphOverflow& glyphOverflow) | 902 void LayoutText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
mpleFontData*>& fallbackFonts, GlyphOverflow& glyphOverflow) |
| 903 { | 903 { |
| 904 ASSERT(m_hasTab || preferredLogicalWidthsDirty() || !m_knownToHaveNoOverflow
AndNoFallbackFonts); | 904 ASSERT(m_hasTab || preferredLogicalWidthsDirty() || !m_knownToHaveNoOverflow
AndNoFallbackFonts); |
| 905 | 905 |
| 906 m_minWidth = 0; | 906 m_minWidth = 0; |
| 907 m_maxWidth = 0; | 907 m_maxWidth = 0; |
| 908 m_firstLineMinWidth = 0; | 908 m_firstLineMinWidth = 0; |
| 909 m_lastLineLineMinWidth = 0; | 909 m_lastLineLineMinWidth = 0; |
| 910 | 910 |
| 911 if (isBR()) | 911 if (isBR()) |
| 912 return; | 912 return; |
| 913 | 913 |
| 914 float currMinWidth = 0; | 914 float currMinWidth = 0; |
| 915 float currMaxWidth = 0; | 915 float currMaxWidth = 0; |
| 916 m_hasBreakableChar = false; | 916 m_hasBreakableChar = false; |
| 917 m_hasBreak = false; | 917 m_hasBreak = false; |
| 918 m_hasTab = false; | 918 m_hasTab = false; |
| 919 m_hasBreakableStart = false; | 919 m_hasBreakableStart = false; |
| 920 m_hasBreakableEnd = false; | 920 m_hasBreakableEnd = false; |
| 921 m_hasEndWhiteSpace = false; | 921 m_hasEndWhiteSpace = false; |
| 922 | 922 |
| 923 const LayoutStyle& styleToUse = styleRef(); | 923 const ComputedStyle& styleToUse = styleRef(); |
| 924 const Font& f = styleToUse.font(); // FIXME: This ignores first-line. | 924 const Font& f = styleToUse.font(); // FIXME: This ignores first-line. |
| 925 float wordSpacing = styleToUse.wordSpacing(); | 925 float wordSpacing = styleToUse.wordSpacing(); |
| 926 int len = textLength(); | 926 int len = textLength(); |
| 927 LazyLineBreakIterator breakIterator(m_text, styleToUse.locale()); | 927 LazyLineBreakIterator breakIterator(m_text, styleToUse.locale()); |
| 928 bool needsWordSpacing = false; | 928 bool needsWordSpacing = false; |
| 929 bool ignoringSpaces = false; | 929 bool ignoringSpaces = false; |
| 930 bool isSpace = false; | 930 bool isSpace = false; |
| 931 bool firstWord = true; | 931 bool firstWord = true; |
| 932 bool firstLine = true; | 932 bool firstLine = true; |
| 933 int nextBreakable = -1; | 933 int nextBreakable = -1; |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1344 prev = (*previousString)[previousString->length() - 1]; | 1344 prev = (*previousString)[previousString->length() - 1]; |
| 1345 } | 1345 } |
| 1346 return prev; | 1346 return prev; |
| 1347 } | 1347 } |
| 1348 | 1348 |
| 1349 void LayoutText::addLayerHitTestRects(LayerHitTestRects&, const DeprecatedPaintL
ayer* currentLayer, const LayoutPoint& layerOffset, const LayoutRect& containerR
ect) const | 1349 void LayoutText::addLayerHitTestRects(LayerHitTestRects&, const DeprecatedPaintL
ayer* currentLayer, const LayoutPoint& layerOffset, const LayoutRect& containerR
ect) const |
| 1350 { | 1350 { |
| 1351 // Text nodes aren't event targets, so don't descend any further. | 1351 // Text nodes aren't event targets, so don't descend any further. |
| 1352 } | 1352 } |
| 1353 | 1353 |
| 1354 void applyTextTransform(const LayoutStyle* style, String& text, UChar previousCh
aracter) | 1354 void applyTextTransform(const ComputedStyle* style, String& text, UChar previous
Character) |
| 1355 { | 1355 { |
| 1356 if (!style) | 1356 if (!style) |
| 1357 return; | 1357 return; |
| 1358 | 1358 |
| 1359 switch (style->textTransform()) { | 1359 switch (style->textTransform()) { |
| 1360 case TTNONE: | 1360 case TTNONE: |
| 1361 break; | 1361 break; |
| 1362 case CAPITALIZE: | 1362 case CAPITALIZE: |
| 1363 makeCapitalized(&text, previousCharacter); | 1363 makeCapitalized(&text, previousCharacter); |
| 1364 break; | 1364 break; |
| (...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1898 } | 1898 } |
| 1899 | 1899 |
| 1900 void LayoutText::invalidateDisplayItemClients(const LayoutBoxModelObject& paintI
nvalidationContainer) const | 1900 void LayoutText::invalidateDisplayItemClients(const LayoutBoxModelObject& paintI
nvalidationContainer) const |
| 1901 { | 1901 { |
| 1902 LayoutObject::invalidateDisplayItemClients(paintInvalidationContainer); | 1902 LayoutObject::invalidateDisplayItemClients(paintInvalidationContainer); |
| 1903 for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) | 1903 for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) |
| 1904 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box); | 1904 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box); |
| 1905 } | 1905 } |
| 1906 | 1906 |
| 1907 } // namespace blink | 1907 } // namespace blink |
| OLD | NEW |