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 3// found in the LICENSE file. 4 5#ifndef TextPainter_h 6#define TextPainter_h 7 8#include "core/rendering/style/RenderStyleConstants.h" 9#include "platform/fonts/TextBlob.h" 10#include "platform/geometry/FloatPoint.h" 11#include "platform/geometry/FloatRect.h" 12#include "platform/graphics/Color.h" 13#include "wtf/text/AtomicString.h" 14 15namespace blink { 16 17class Font; 18class GraphicsContext; 19class GraphicsContextStateSaver; 20class RenderCombineText; 21class RenderObject; 22class RenderStyle; 23class ShadowList; 24class TextRun; 25struct TextRunPaintInfo; 26 27class TextPainter { 28public: 29 struct Style; 30 31 TextPainter(GraphicsContext*, const Font&, const TextRun&, const FloatPoint& textOrigin, const FloatRect& textBounds, bool horizontal); 32 ~TextPainter(); 33 34 void setEmphasisMark(const AtomicString&, TextEmphasisPosition); 35 void setCombinedText(RenderCombineText* combinedText) { m_combinedText = combinedText; } 36 37 static void updateGraphicsContext(GraphicsContext*, const Style&, bool horizontal, GraphicsContextStateSaver&); 38 39 void paint(int startOffset, int endOffset, int length, const Style&, TextBlobPtr* cachedTextBlob = 0); 40 41 struct Style { 42 Color fillColor; 43 Color strokeColor; 44 Color emphasisMarkColor; 45 float strokeWidth; 46 const ShadowList* shadow; 47 48 bool operator==(const Style& other) 49 { 50 return fillColor == other.fillColor 51 && strokeColor == other.strokeColor 52 && emphasisMarkColor == other.emphasisMarkColor 53 && strokeWidth == other.strokeWidth 54 && shadow == other.shadow; 55 } 56 bool operator!=(const Style& other) { return !(*this == other); } 57 }; 58 static Style textPaintingStyle(RenderObject&, RenderStyle*, bool forceBlackText, bool isPrinting); 59 static Style selectionPaintingStyle(RenderObject&, bool haveSelection, bool forceBlackText, bool isPrinting, const Style& textStyle); 60 61private: 62 void updateGraphicsContext(const Style& style, GraphicsContextStateSaver& saver) 63 { 64 updateGraphicsContext(m_graphicsContext, style, m_horizontal, saver); 65 } 66 67 enum PaintInternalStep { PaintText, PaintEmphasisMark }; 68 69 template <PaintInternalStep step> 70 void paintInternalRun(TextRunPaintInfo&, int from, int to, TextBlobPtr* cachedTextBlob = 0); 71 72 template <PaintInternalStep step> 73 void paintInternal(int startOffset, int endOffset, int truncationPoint, TextBlobPtr* cachedTextBlob = 0); 74 75 void paintEmphasisMarkForCombinedText(); 76 77 GraphicsContext* m_graphicsContext; 78 const Font& m_font; 79 const TextRun& m_run; 80 FloatPoint m_textOrigin; 81 FloatRect m_textBounds; 82 bool m_horizontal; 83 AtomicString m_emphasisMark; 84 int m_emphasisMarkOffset; 85 RenderCombineText* m_combinedText; 86}; 87 88} // namespace blink 89 90#endif // TextPainter_h 91