Changeset 193929 in webkit
- Timestamp:
- Dec 10, 2015, 3:30:41 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r193922 r193929 1 2015-12-10 Zalan Bujtas <zalan@apple.com> 2 3 TextPainter: Add support for painting multiple text runs. 4 https://bugs.webkit.org/show_bug.cgi?id=152148 5 6 Reviewed by Simon Fraser. 7 8 This is in preparation for adding simple line layout as a client. 9 10 No change in functionality. 11 12 * rendering/InlineTextBox.cpp: 13 (WebCore::drawSkipInkUnderline): Decouple underline skipping intersection calculation and text painter. 14 (WebCore::InlineTextBox::paint): 15 (WebCore::InlineTextBox::paintDecoration): 16 * rendering/InlineTextBox.h: 17 * rendering/TextPainter.cpp: 18 (WebCore::TextPainter::TextPainter): 19 (WebCore::TextPainter::paintTextWithShadows): 20 (WebCore::TextPainter::paintTextAndEmphasisMarksIfNeeded): 21 (WebCore::TextPainter::paintText): 22 (WebCore::TextPainter::dashesForIntersectionsWithRect): Deleted. 23 * rendering/TextPainter.h: 24 (WebCore::TextPainter::setTextPaintStyle): 25 (WebCore::TextPainter::setSelectionPaintStyle): 26 (WebCore::TextPainter::setIsHorizontal): 27 (WebCore::TextPainter::setFont): 28 (WebCore::TextPainter::addEmphasis): 29 (WebCore::TextPainter::addTextShadow): 30 1 31 2015-12-10 Enrica Casucci <enrica@apple.com> 2 32 -
trunk/Source/WebCore/rendering/InlineTextBox.cpp
r193857 r193929 120 120 } 121 121 122 static void drawSkipInkUnderline(TextPainter& textPainter, GraphicsContext& context, FloatPoint localOrigin, float underlineOffset, float width, bool isPrinting, bool doubleLines) 122 static void drawSkipInkUnderline(GraphicsContext& context, const FontCascade& font, const TextRun& textRun, const FloatPoint& textOrigin, const FloatPoint& localOrigin, 123 float underlineOffset, float width, bool isPrinting, bool doubleLines) 123 124 { 124 125 FloatPoint adjustedLocalOrigin = localOrigin; 125 126 adjustedLocalOrigin.move(0, underlineOffset); 126 127 FloatRect underlineBoundingBox = context.computeLineBoundsForText(adjustedLocalOrigin, width, isPrinting); 127 DashArray intersections = textPainter.dashesForIntersectionsWithRect(underlineBoundingBox);128 DashArray intersections = font.dashesForIntersectionsWithRect(textRun, textOrigin, underlineBoundingBox); 128 129 DashArray a = translateIntersectionPointsToSkipInkBoundaries(intersections, underlineBoundingBox.height(), width); 129 130 130 ASSERT(!(a.size() % 2)); 131 131 context.drawLinesForText(adjustedLocalOrigin, a, isPrinting, doubleLines); … … 613 613 textOrigin.setX(roundToDevicePixel(LayoutUnit(textOrigin.x()), renderer().document().deviceScaleFactor())); 614 614 615 TextPainter textPainter(context, paintSelectedTextOnly, paintSelectedTextSeparately, font, selectionStart, selectionEnd, length, emphasisMark, combinedText, textRun, boxRect, textOrigin, emphasisMarkOffset, textShadow, selectionShadow, isHorizontal(), textPaintStyle, selectionPaintStyle); 616 textPainter.paintText(); 615 TextPainter textPainter(context); 616 textPainter.setFont(font); 617 textPainter.setTextPaintStyle(textPaintStyle); 618 textPainter.setSelectionPaintStyle(selectionPaintStyle); 619 textPainter.setIsHorizontal(isHorizontal()); 620 textPainter.addTextShadow(textShadow, selectionShadow); 621 textPainter.addEmphasis(emphasisMark, emphasisMarkOffset, combinedText); 622 623 textPainter.paintText(textRun, length, boxRect, textOrigin, selectionStart, selectionEnd, paintSelectedTextOnly, paintSelectedTextSeparately); 617 624 618 625 // Paint decorations … … 622 629 if (combinedText) 623 630 context.concatCTM(rotation(boxRect, Clockwise)); 624 paintDecoration(context, boxOrigin, textDecorations, textShadow, textPainter);631 paintDecoration(context, font, textRun, textOrigin, boxOrigin, textDecorations, textShadow); 625 632 if (combinedText) 626 633 context.concatCTM(rotation(boxRect, Counterclockwise)); … … 895 902 } 896 903 897 void InlineTextBox::paintDecoration(GraphicsContext& context, const FloatPoint& boxOrigin, TextDecoration decoration, const ShadowData* shadow, TextPainter& textPainter) 904 void InlineTextBox::paintDecoration(GraphicsContext& context, const FontCascade& font, const TextRun& textRun, const FloatPoint& textOrigin, const FloatPoint& boxOrigin, 905 TextDecoration decoration, const ShadowData* shadow) 898 906 { 899 907 #if !ENABLE(CSS3_TEXT_DECORATION_SKIP_INK) 900 UNUSED_PARAM(textPainter); 908 UNUSED_PARAM(font); 909 UNUSED_PARAM(textRun); 910 UNUSED_PARAM(textOrigin); 901 911 #endif 902 903 912 if (m_truncation == cFullTruncation) 904 913 return; … … 986 995 #if ENABLE(CSS3_TEXT_DECORATION_SKIP_INK) 987 996 if ((lineStyle.textDecorationSkip() == TextDecorationSkipInk || lineStyle.textDecorationSkip() == TextDecorationSkipAuto) && isHorizontal()) { 988 if (!context.paintingDisabled()) { 989 drawSkipInkUnderline(textPainter, context, localOrigin, underlineOffset, width, isPrinting, underlineStyle == TextDecorationStyleDouble); 990 } 997 if (!context.paintingDisabled()) 998 drawSkipInkUnderline(context, font, textRun, textOrigin, localOrigin, underlineOffset, width, isPrinting, underlineStyle == TextDecorationStyleDouble); 991 999 } else 992 1000 // FIXME: Need to support text-decoration-skip: none. … … 1009 1017 if ((lineStyle.textDecorationSkip() == TextDecorationSkipInk || lineStyle.textDecorationSkip() == TextDecorationSkipAuto) && isHorizontal()) { 1010 1018 if (!context.paintingDisabled()) 1011 drawSkipInkUnderline( textPainter, context, localOrigin, 0, width, isPrinting, overlineStyle == TextDecorationStyleDouble);1019 drawSkipInkUnderline(context, font, textRun, textOrigin, localOrigin, 0, width, isPrinting, overlineStyle == TextDecorationStyleDouble); 1012 1020 } else 1013 1021 // FIXME: Need to support text-decoration-skip: none. -
trunk/Source/WebCore/rendering/InlineTextBox.h
r190363 r193929 160 160 161 161 private: 162 void paintDecoration(GraphicsContext&, const F loatPoint& boxOrigin, TextDecoration, const ShadowData*, TextPainter&);162 void paintDecoration(GraphicsContext&, const FontCascade&, const TextRun&, const FloatPoint& textOrigin, const FloatPoint& boxOrigin, TextDecoration, const ShadowData*); 163 163 void paintSelection(GraphicsContext&, const FloatPoint& boxOrigin, const RenderStyle&, const FontCascade&, Color textColor); 164 164 void paintDocumentMarker(GraphicsContext&, const FloatPoint& boxOrigin, RenderedDocumentMarker&, const RenderStyle&, const FontCascade&, bool grammar); -
trunk/Source/WebCore/rendering/TextPainter.cpp
r193891 r193929 27 27 #include "InlineTextBox.h" 28 28 #include "RenderCombineText.h" 29 #include "TextPaintStyle.h"30 29 #include <wtf/NeverDestroyed.h> 31 30 … … 80 79 } 81 80 82 TextPainter::TextPainter(GraphicsContext& context, bool paintSelectedTextOnly, bool paintSelectedTextSeparately, const FontCascade& font, int selectionStart, 83 int selectionEnd, int length, const AtomicString& emphasisMark, RenderCombineText* combinedText, TextRun& textRun, FloatRect& boxRect, 84 FloatPoint& textOrigin, int emphasisMarkOffset, const ShadowData* textShadow, const ShadowData* selectionShadow, bool textBoxIsHorizontal, 85 TextPaintStyle& textPaintStyle, TextPaintStyle& selectionPaintStyle) 81 TextPainter::TextPainter(GraphicsContext& context) 86 82 : m_context(context) 87 , m_textPaintStyle(textPaintStyle)88 , m_selectionPaintStyle(selectionPaintStyle)89 , m_textShadow(textShadow)90 , m_selectionShadow(selectionShadow)91 , m_paintSelectedTextOnly(paintSelectedTextOnly)92 , m_paintSelectedTextSeparately(paintSelectedTextSeparately)93 , m_font(font)94 , m_selectionStart(selectionStart)95 , m_selectionEnd(selectionEnd)96 , m_length(length)97 , m_emphasisMark(emphasisMark)98 , m_combinedText(combinedText)99 , m_textRun(textRun)100 , m_boxRect(boxRect)101 , m_textOrigin(textOrigin)102 , m_emphasisMarkOffset(emphasisMarkOffset)103 , m_textBoxIsHorizontal(textBoxIsHorizontal)104 83 { 105 84 } … … 115 94 } 116 95 117 void TextPainter::paintTextWithShadows(const ShadowData* shadow, const FontCascade& font, const TextRun& textRun, const AtomicString& emphasisMark,118 int emphasisMarkOffset, int startOffset, int endOffset, const FloatPoint& textOrigin, bool stroked)96 void TextPainter::paintTextWithShadows(const ShadowData* shadow, const FontCascade& font, const TextRun& textRun, const FloatRect& boxRect, const FloatPoint& textOrigin, 97 int startOffset, int endOffset, const AtomicString& emphasisMark, int emphasisMarkOffset, bool stroked) 119 98 { 120 99 if (!shadow) { … … 129 108 m_context.setFillColor(Color::black); 130 109 while (shadow) { 131 ShadowApplier shadowApplier(m_context, shadow, m_boxRect, lastShadowIterationShouldDrawText, opaque, m_textBoxIsHorizontal ? Horizontal : Vertical);110 ShadowApplier shadowApplier(m_context, shadow, boxRect, lastShadowIterationShouldDrawText, opaque, m_textBoxIsHorizontal ? Horizontal : Vertical); 132 111 if (!shadowApplier.nothingToDraw()) 133 112 drawTextOrEmphasisMarks(font, textRun, emphasisMark, emphasisMarkOffset, textOrigin + shadowApplier.extraOffset(), startOffset, endOffset); … … 142 121 } 143 122 144 void TextPainter::paintTextAndEmphasisMarksIfNeeded(int startOffset, int endOffset, const TextPaintStyle& paintStyle, const ShadowData* shadow) 123 void TextPainter::paintTextAndEmphasisMarksIfNeeded(const TextRun& textRun, const FloatRect& boxRect, const FloatPoint& textOrigin, int startOffset, int endOffset, 124 const TextPaintStyle& paintStyle, const ShadowData* shadow) 145 125 { 146 126 // FIXME: Truncate right-to-left text correctly. 147 paintTextWithShadows(shadow, m_font, m_textRun, nullAtom, 0, startOffset, endOffset, m_textOrigin, paintStyle.strokeWidth > 0);127 paintTextWithShadows(shadow, *m_font, textRun, boxRect, textOrigin, startOffset, endOffset, nullAtom, 0, paintStyle.strokeWidth > 0); 148 128 149 129 if (m_emphasisMark.isEmpty()) 150 130 return; 151 131 152 FloatPoint boxOrigin = m_boxRect.location();132 FloatPoint boxOrigin = boxRect.location(); 153 133 updateGraphicsContext(m_context, paintStyle, UseEmphasisMarkColor); 154 134 static NeverDestroyed<TextRun> objectReplacementCharacterTextRun(StringView(&objectReplacementCharacter, 1)); 155 TextRun& emphasisMarkTextRun = m_combinedText ? objectReplacementCharacterTextRun.get() : m_textRun;156 FloatPoint emphasisMarkTextOrigin = m_combinedText ? FloatPoint(boxOrigin.x() + m_boxRect.width() / 2, boxOrigin.y() + m_font.fontMetrics().ascent()) : m_textOrigin;135 const TextRun& emphasisMarkTextRun = m_combinedText ? objectReplacementCharacterTextRun.get() : textRun; 136 FloatPoint emphasisMarkTextOrigin = m_combinedText ? FloatPoint(boxOrigin.x() + boxRect.width() / 2, boxOrigin.y() + m_font->fontMetrics().ascent()) : textOrigin; 157 137 if (m_combinedText) 158 m_context.concatCTM(rotation( m_boxRect, Clockwise));138 m_context.concatCTM(rotation(boxRect, Clockwise)); 159 139 160 140 // FIXME: Truncate right-to-left text correctly. 161 paintTextWithShadows(shadow, m_combinedText ? m_combinedText->originalFont() : m_font, emphasisMarkTextRun, m_emphasisMark, m_emphasisMarkOffset, startOffset, endOffset, emphasisMarkTextOrigin, paintStyle.strokeWidth > 0); 141 paintTextWithShadows(shadow, m_combinedText ? m_combinedText->originalFont() : *m_font, emphasisMarkTextRun, boxRect, emphasisMarkTextOrigin, startOffset, endOffset, 142 m_emphasisMark, m_emphasisMarkOffset, paintStyle.strokeWidth > 0); 162 143 163 144 if (m_combinedText) 164 m_context.concatCTM(rotation( m_boxRect, Counterclockwise));145 m_context.concatCTM(rotation(boxRect, Counterclockwise)); 165 146 } 166 147 167 void TextPainter::paintText() 148 void TextPainter::paintText(const TextRun& textRun, int length, const FloatRect& boxRect, const FloatPoint& textOrigin, int selectionStart, int selectionEnd, 149 bool paintSelectedTextOnly, bool paintSelectedTextSeparately) 168 150 { 169 if (!m_paintSelectedTextOnly) { 151 ASSERT(m_font); 152 if (!paintSelectedTextOnly) { 170 153 // For stroked painting, we have to change the text drawing mode. It's probably dangerous to leave that mutated as a side 171 154 // effect, so only when we know we're stroking, do a save/restore. 172 155 GraphicsContextStateSaver stateSaver(m_context, m_textPaintStyle.strokeWidth > 0); 173 156 updateGraphicsContext(m_context, m_textPaintStyle); 174 if ( m_paintSelectedTextSeparately) {157 if (paintSelectedTextSeparately) { 175 158 // Paint the before and after selection parts. 176 if ( m_selectionStart > 0)177 paintTextAndEmphasisMarksIfNeeded( 0, m_selectionStart, m_textPaintStyle, m_textShadow);178 if ( m_selectionEnd < m_length)179 paintTextAndEmphasisMarksIfNeeded( m_selectionEnd, m_length, m_textPaintStyle, m_textShadow);159 if (selectionStart > 0) 160 paintTextAndEmphasisMarksIfNeeded(textRun, boxRect, textOrigin, 0, selectionStart, m_textPaintStyle, m_textShadow); 161 if (selectionEnd < length) 162 paintTextAndEmphasisMarksIfNeeded(textRun, boxRect, textOrigin, selectionEnd, length, m_textPaintStyle, m_textShadow); 180 163 } else 181 paintTextAndEmphasisMarksIfNeeded( 0, m_length, m_textPaintStyle, m_textShadow);164 paintTextAndEmphasisMarksIfNeeded(textRun, boxRect, textOrigin, 0, length, m_textPaintStyle, m_textShadow); 182 165 } 183 166 184 167 // Paint only the text that is selected. 185 if (( m_paintSelectedTextOnly || m_paintSelectedTextSeparately) && m_selectionStart < m_selectionEnd) {168 if ((paintSelectedTextOnly || paintSelectedTextSeparately) && selectionStart < selectionEnd) { 186 169 GraphicsContextStateSaver stateSaver(m_context, m_selectionPaintStyle.strokeWidth > 0); 187 170 updateGraphicsContext(m_context, m_selectionPaintStyle); 188 paintTextAndEmphasisMarksIfNeeded( m_selectionStart, m_selectionEnd, m_selectionPaintStyle, m_selectionShadow);171 paintTextAndEmphasisMarksIfNeeded(textRun, boxRect, textOrigin, selectionStart, selectionEnd, m_selectionPaintStyle, m_selectionShadow); 189 172 } 190 173 } 191 174 192 #if ENABLE(CSS3_TEXT_DECORATION_SKIP_INK)193 DashArray TextPainter::dashesForIntersectionsWithRect(const FloatRect& lineExtents)194 {195 return m_font.dashesForIntersectionsWithRect(m_textRun, m_textOrigin, lineExtents);196 }197 #endif198 199 175 } // namespace WebCore -
trunk/Source/WebCore/rendering/TextPainter.h
r193891 r193929 25 25 26 26 #include "AffineTransform.h" 27 #include "DashArray.h"28 27 #include "RenderText.h" 29 28 #include "TextFlags.h" 29 #include "TextPaintStyle.h" 30 30 31 31 namespace WebCore { … … 45 45 class TextPainter { 46 46 public: 47 TextPainter(GraphicsContext&, bool paintSelectedTextOnly, bool paintSelectedTextSeparately, const FontCascade&, 48 int selectionStart, int selectionEnd, int length, const AtomicString& emphasisMark, RenderCombineText*, 49 TextRun&, FloatRect& boxRect, FloatPoint& textOrigin, int emphasisMarkOffset, const ShadowData* textShadow, const ShadowData* selectionShadow, 50 bool textBoxIsHorizontal, TextPaintStyle& nonSelectionPaintStyle, TextPaintStyle& selectionPaintStyle); 47 TextPainter(GraphicsContext&); 51 48 52 void paintText(); 53 #if ENABLE(CSS3_TEXT_DECORATION_SKIP_INK) 54 DashArray dashesForIntersectionsWithRect(const FloatRect& lineExtents); 55 #endif 49 void setTextPaintStyle(const TextPaintStyle& textPaintStyle) { m_textPaintStyle = textPaintStyle; } 50 void setSelectionPaintStyle(const TextPaintStyle& selectionPaintStyle) { m_selectionPaintStyle = selectionPaintStyle; } 51 void setIsHorizontal(bool isHorizontal) { m_textBoxIsHorizontal = isHorizontal; } 52 void setFont(const FontCascade& font) { m_font = &font; } 53 void addEmphasis(const AtomicString& emphasisMark, int emphasisMarkOffset, RenderCombineText*); 54 void addTextShadow(const ShadowData* textShadow, const ShadowData* selectionShadow); 55 56 void paintText(const TextRun&, int length, const FloatRect& boxRect, const FloatPoint& textOrigin, 57 int selectionStart, int selectionEnd, bool paintSelectedTextOnly, bool paintSelectedTextSeparately); 56 58 57 59 private: 58 60 void drawTextOrEmphasisMarks(const FontCascade&, const TextRun&, const AtomicString& emphasisMark, int emphasisMarkOffset, 59 61 const FloatPoint& textOrigin, int startOffset, int endOffset); 60 void paintTextWithShadows(const ShadowData*, const FontCascade&, const TextRun&, const AtomicString& emphasisMark, int emphasisMarkOffset, 61 int startOffset, int endOffset, const FloatPoint& textOrigin, bool stroked); 62 void paintTextAndEmphasisMarksIfNeeded(int startOffset, int endOffset, const TextPaintStyle&, const ShadowData*); 62 void paintTextWithShadows(const ShadowData*, const FontCascade&, const TextRun&, const FloatRect& boxRect, const FloatPoint& textOrigin, 63 int startOffset, int endOffset, const AtomicString& emphasisMark, int emphasisMarkOffset, bool stroked); 64 void paintTextAndEmphasisMarksIfNeeded(const TextRun&, const FloatRect& boxRect, const FloatPoint& textOrigin, int startOffset, int endOffset, 65 const TextPaintStyle&, const ShadowData*); 63 66 64 67 GraphicsContext& m_context; 65 TextPaintStyle& m_textPaintStyle; 66 TextPaintStyle& m_selectionPaintStyle; 67 const ShadowData* m_textShadow; 68 const ShadowData* m_selectionShadow; 69 bool m_paintSelectedTextOnly; 70 bool m_paintSelectedTextSeparately; 71 const FontCascade& m_font; 72 int m_selectionStart; 73 int m_selectionEnd; 74 int m_length; 75 const AtomicString& m_emphasisMark; 76 RenderCombineText* m_combinedText; 77 TextRun& m_textRun; 78 FloatRect m_boxRect; 79 FloatPoint m_textOrigin; 80 int m_emphasisMarkOffset; 81 bool m_textBoxIsHorizontal; 68 const FontCascade* m_font { nullptr }; 69 TextPaintStyle m_textPaintStyle; 70 TextPaintStyle m_selectionPaintStyle; 71 const ShadowData* m_textShadow { nullptr }; 72 const ShadowData* m_selectionShadow { nullptr }; 73 AtomicString m_emphasisMark; 74 RenderCombineText* m_combinedText { nullptr }; 75 int m_emphasisMarkOffset { 0 }; 76 bool m_textBoxIsHorizontal { true }; 82 77 }; 78 79 inline void TextPainter::addEmphasis(const AtomicString& emphasisMark, int emphasisMarkOffset, RenderCombineText* combinedText) 80 { 81 m_emphasisMark = emphasisMark; 82 m_emphasisMarkOffset = emphasisMarkOffset; 83 m_combinedText = combinedText; 84 } 85 86 inline void TextPainter::addTextShadow(const ShadowData* textShadow, const ShadowData* selectionShadow) 87 { 88 m_textShadow = textShadow; 89 m_selectionShadow = selectionShadow; 90 } 83 91 84 92 class ShadowApplier {
Note:
See TracChangeset
for help on using the changeset viewer.