Changeset 176263 in webkit
- Timestamp:
- Nov 18, 2014, 10:04:13 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 14 edited
- 2 moved
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/platform/mac/fast/css3-text/css3-text-decoration/text-decoration-thickness-expected.html (moved) (moved from trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thickness-expected.html )
-
LayoutTests/platform/mac/fast/css3-text/css3-text-decoration/text-decoration-thickness.html (moved) (moved from trunk/LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thickness.html ) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/platform/graphics/FontMetrics.h (modified) (3 diffs)
-
Source/WebCore/platform/graphics/SimpleFontData.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/ios/SimpleFontDataIOS.mm (modified) (4 diffs)
-
Source/WebCore/platform/graphics/mac/SimpleFontDataMac.mm (modified) (2 diffs)
-
Source/WebCore/platform/graphics/win/SimpleFontDataCGWin.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/win/SimpleFontDataCairoWin.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/win/SimpleFontDataWin.cpp (modified) (1 diff)
-
Source/WebCore/rendering/InlineTextBox.cpp (modified) (2 diffs)
-
Source/WebCore/style/InlineTextBoxStyle.cpp (modified) (3 diffs)
-
Source/WebCore/style/InlineTextBoxStyle.h (modified) (2 diffs)
-
Source/WebCore/svg/SVGFontData.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r176262 r176263 1 2014-11-18 Myles C. Maxfield <litherum@gmail.com> 2 3 Use underlining metrics from the font file 4 https://bugs.webkit.org/show_bug.cgi?id=138762 5 6 Reviewed by Dave Hyatt. 7 8 This patch makes underline placement platform-dependent. 9 10 * platform/mac/fast/css3-text/css3-text-decoration/text-decoration-thickness-expected.html: Renamed from LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thickness-expected.html. 11 * platform/mac/fast/css3-text/css3-text-decoration/text-decoration-thickness.html: Renamed from LayoutTests/fast/css3-text/css3-text-decoration/text-decoration-thickness.html. 12 1 13 2014-11-17 David Hyatt <hyatt@apple.com> 2 14 -
trunk/LayoutTests/platform/mac/fast/css3-text/css3-text-decoration/text-decoration-thickness.html
r176262 r176263 8 8 to text size. The comparison is to a box that has its background color set. 9 9 <div style="position: relative; width: 600px; height: 600px; overflow: hidden;"> 10 <div style="font-family: Ahem; text-decoration: underline; font-size: 10000px; position: absolute; left: 0px; top: -8350px;"> </div>10 <div style="font-family: Ahem; text-decoration: underline; font-size: 31000px; position: absolute; left: 0px; top: -28925px;"> </div> 11 11 </div> 12 12 </body> -
trunk/Source/WebCore/ChangeLog
r176262 r176263 1 2014-11-18 Myles C. Maxfield <litherum@gmail.com> 2 3 Use underlining metrics from the font file 4 https://bugs.webkit.org/show_bug.cgi?id=138762 5 6 Reviewed by Dave Hyatt. 7 8 Test: platform/mac/fast/css3-text/css3-text-decoration/text-decoration-thickness.html 9 10 * platform/graphics/FontMetrics.h: Adding variables for text decoration thickness and 11 underline position. 12 (WebCore::FontMetrics::FontMetrics): 13 (WebCore::FontMetrics::decorationThickness): 14 (WebCore::FontMetrics::setDecorationThickness): 15 (WebCore::FontMetrics::underlinePosition): 16 (WebCore::FontMetrics::setUnderlinePosition): 17 * platform/graphics/freetype/SimpleFontDataFreeType.cpp: 18 (WebCore::SimpleFontData::platformInit): Initialize new FontMetrics members. 19 * platform/graphics/ios/SimpleFontDataIOS.mm: 20 (WebCore::SimpleFontData::platformInit): Ditto. 21 * platform/graphics/mac/SimpleFontDataMac.mm: 22 (WebCore::SimpleFontData::platformInit): Ditto. 23 * platform/graphics/win/SimpleFontDataCGWin.cpp: 24 (WebCore::SimpleFontData::platformInit): Ditto. 25 * platform/graphics/win/SimpleFontDataCairoWin.cpp: 26 (WebCore::SimpleFontData::platformInit): Ditto. 27 * platform/graphics/win/SimpleFontDataWin.cpp: 28 (WebCore::SimpleFontData::initGDIFont): Ditto. 29 * rendering/InlineTextBox.cpp: 30 (WebCore::InlineTextBox::paintDecoration): Use FontMetrics data. 31 * style/InlineTextBoxStyle.cpp: 32 (WebCore::computeUnderlineOffset): Ditto. 33 (WebCore::visualOverflowForDecorations): Ditto. 34 * style/InlineTextBoxStyle.h: 35 (WebCore::textDecorationStrokeThickness): Deleted. 36 * svg/SVGFontData.cpp: 37 (WebCore::SVGFontData::initializeFontData): Initialize new FontMetrics members. 38 1 39 2014-11-17 David Hyatt <hyatt@apple.com> 2 40 -
trunk/Source/WebCore/platform/graphics/FontMetrics.h
r173217 r176263 38 38 , m_xHeight(0) 39 39 , m_zeroWidth(0) 40 , m_decorationThickness(1) 41 , m_underlinePosition(1) 40 42 , m_hasXHeight(false) 41 43 , m_hasZeroWidth(false) … … 133 135 void setHasZeroWidth(bool hasZeroWidth) { m_hasZeroWidth = hasZeroWidth; } 134 136 137 float decorationThickness() const { return m_decorationThickness; } 138 void setDecorationThickness(float decorationThickness) { m_decorationThickness = decorationThickness; } 139 140 float underlinePosition() const { return m_underlinePosition; } 141 void setUnderlinePosition(float underlinePosition) { m_underlinePosition = underlinePosition; } 142 135 143 private: 136 144 friend class SimpleFontData; … … 155 163 float m_capHeight; 156 164 float m_zeroWidth; 165 float m_decorationThickness; 166 float m_underlinePosition; 157 167 bool m_hasXHeight; 158 168 bool m_hasCapHeight; -
trunk/Source/WebCore/platform/graphics/SimpleFontData.h
r176140 r176263 363 363 } 364 364 365 static inline void populateDecorationMetrics(float fontSize, float& decorationThickness, float& underlinePosition) 366 { 367 // Decoration underlines should be proportional to the font size 368 decorationThickness = fontSize / 16.0f; 369 // An amount to lower the underline below the baseline 370 underlinePosition = std::max(1.0f, ceilf(decorationThickness / 2.0)); 371 } 372 365 373 } // namespace WebCore 366 374 -
trunk/Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp
r174002 r176263 66 66 float capHeight = narrowPrecisionToFloat(fontExtents.height); 67 67 float lineGap = narrowPrecisionToFloat(fontExtents.height - fontExtents.ascent - fontExtents.descent); 68 float decorationThickness; 69 float underlinePosition; 70 populateDecorationMetrics(m_platformData.m_size, decorationThickness, underlinePosition); 68 71 69 72 m_fontMetrics.setAscent(ascent); 70 73 m_fontMetrics.setDescent(descent); 71 74 m_fontMetrics.setCapHeight(capHeight); 75 m_fontMetrics.setDecorationThickness(decorationThickness); 76 m_fontMetrics.setUnderlinePosition(underlinePosition); 72 77 73 78 #if PLATFORM(EFL) -
trunk/Source/WebCore/platform/graphics/ios/SimpleFontDataIOS.mm
r176140 r176263 80 80 float lineSpacing; 81 81 float xHeight; 82 float decorationThickness; 83 float underlinePosition; 82 84 RetainPtr<CFStringRef> familyName; 83 85 if (CTFontRef ctFont = m_platformData.font()) { … … 88 90 lineGap = fontService.lineGap(); 89 91 xHeight = fontService.xHeight(); 92 decorationThickness = CTFontGetUnderlineThickness(ctFont); 93 underlinePosition = -CTFontGetUnderlinePosition(ctFont); 90 94 capHeight = fontService.capHeight(); 91 95 unitsPerEm = fontService.unitsPerEm(); … … 102 106 xHeight = scaleEmToUnits(CGFontGetXHeight(cgFont), unitsPerEm) * pointSize; 103 107 capHeight = scaleEmToUnits(CGFontGetCapHeight(cgFont), unitsPerEm) * pointSize; 108 float decorationThickness; 109 float underlinePosition; 110 populateDecorationMetrics(m_platformData.size(), decorationThickness, underlinePosition); 104 111 105 112 lineSpacing = ascent + descent + lineGap; … … 114 121 m_fontMetrics.setXHeight(xHeight); 115 122 m_fontMetrics.setCapHeight(capHeight); 123 m_fontMetrics.setDecorationThickness(decorationThickness); 124 m_fontMetrics.setUnderlinePosition(underlinePosition); 116 125 m_shouldNotBeUsedForArabic = fontFamilyShouldNotBeUsedForArabic(familyName.get()); 117 126 -
trunk/Source/WebCore/platform/graphics/mac/SimpleFontDataMac.mm
r176229 r176263 194 194 195 195 float lineGap = scaleEmToUnits(iLineGap, unitsPerEm) * pointSize; 196 float decorationThickness = CTFontGetUnderlineThickness(m_platformData.ctFont()); 197 float underlinePosition = -CTFontGetUnderlinePosition(m_platformData.ctFont()); 196 198 197 199 // We need to adjust Times, Helvetica, and Courier to closely match the … … 237 239 m_fontMetrics.setLineGap(lineGap); 238 240 m_fontMetrics.setXHeight(xHeight); 241 m_fontMetrics.setDecorationThickness(decorationThickness); 242 m_fontMetrics.setUnderlinePosition(underlinePosition); 239 243 } 240 244 -
trunk/Source/WebCore/platform/graphics/win/SimpleFontDataCGWin.cpp
r173840 r176263 70 70 float fCapHeight = scaleEmToUnits(iCapHeight, unitsPerEm) * pointSize; 71 71 float fLineGap = scaleEmToUnits(iLineGap, unitsPerEm) * pointSize; 72 float decorationThickness; 73 float underlinePosition; 74 populateDecorationMetrics(m_platformData.size(), decorationThickness, underlinePosition); 72 75 73 76 if (!isCustomFont()) { … … 88 91 m_fontMetrics.setLineGap(fLineGap); 89 92 m_fontMetrics.setLineSpacing(lroundf(fAscent) + lroundf(fDescent) + lroundf(fLineGap)); 93 m_fontMetrics.setDecorationThickness(decorationThickness); 94 m_fontMetrics.setUnderlinePosition(underlinePosition); 90 95 91 96 GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page(); -
trunk/Source/WebCore/platform/graphics/win/SimpleFontDataCairoWin.cpp
r165676 r176263 77 77 float xHeight = ascent * 0.56f; // Best guess for xHeight for non-Truetype fonts. 78 78 float lineGap = textMetrics.tmExternalLeading * metricsMultiplier; 79 float decorationThickness; 80 float underlinePosition; 81 populateDecorationMetrics(m_platformData.size(), decorationThickness, underlinePosition); 79 82 80 83 int faceLength = ::GetTextFace(dc, 0, 0); … … 89 92 m_fontMetrics.setLineGap(lineGap); 90 93 m_fontMetrics.setLineSpacing(lroundf(ascent) + lroundf(descent) + lroundf(lineGap)); 94 m_fontMetrics.setDecorationThickness(decorationThickness); 95 m_fontMetrics.setUnderlinePosition(underlinePosition); 91 96 m_avgCharWidth = textMetrics.tmAveCharWidth * metricsMultiplier; 92 97 m_maxCharWidth = textMetrics.tmMaxCharWidth * metricsMultiplier; -
trunk/Source/WebCore/platform/graphics/win/SimpleFontDataWin.cpp
r174465 r176263 90 90 float descent = textMetrics.tmDescent; 91 91 float lineGap = textMetrics.tmExternalLeading; 92 float decorationThickness; 93 float underlinePosition; 94 populateDecorationMetrics(m_platformData.size(), decorationThickness, underlinePosition); 92 95 m_fontMetrics.setAscent(ascent); 93 96 m_fontMetrics.setDescent(descent); 94 97 m_fontMetrics.setLineGap(lineGap); 95 98 m_fontMetrics.setLineSpacing(lroundf(ascent) + lroundf(descent) + lroundf(lineGap)); 99 m_fontMetrics.setDecorationThickness(decorationThickness); 100 m_fontMetrics.setUnderlinePosition(underlinePosition); 96 101 m_avgCharWidth = textMetrics.tmAveCharWidth; 97 102 m_maxCharWidth = textMetrics.tmMaxCharWidth; -
trunk/Source/WebCore/rendering/InlineTextBox.cpp
r176147 r176263 926 926 bool isPrinting = renderer().document().printing(); 927 927 928 float textDecorationThickness = textDecorationStrokeThickness(renderer().style().fontSize());928 float textDecorationThickness = renderer().style().fontMetrics().decorationThickness(); 929 929 context.setStrokeThickness(textDecorationThickness); 930 930 … … 978 978 if (decoration & TextDecorationUnderline) { 979 979 context.setStrokeColor(underline, colorSpace); 980 const int underlineOffset = computeUnderlineOffset(lineStyle.textUnderlinePosition(), lineStyle.fontMetrics(), this , textDecorationThickness);980 const int underlineOffset = computeUnderlineOffset(lineStyle.textUnderlinePosition(), lineStyle.fontMetrics(), this); 981 981 982 982 switch (decorationStyle) { -
trunk/Source/WebCore/style/InlineTextBoxStyle.cpp
r169089 r176263 33 33 namespace WebCore { 34 34 35 int computeUnderlineOffset(TextUnderlinePosition underlinePosition, const FontMetrics& fontMetrics, InlineTextBox* inlineTextBox , int textDecorationThickness)35 int computeUnderlineOffset(TextUnderlinePosition underlinePosition, const FontMetrics& fontMetrics, InlineTextBox* inlineTextBox) 36 36 { 37 37 // This represents the gap between the baseline and the closest edge of the underline. 38 int gap = std::max<int>(1, ceilf(textDecorationThickness / 2.0));38 float gap = fontMetrics.underlinePosition(); 39 39 40 40 // According to the specification TextUnderlinePositionAuto should default to 'alphabetic' for horizontal text … … 84 84 return GlyphOverflow(); 85 85 86 float strokeThickness = textDecorationStrokeThickness(lineStyle.fontSize());86 float strokeThickness = lineStyle.fontMetrics().decorationThickness(); 87 87 float controlPointDistance; 88 88 float step; … … 102 102 // These metrics must match where underlines get drawn. 103 103 if (decoration & TextDecorationUnderline) { 104 float underlineOffset = computeUnderlineOffset(lineStyle.textUnderlinePosition(), lineStyle.fontMetrics(), inlineTextBox , strokeThickness);104 float underlineOffset = computeUnderlineOffset(lineStyle.textUnderlinePosition(), lineStyle.fontMetrics(), inlineTextBox); 105 105 if (decorationStyle == TextDecorationStyleWavy) { 106 106 extendIntToFloat(overflowResult.bottom, underlineOffset + wavyOffset + controlPointDistance + strokeThickness - height); -
trunk/Source/WebCore/style/InlineTextBoxStyle.h
r169089 r176263 34 34 class InlineTextBox; 35 35 36 inline float textDecorationStrokeThickness(float fontSize)37 {38 const float textDecorationBaseFontSize = 16;39 return fontSize / textDecorationBaseFontSize;40 }41 42 36 inline float wavyOffsetFromDecoration() 43 37 { … … 47 41 GlyphOverflow visualOverflowForDecorations(const RenderStyle& lineStyle, InlineTextBox*); 48 42 void getWavyStrokeParameters(float strokeThickness, float& controlPointDistance, float& step); 49 int computeUnderlineOffset(TextUnderlinePosition, const FontMetrics&, InlineTextBox* , int textDecorationThickness);43 int computeUnderlineOffset(TextUnderlinePosition, const FontMetrics&, InlineTextBox*); 50 44 51 45 } -
trunk/Source/WebCore/svg/SVGFontData.cpp
r174619 r176263 80 80 float descent = svgFontFaceElement->descent() * scale; 81 81 float lineGap = 0.1f * fontSize; 82 float decorationThickness; 83 float underlinePosition; 84 populateDecorationMetrics(fontSize, decorationThickness, underlinePosition); 82 85 83 86 GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(fontData, 0)->page(); … … 96 99 fontMetrics.setLineSpacing(roundf(ascent) + roundf(descent) + roundf(lineGap)); 97 100 fontMetrics.setXHeight(xHeight); 101 fontMetrics.setDecorationThickness(decorationThickness); 102 fontMetrics.setUnderlinePosition(underlinePosition); 98 103 99 104 if (!glyphPageZero) {
Note:
See TracChangeset
for help on using the changeset viewer.