| 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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 { | 193 { |
| 194 // There is no need to ever schedule paint invalidations from a style change
of a text run, since | 194 // There is no need to ever schedule paint invalidations from a style change
of a text run, since |
| 195 // we already did this for the parent of the text run. | 195 // we already did this for the parent of the text run. |
| 196 // We do have to schedule layouts, though, since a style change can force us
to | 196 // We do have to schedule layouts, though, since a style change can force us
to |
| 197 // need to relayout. | 197 // need to relayout. |
| 198 if (diff.needsFullLayout()) { | 198 if (diff.needsFullLayout()) { |
| 199 setNeedsLayoutAndPrefWidthsRecalc(); | 199 setNeedsLayoutAndPrefWidthsRecalc(); |
| 200 m_knownToHaveNoOverflowAndNoFallbackFonts = false; | 200 m_knownToHaveNoOverflowAndNoFallbackFonts = false; |
| 201 } | 201 } |
| 202 | 202 |
| 203 RenderStyle* newStyle = style(); | 203 const RenderStyle* newStyle = style(); |
| 204 ETextTransform oldTransform = oldStyle ? oldStyle->textTransform() : TTNONE; | 204 ETextTransform oldTransform = oldStyle ? oldStyle->textTransform() : TTNONE; |
| 205 ETextSecurity oldSecurity = oldStyle ? oldStyle->textSecurity() : TSNONE; | 205 ETextSecurity oldSecurity = oldStyle ? oldStyle->textSecurity() : TSNONE; |
| 206 if (oldTransform != newStyle->textTransform() || oldSecurity != newStyle->te
xtSecurity()) | 206 if (oldTransform != newStyle->textTransform() || oldSecurity != newStyle->te
xtSecurity()) |
| 207 transformText(); | 207 transformText(); |
| 208 | 208 |
| 209 // This is an optimization that kicks off font load before layout. | 209 // This is an optimization that kicks off font load before layout. |
| 210 // In order to make it fast, we only check if the first character of the | 210 // In order to make it fast, we only check if the first character of the |
| 211 // text is included in the unicode ranges of the fonts. | 211 // text is included in the unicode ranges of the fonts. |
| 212 if (!text().containsOnlyWhitespace()) | 212 if (!text().containsOnlyWhitespace()) |
| 213 newStyle->font().willUseFontData(text().characterStartingAt(0)); | 213 newStyle->font().willUseFontData(text().characterStartingAt(0)); |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 | 661 |
| 662 float rootLeft = box->root().logicalLeft(); | 662 float rootLeft = box->root().logicalLeft(); |
| 663 float rootRight = box->root().logicalRight(); | 663 float rootRight = box->root().logicalRight(); |
| 664 | 664 |
| 665 // FIXME: should we use the width of the root inline box or the | 665 // FIXME: should we use the width of the root inline box or the |
| 666 // width of the containing block for this? | 666 // width of the containing block for this? |
| 667 if (extraWidthToEndOfLine) | 667 if (extraWidthToEndOfLine) |
| 668 *extraWidthToEndOfLine = (box->root().logicalWidth() + rootLeft) - (left
+ 1); | 668 *extraWidthToEndOfLine = (box->root().logicalWidth() + rootLeft) - (left
+ 1); |
| 669 | 669 |
| 670 RenderBlock* cb = containingBlock(); | 670 RenderBlock* cb = containingBlock(); |
| 671 RenderStyle* cbStyle = cb->style(); | 671 const RenderStyle* cbStyle = cb->style(); |
| 672 | 672 |
| 673 float leftEdge; | 673 float leftEdge; |
| 674 float rightEdge; | 674 float rightEdge; |
| 675 leftEdge = std::min<float>(0, rootLeft); | 675 leftEdge = std::min<float>(0, rootLeft); |
| 676 rightEdge = std::max<float>(cb->logicalWidth().toFloat(), rootRight); | 676 rightEdge = std::max<float>(cb->logicalWidth().toFloat(), rootRight); |
| 677 | 677 |
| 678 bool rightAligned = false; | 678 bool rightAligned = false; |
| 679 switch (cbStyle->textAlign()) { | 679 switch (cbStyle->textAlign()) { |
| 680 case RIGHT: | 680 case RIGHT: |
| 681 case WEBKIT_RIGHT: | 681 case WEBKIT_RIGHT: |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 return combineText->combinedTextWidth(f); | 720 return combineText->combinedTextWidth(f); |
| 721 } | 721 } |
| 722 | 722 |
| 723 if (f.isFixedPitch() && f.fontDescription().variant() == FontVariantNormal &
& m_isAllASCII && (!glyphOverflow || !glyphOverflow->computeBounds)) { | 723 if (f.isFixedPitch() && f.fontDescription().variant() == FontVariantNormal &
& m_isAllASCII && (!glyphOverflow || !glyphOverflow->computeBounds)) { |
| 724 bool missingGlyph = false; | 724 bool missingGlyph = false; |
| 725 float monospaceCharacterWidth = f.spaceWidth(); | 725 float monospaceCharacterWidth = f.spaceWidth(); |
| 726 float w = 0; | 726 float w = 0; |
| 727 bool isSpace; | 727 bool isSpace; |
| 728 ASSERT(m_text); | 728 ASSERT(m_text); |
| 729 StringImpl& text = *m_text.impl(); | 729 StringImpl& text = *m_text.impl(); |
| 730 RenderStyle* renderStyle = style(); | 730 const RenderStyle* renderStyle = style(); |
| 731 for (int i = start; i < start + len; i++) { | 731 for (int i = start; i < start + len; i++) { |
| 732 char c = text[i]; | 732 char c = text[i]; |
| 733 // If glyph is not present in primary font then we cannot calculate
width based on primary | 733 // If glyph is not present in primary font then we cannot calculate
width based on primary |
| 734 // font property, we need to call "width" method of Font Object. | 734 // font property, we need to call "width" method of Font Object. |
| 735 if (!f.primaryFontHasGlyphForCharacter(text[i])) { | 735 if (!f.primaryFontHasGlyphForCharacter(text[i])) { |
| 736 missingGlyph = true; | 736 missingGlyph = true; |
| 737 break; | 737 break; |
| 738 } | 738 } |
| 739 if (c <= space) { | 739 if (c <= space) { |
| 740 if (c == space || c == newlineCharacter) { | 740 if (c == space || c == newlineCharacter) { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 GlyphOverflow glyphOverflow; | 886 GlyphOverflow glyphOverflow; |
| 887 computePreferredLogicalWidths(leadWidth, fallbackFonts, glyphOverflow); | 887 computePreferredLogicalWidths(leadWidth, fallbackFonts, glyphOverflow); |
| 888 | 888 |
| 889 // We shouldn't change our mind once we "know". | 889 // We shouldn't change our mind once we "know". |
| 890 ASSERT(!m_knownToHaveNoOverflowAndNoFallbackFonts || (fallbackFonts.isEmpty(
) && glyphOverflow.isZero())); | 890 ASSERT(!m_knownToHaveNoOverflowAndNoFallbackFonts || (fallbackFonts.isEmpty(
) && glyphOverflow.isZero())); |
| 891 m_knownToHaveNoOverflowAndNoFallbackFonts = fallbackFonts.isEmpty() && glyph
Overflow.isZero(); | 891 m_knownToHaveNoOverflowAndNoFallbackFonts = fallbackFonts.isEmpty() && glyph
Overflow.isZero(); |
| 892 } | 892 } |
| 893 | 893 |
| 894 static inline float hyphenWidth(RenderText* renderer, const Font& font, TextDire
ction direction) | 894 static inline float hyphenWidth(RenderText* renderer, const Font& font, TextDire
ction direction) |
| 895 { | 895 { |
| 896 RenderStyle* style = renderer->style(); | 896 const RenderStyle* style = renderer->style(); |
| 897 return font.width(constructTextRun(renderer, font, style->hyphenString().str
ing(), style, direction)); | 897 return font.width(constructTextRun(renderer, font, style->hyphenString().str
ing(), style, direction)); |
| 898 } | 898 } |
| 899 | 899 |
| 900 void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
mpleFontData*>& fallbackFonts, GlyphOverflow& glyphOverflow) | 900 void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
mpleFontData*>& fallbackFonts, GlyphOverflow& glyphOverflow) |
| 901 { | 901 { |
| 902 ASSERT(m_hasTab || preferredLogicalWidthsDirty() || !m_knownToHaveNoOverflow
AndNoFallbackFonts); | 902 ASSERT(m_hasTab || preferredLogicalWidthsDirty() || !m_knownToHaveNoOverflow
AndNoFallbackFonts); |
| 903 | 903 |
| 904 m_minWidth = 0; | 904 m_minWidth = 0; |
| 905 m_maxWidth = 0; | 905 m_maxWidth = 0; |
| 906 m_firstLineMinWidth = 0; | 906 m_firstLineMinWidth = 0; |
| 907 m_lastLineLineMinWidth = 0; | 907 m_lastLineLineMinWidth = 0; |
| 908 | 908 |
| 909 if (isBR()) | 909 if (isBR()) |
| 910 return; | 910 return; |
| 911 | 911 |
| 912 float currMinWidth = 0; | 912 float currMinWidth = 0; |
| 913 float currMaxWidth = 0; | 913 float currMaxWidth = 0; |
| 914 m_hasBreakableChar = false; | 914 m_hasBreakableChar = false; |
| 915 m_hasBreak = false; | 915 m_hasBreak = false; |
| 916 m_hasTab = false; | 916 m_hasTab = false; |
| 917 m_hasBreakableStart = false; | 917 m_hasBreakableStart = false; |
| 918 m_hasBreakableEnd = false; | 918 m_hasBreakableEnd = false; |
| 919 m_hasEndWhiteSpace = false; | 919 m_hasEndWhiteSpace = false; |
| 920 | 920 |
| 921 RenderStyle* styleToUse = style(); | 921 const RenderStyle* styleToUse = style(); |
| 922 const Font& f = styleToUse->font(); // FIXME: This ignores first-line. | 922 const Font& f = styleToUse->font(); // FIXME: This ignores first-line. |
| 923 float wordSpacing = styleToUse->wordSpacing(); | 923 float wordSpacing = styleToUse->wordSpacing(); |
| 924 int len = textLength(); | 924 int len = textLength(); |
| 925 LazyLineBreakIterator breakIterator(m_text, styleToUse->locale()); | 925 LazyLineBreakIterator breakIterator(m_text, styleToUse->locale()); |
| 926 bool needsWordSpacing = false; | 926 bool needsWordSpacing = false; |
| 927 bool ignoringSpaces = false; | 927 bool ignoringSpaces = false; |
| 928 bool isSpace = false; | 928 bool isSpace = false; |
| 929 bool firstWord = true; | 929 bool firstWord = true; |
| 930 bool firstLine = true; | 930 bool firstLine = true; |
| 931 int nextBreakable = -1; | 931 int nextBreakable = -1; |
| (...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1882 } | 1882 } |
| 1883 secureTextTimer->restartWithNewText(lastTypedCharacterOffset); | 1883 secureTextTimer->restartWithNewText(lastTypedCharacterOffset); |
| 1884 } | 1884 } |
| 1885 | 1885 |
| 1886 PassRefPtr<AbstractInlineTextBox> RenderText::firstAbstractInlineTextBox() | 1886 PassRefPtr<AbstractInlineTextBox> RenderText::firstAbstractInlineTextBox() |
| 1887 { | 1887 { |
| 1888 return AbstractInlineTextBox::getOrCreate(this, m_firstTextBox); | 1888 return AbstractInlineTextBox::getOrCreate(this, m_firstTextBox); |
| 1889 } | 1889 } |
| 1890 | 1890 |
| 1891 } // namespace blink | 1891 } // namespace blink |
| OLD | NEW |