Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "core/paint/InlineTextBoxPainter.h" | 6 #include "core/paint/InlineTextBoxPainter.h" |
| 7 | 7 |
| 8 #include "core/dom/DocumentMarkerController.h" | 8 #include "core/dom/DocumentMarkerController.h" |
| 9 #include "core/dom/RenderedDocumentMarker.h" | 9 #include "core/dom/RenderedDocumentMarker.h" |
| 10 #include "core/editing/CompositionUnderline.h" | 10 #include "core/editing/CompositionUnderline.h" |
| 11 #include "core/editing/CompositionUnderlineRangeFilter.h" | 11 #include "core/editing/CompositionUnderlineRangeFilter.h" |
| 12 #include "core/editing/Editor.h" | 12 #include "core/editing/Editor.h" |
| 13 #include "core/editing/InputMethodController.h" | 13 #include "core/editing/InputMethodController.h" |
| 14 #include "core/frame/LocalFrame.h" | 14 #include "core/frame/LocalFrame.h" |
| 15 #include "core/layout/LayoutBlock.h" | 15 #include "core/layout/LayoutBlock.h" |
| 16 #include "core/layout/LayoutTextCombine.h" | 16 #include "core/layout/LayoutTextCombine.h" |
| 17 #include "core/layout/LayoutTheme.h" | 17 #include "core/layout/LayoutTheme.h" |
| 18 #include "core/layout/PaintInfo.h" | 18 #include "core/layout/PaintInfo.h" |
| 19 #include "core/layout/line/InlineTextBox.h" | 19 #include "core/layout/line/InlineTextBox.h" |
| 20 #include "core/paint/BoxPainter.h" | 20 #include "core/paint/BoxPainter.h" |
| 21 #include "core/paint/TextPainter.h" | 21 #include "core/paint/TextPainter.h" |
| 22 #include "core/style/AppliedTextDecoration.h" | |
| 22 #include "platform/graphics/paint/DrawingRecorder.h" | 23 #include "platform/graphics/paint/DrawingRecorder.h" |
| 23 | 24 |
| 24 namespace blink { | 25 namespace blink { |
| 25 | 26 |
| 26 typedef WTF::HashMap<const InlineTextBox*, TextBlobPtr> InlineTextBoxBlobCacheMa p; | 27 typedef WTF::HashMap<const InlineTextBox*, TextBlobPtr> InlineTextBoxBlobCacheMa p; |
| 27 static InlineTextBoxBlobCacheMap* gTextBlobCache; | 28 static InlineTextBoxBlobCacheMap* gTextBlobCache; |
| 28 | 29 |
| 29 static const int misspellingLineThickness = 3; | 30 static const int misspellingLineThickness = 3; |
| 30 | 31 |
| 31 void InlineTextBoxPainter::removeFromTextBlobCache(InlineTextBox& inlineTextBox) | 32 void InlineTextBoxPainter::removeFromTextBlobCache(InlineTextBox& inlineTextBox) |
| (...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 666 x += 2 * step; | 667 x += 2 * step; |
| 667 path.addBezierCurveTo(controlPoint1, controlPoint2, FloatPoint(x, yA xis)); | 668 path.addBezierCurveTo(controlPoint1, controlPoint2, FloatPoint(x, yA xis)); |
| 668 } | 669 } |
| 669 } | 670 } |
| 670 | 671 |
| 671 context->setShouldAntialias(true); | 672 context->setShouldAntialias(true); |
| 672 context->strokePath(path); | 673 context->strokePath(path); |
| 673 } | 674 } |
| 674 | 675 |
| 675 static void paintAppliedDecoration(GraphicsContext* context, FloatPoint start, f loat width, float doubleOffset, int wavyOffsetFactor, | 676 static void paintAppliedDecoration(GraphicsContext* context, FloatPoint start, f loat width, float doubleOffset, int wavyOffsetFactor, |
| 676 LayoutObject::AppliedTextDecoration decoration, float thickness, bool antial iasDecoration, bool isPrinting) | 677 AppliedTextDecoration decoration, float thickness, bool antialiasDecoration, bool isPrinting) |
| 677 { | 678 { |
| 678 context->setStrokeStyle(textDecorationStyleToStrokeStyle(decoration.style)); | 679 context->setStrokeStyle(textDecorationStyleToStrokeStyle(decoration.style()) ); |
| 679 context->setStrokeColor(decoration.color); | 680 context->setStrokeColor(decoration.color()); |
| 680 | 681 |
| 681 switch (decoration.style) { | 682 switch (decoration.style()) { |
|
wkorman
2015/07/01 15:16:14
Was there a reason we weren't using accessors prev
| |
| 682 case TextDecorationStyleWavy: | 683 case TextDecorationStyleWavy: |
| 683 strokeWavyTextDecoration(context, start + FloatPoint(0, doubleOffset * w avyOffsetFactor), start + FloatPoint(width, doubleOffset * wavyOffsetFactor), th ickness); | 684 strokeWavyTextDecoration(context, start + FloatPoint(0, doubleOffset * w avyOffsetFactor), start + FloatPoint(width, doubleOffset * wavyOffsetFactor), th ickness); |
| 684 break; | 685 break; |
| 685 case TextDecorationStyleDotted: | 686 case TextDecorationStyleDotted: |
| 686 case TextDecorationStyleDashed: | 687 case TextDecorationStyleDashed: |
| 687 context->setShouldAntialias(antialiasDecoration); | 688 context->setShouldAntialias(antialiasDecoration); |
| 688 // Fall through | 689 // Fall through |
| 689 default: | 690 default: |
| 690 context->drawLineForText(start, width, isPrinting); | 691 context->drawLineForText(start, width, isPrinting); |
| 691 | 692 |
| 692 if (decoration.style == TextDecorationStyleDouble) | 693 if (decoration.style() == TextDecorationStyleDouble) |
| 693 context->drawLineForText(start + FloatPoint(0, doubleOffset), width, isPrinting); | 694 context->drawLineForText(start + FloatPoint(0, doubleOffset), width, isPrinting); |
| 694 } | 695 } |
| 695 } | 696 } |
| 696 | 697 |
| 697 void InlineTextBoxPainter::paintDecoration(GraphicsContext* context, const Float Point& boxOrigin, TextDecoration deco) | 698 void InlineTextBoxPainter::paintDecoration(GraphicsContext* context, const Float Point& boxOrigin, TextDecoration deco) |
| 698 { | 699 { |
| 699 GraphicsContextStateSaver stateSaver(*context); | 700 GraphicsContextStateSaver stateSaver(*context); |
| 700 | 701 |
| 701 if (m_inlineTextBox.truncation() == cFullTruncation) | 702 if (m_inlineTextBox.truncation() == cFullTruncation) |
| 702 return; | 703 return; |
| 703 | 704 |
| 704 FloatPoint localOrigin = boxOrigin; | 705 FloatPoint localOrigin = boxOrigin; |
| 705 | 706 |
| 706 float width = m_inlineTextBox.logicalWidth(); | 707 float width = m_inlineTextBox.logicalWidth(); |
| 707 if (m_inlineTextBox.truncation() != cNoTruncation) { | 708 if (m_inlineTextBox.truncation() != cNoTruncation) { |
| 708 width = m_inlineTextBox.layoutObject().width(m_inlineTextBox.start(), m_ inlineTextBox.truncation(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftToR ightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); | 709 width = m_inlineTextBox.layoutObject().width(m_inlineTextBox.start(), m_ inlineTextBox.truncation(), m_inlineTextBox.textPos(), m_inlineTextBox.isLeftToR ightDirection() ? LTR : RTL, m_inlineTextBox.isFirstLineStyle()); |
| 709 if (!m_inlineTextBox.isLeftToRightDirection()) | 710 if (!m_inlineTextBox.isLeftToRightDirection()) |
| 710 localOrigin.move(m_inlineTextBox.logicalWidth() - width, 0); | 711 localOrigin.move(m_inlineTextBox.logicalWidth() - width, 0); |
| 711 } | 712 } |
| 712 | 713 |
| 713 // Get the text decoration colors. | 714 // Get the text decoration colors. |
| 714 LayoutObject::AppliedTextDecoration underline, overline, linethrough; | 715 AppliedTextDecoration underline, overline, linethrough; |
| 715 m_inlineTextBox.layoutObject().getTextDecorations(deco, underline, overline, linethrough, true); | 716 m_inlineTextBox.layoutObject().getTextDecorations(deco, underline, overline, linethrough, true); |
| 716 if (m_inlineTextBox.isFirstLineStyle()) | 717 if (m_inlineTextBox.isFirstLineStyle()) |
| 717 m_inlineTextBox.layoutObject().getTextDecorations(deco, underline, overl ine, linethrough, true, true); | 718 m_inlineTextBox.layoutObject().getTextDecorations(deco, underline, overl ine, linethrough, true, true); |
| 718 | 719 |
| 719 // Use a special function for underlines to get the positioning exactly righ t. | 720 // Use a special function for underlines to get the positioning exactly righ t. |
| 720 bool isPrinting = m_inlineTextBox.layoutObject().document().printing(); | 721 bool isPrinting = m_inlineTextBox.layoutObject().document().printing(); |
| 721 | 722 |
| 722 const ComputedStyle& styleToUse = m_inlineTextBox.layoutObject().styleRef(m_ inlineTextBox.isFirstLineStyle()); | 723 const ComputedStyle& styleToUse = m_inlineTextBox.layoutObject().styleRef(m_ inlineTextBox.isFirstLineStyle()); |
| 723 int baseline = styleToUse.fontMetrics().ascent(); | 724 int baseline = styleToUse.fontMetrics().ascent(); |
| 724 | 725 |
| 725 // Set the thick of the line to be 10% (or something else ?)of the computed font size and not less than 1px. | 726 // Set the thick of the line to be 10% (or something else ?)of the computed font size and not less than 1px. |
| 726 // Using computedFontSize should take care of zoom as well. | 727 // Using computedFontSize should take care of zoom as well. |
| 727 | 728 |
| 728 // Update Underline thickness, in case we have Faulty Font Metrics calculati ng underline thickness by old method. | 729 // Update Underline thickness, in case we have Faulty Font Metrics calculati ng underline thickness by old method. |
| 729 float textDecorationThickness = styleToUse.fontMetrics().underlineThickness( ); | 730 float textDecorationThickness = styleToUse.fontMetrics().underlineThickness( ); |
| 730 int fontHeightInt = (int)(styleToUse.fontMetrics().floatHeight() + 0.5); | 731 int fontHeightInt = (int)(styleToUse.fontMetrics().floatHeight() + 0.5); |
| 731 if ((textDecorationThickness == 0.f) || (textDecorationThickness >= (fontHei ghtInt >> 1))) | 732 if ((textDecorationThickness == 0.f) || (textDecorationThickness >= (fontHei ghtInt >> 1))) |
| 732 textDecorationThickness = std::max(1.f, styleToUse.computedFontSize() / 10.f); | 733 textDecorationThickness = std::max(1.f, styleToUse.computedFontSize() / 10.f); |
| 733 | 734 |
| 734 context->setStrokeThickness(textDecorationThickness); | 735 context->setStrokeThickness(textDecorationThickness); |
| 735 | 736 |
| 736 bool antialiasDecoration = shouldSetDecorationAntialias(overline.style, unde rline.style, linethrough.style) | 737 bool antialiasDecoration = shouldSetDecorationAntialias(overline.style(), un derline.style(), linethrough.style()) |
| 737 && BoxPainter::shouldAntialiasLines(context); | 738 && BoxPainter::shouldAntialiasLines(context); |
| 738 | 739 |
| 739 // Offset between lines - always non-zero, so lines never cross each other. | 740 // Offset between lines - always non-zero, so lines never cross each other. |
| 740 float doubleOffset = textDecorationThickness + 1.f; | 741 float doubleOffset = textDecorationThickness + 1.f; |
| 741 | 742 |
| 742 if (deco & TextDecorationUnderline) { | 743 if (deco & TextDecorationUnderline) { |
| 743 const int underlineOffset = computeUnderlineOffset(styleToUse.textUnderl inePosition(), styleToUse.fontMetrics(), &m_inlineTextBox, textDecorationThickne ss); | 744 const int underlineOffset = computeUnderlineOffset(styleToUse.textUnderl inePosition(), styleToUse.fontMetrics(), &m_inlineTextBox, textDecorationThickne ss); |
| 744 paintAppliedDecoration(context, localOrigin + FloatPoint(0, underlineOff set), width, doubleOffset, 1, underline, textDecorationThickness, antialiasDecor ation, isPrinting); | 745 paintAppliedDecoration(context, localOrigin + FloatPoint(0, underlineOff set), width, doubleOffset, 1, underline, textDecorationThickness, antialiasDecor ation, isPrinting); |
| 745 } | 746 } |
| 746 if (deco & TextDecorationOverline) { | 747 if (deco & TextDecorationOverline) { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 802 LayoutTheme::theme().platformActiveTextSearchHighlightColor() : | 803 LayoutTheme::theme().platformActiveTextSearchHighlightColor() : |
| 803 LayoutTheme::theme().platformInactiveTextSearchHighlightColor(); | 804 LayoutTheme::theme().platformInactiveTextSearchHighlightColor(); |
| 804 GraphicsContextStateSaver stateSaver(*pt); | 805 GraphicsContextStateSaver stateSaver(*pt); |
| 805 pt->clip(FloatRect(boxOrigin.x(), boxOrigin.y() - deltaY, m_inlineTextBo x.logicalWidth(), selHeight)); | 806 pt->clip(FloatRect(boxOrigin.x(), boxOrigin.y() - deltaY, m_inlineTextBo x.logicalWidth(), selHeight)); |
| 806 pt->drawHighlightForText(font, run, FloatPoint(boxOrigin.x(), boxOrigin. y() - deltaY), selHeight, color, sPos, ePos); | 807 pt->drawHighlightForText(font, run, FloatPoint(boxOrigin.x(), boxOrigin. y() - deltaY), selHeight, color, sPos, ePos); |
| 807 } | 808 } |
| 808 } | 809 } |
| 809 | 810 |
| 810 | 811 |
| 811 } // namespace blink | 812 } // namespace blink |
| OLD | NEW |