• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 Google LLC.
2 #ifndef ParagraphStyle_DEFINED
3 #define ParagraphStyle_DEFINED
4 
5 #include "include/core/SkFontStyle.h"
6 #include "include/core/SkScalar.h"
7 #include "include/core/SkString.h"
8 #include "modules/skparagraph/include/DartTypes.h"
9 #include "modules/skparagraph/include/TextStyle.h"
10 #include "drawing.h"
11 
12 #include <stddef.h>
13 #include <algorithm>
14 #include <limits>
15 #include <string>
16 #include <utility>
17 #include <vector>
18 
19 namespace skia {
20 namespace textlayout {
21 
22 #ifdef OHOS_SUPPORT
23 struct TextTabs {
24     TextAlign alignment;
25     SkScalar location;
26     bool operator==(const TextTabs& other) const {
27         return (alignment == other.alignment) && nearlyEqual(location, other.location);
28     }
29 };
30 
31 struct TextBlobRecordInfo {
32     std::shared_ptr<RSTextBlob> fBlob{nullptr};
33     SkPoint fOffset{0.0f, 0.0f};
34     ParagraphPainter::SkPaintOrID fPaint;
35 };
36 
37 enum class TextVerticalAlign {
38     BASELINE,
39     BOTTOM,
40     CENTER,
41     TOP,
42 };
43 #endif
44 
45 enum class WordBreakType {
46     NORMAL,     // to be done.
47     BREAK_ALL,  // break occur after any characters.
48     BREAK_WORD, // break only occur after word.
49 #ifdef OHOS_SUPPORT
50     BREAK_HYPHEN,
51 #endif
52 };
53 
54 enum class LineBreakStrategy {
55     GREEDY,        // faster and linear.
56     HIGH_QUALITY,  // breaking tries to split the lines as efficiently as possible
57     BALANCED,      // breaking tries to make the line lengths even
58 };
59 
60 struct StrutStyle {
61     StrutStyle();
62 
getFontFamiliesStrutStyle63     const std::vector<SkString>& getFontFamilies() const { return fFontFamilies; }
setFontFamiliesStrutStyle64     void setFontFamilies(std::vector<SkString> families) { fFontFamilies = std::move(families); }
65 
66 #ifndef USE_SKIA_TXT
getFontStyleStrutStyle67     SkFontStyle getFontStyle() const { return fFontStyle; }
setFontStyleStrutStyle68     void setFontStyle(SkFontStyle fontStyle) { fFontStyle = fontStyle; }
69 #else
getFontStyleStrutStyle70     RSFontStyle getFontStyle() const { return fFontStyle; }
setFontStyleStrutStyle71     void setFontStyle(RSFontStyle fontStyle) { fFontStyle = fontStyle; }
72 #endif
73 
getFontSizeStrutStyle74     SkScalar getFontSize() const { return fFontSize; }
setFontSizeStrutStyle75     void setFontSize(SkScalar size) { fFontSize = size; }
76 
setHeightStrutStyle77     void setHeight(SkScalar height) { fHeight = height; }
getHeightStrutStyle78     SkScalar getHeight() const { return fHeight; }
79 
setLeadingStrutStyle80     void setLeading(SkScalar Leading) { fLeading = Leading; }
getLeadingStrutStyle81     SkScalar getLeading() const { return fLeading; }
82 
getStrutEnabledStrutStyle83     bool getStrutEnabled() const { return fEnabled; }
setStrutEnabledStrutStyle84     void setStrutEnabled(bool v) { fEnabled = v; }
85 
getForceStrutHeightStrutStyle86     bool getForceStrutHeight() const { return fForceHeight; }
setForceStrutHeightStrutStyle87     void setForceStrutHeight(bool v) { fForceHeight = v; }
88 
getHeightOverrideStrutStyle89     bool getHeightOverride() const { return fHeightOverride; }
setHeightOverrideStrutStyle90     void setHeightOverride(bool v) { fHeightOverride = v; }
91 
setHalfLeadingStrutStyle92     void setHalfLeading(bool halfLeading) { fHalfLeading = halfLeading; }
getHalfLeadingStrutStyle93     bool getHalfLeading() const { return fHalfLeading; }
94 
setWordBreakTypeStrutStyle95     void setWordBreakType(const WordBreakType& wordBreakType) { fWordBreakType = wordBreakType; }
getWordBreakTypeStrutStyle96     WordBreakType getWordBreakType() const { return fWordBreakType; }
97 
setLineBreakStrategyStrutStyle98     void setLineBreakStrategy(const LineBreakStrategy& lineBreakStrategy) { fLineBreakStrategy = lineBreakStrategy; }
getLineBreakStrategyStrutStyle99     LineBreakStrategy getLineBreakStrategy() const { return fLineBreakStrategy; }
100 
101     bool operator==(const StrutStyle& rhs) const {
102         return this->fEnabled == rhs.fEnabled &&
103                this->fHeightOverride == rhs.fHeightOverride &&
104                this->fForceHeight == rhs.fForceHeight &&
105                this->fHalfLeading == rhs.fHalfLeading &&
106                nearlyEqual(this->fLeading, rhs.fLeading) &&
107                nearlyEqual(this->fHeight, rhs.fHeight) &&
108                nearlyEqual(this->fFontSize, rhs.fFontSize) &&
109                this->fFontStyle == rhs.fFontStyle &&
110                this->fFontFamilies == rhs.fFontFamilies &&
111                this->fWordBreakType == rhs.fWordBreakType &&
112                this->fLineBreakStrategy == rhs.fLineBreakStrategy;
113     }
114 
115 private:
116 
117     std::vector<SkString> fFontFamilies;
118 #ifndef USE_SKIA_TXT
119     SkFontStyle fFontStyle;
120 #else
121     RSFontStyle fFontStyle;
122 #endif
123     SkScalar fFontSize;
124     SkScalar fHeight;
125     SkScalar fLeading;
126     bool fForceHeight;
127     bool fEnabled;
128     bool fHeightOverride;
129     // true: half leading.
130     // false: scale ascent/descent with fHeight.
131     bool fHalfLeading;
132     WordBreakType fWordBreakType;
133     LineBreakStrategy fLineBreakStrategy { LineBreakStrategy::GREEDY };
134 };
135 
136 struct ParagraphStyle {
137     ParagraphStyle();
138 
139     bool operator==(const ParagraphStyle& rhs) const {
140         return this->fHeight == rhs.fHeight &&
141                this->fEllipsis == rhs.fEllipsis &&
142                this->fEllipsisUtf16 == rhs.fEllipsisUtf16 &&
143                this->fTextDirection == rhs.fTextDirection && this->fTextAlign == rhs.fTextAlign &&
144                this->fDefaultTextStyle == rhs.fDefaultTextStyle &&
145                this->fEllipsisModal == rhs.fEllipsisModal &&
146                this->fTextOverflower == rhs.fTextOverflower &&
147                this->fReplaceTabCharacters == rhs.fReplaceTabCharacters &&
148 #ifdef OHOS_SUPPORT
149                this->fTextTab == rhs.fTextTab &&
150                this->fParagraphSpacing == rhs.fParagraphSpacing &&
151                this->fIsEndAddParagraphSpacing == rhs.fIsEndAddParagraphSpacing &&
152                this->fIsTrailingSpaceOptimized == rhs.fIsTrailingSpaceOptimized &&
153                this->fEnableAutoSpace == rhs.fEnableAutoSpace &&
154                this->fVerticalAlignment == rhs.fVerticalAlignment &&
155 #endif
156                nearlyEqual(this->fTextSplitRatio, rhs.fTextSplitRatio);
157     }
158 
159 #ifdef OHOS_SUPPORT
exportStrutStyleParagraphStyle160     StrutStyle& exportStrutStyle() { return fStrutStyle; }
exportTextStyleParagraphStyle161     TextStyle& exportTextStyle() { return fDefaultTextStyle; }
162 #endif
163 
getStrutStyleParagraphStyle164     const StrutStyle& getStrutStyle() const { return fStrutStyle; }
setStrutStyleParagraphStyle165     void setStrutStyle(StrutStyle strutStyle) { fStrutStyle = std::move(strutStyle); }
166 
getTextStyleParagraphStyle167     const TextStyle& getTextStyle() const { return fDefaultTextStyle; }
setTextStyleParagraphStyle168     void setTextStyle(const TextStyle& textStyle) { fDefaultTextStyle = textStyle; }
169 
getTextDirectionParagraphStyle170     TextDirection getTextDirection() const { return fTextDirection; }
setTextDirectionParagraphStyle171     void setTextDirection(TextDirection direction) { fTextDirection = direction; }
172 
getTextAlignParagraphStyle173     TextAlign getTextAlign() const { return fTextAlign; }
setTextAlignParagraphStyle174     void setTextAlign(TextAlign align) { fTextAlign = align; }
175 
getMaxLinesParagraphStyle176     size_t getMaxLines() const { return fLinesLimit; }
setMaxLinesParagraphStyle177     void setMaxLines(size_t maxLines) { fLinesLimit = maxLines; }
178 
getEllipsisParagraphStyle179     SkString getEllipsis() const { return fEllipsis; }
getEllipsisUtf16ParagraphStyle180     std::u16string getEllipsisUtf16() const { return fEllipsisUtf16; }
setEllipsisParagraphStyle181     void setEllipsis(const std::u16string& ellipsis) {  fEllipsisUtf16 = ellipsis; }
setEllipsisParagraphStyle182     void setEllipsis(const SkString& ellipsis) { fEllipsis = ellipsis; }
183 
getHeightParagraphStyle184     SkScalar getHeight() const { return fHeight; }
setHeightParagraphStyle185     void setHeight(SkScalar height) { fHeight = height; }
186 
getTextHeightBehaviorParagraphStyle187     TextHeightBehavior getTextHeightBehavior() const { return fTextHeightBehavior; }
setTextHeightBehaviorParagraphStyle188     void setTextHeightBehavior(TextHeightBehavior v) { fTextHeightBehavior = v; }
189 
unlimited_linesParagraphStyle190     bool unlimited_lines() const {
191         return fLinesLimit == std::numeric_limits<size_t>::max();
192     }
ellipsizedParagraphStyle193     bool ellipsized() const { return !fEllipsis.isEmpty() || !fEllipsisUtf16.empty(); }
194     TextAlign effective_align() const;
hintingIsOnParagraphStyle195     bool hintingIsOn() const { return fHintingIsOn; }
turnHintingOffParagraphStyle196     void turnHintingOff() { fHintingIsOn = false; }
197 
getReplaceTabCharactersParagraphStyle198     bool getReplaceTabCharacters() const { return fReplaceTabCharacters; }
setReplaceTabCharactersParagraphStyle199     void setReplaceTabCharacters(bool value) { fReplaceTabCharacters = value; }
200 
getEllipsisModParagraphStyle201     skia::textlayout::EllipsisModal getEllipsisMod() const { return fEllipsisModal; }
setEllipsisModParagraphStyle202     void setEllipsisMod(skia::textlayout::EllipsisModal ellipsisModel) { fEllipsisModal = ellipsisModel; }
getTextSplitRatioParagraphStyle203     SkScalar getTextSplitRatio() const { return fTextSplitRatio; }
setTextSplitRatioParagraphStyle204     void setTextSplitRatio(SkScalar textSplitRatio) { fTextSplitRatio = textSplitRatio; }
205 
getTextOverflowerParagraphStyle206     bool getTextOverflower() const { return fTextOverflower; }
setTextOverflowerParagraphStyle207     void setTextOverflower(bool textOverflowerFlag) { fTextOverflower = textOverflowerFlag; }
208 
209 #ifdef OHOS_SUPPORT
setVerticalAlignmentParagraphStyle210     void setVerticalAlignment(TextVerticalAlign verticalAlignment) { fVerticalAlignment = verticalAlignment; }
getVerticalAlignmentParagraphStyle211     TextVerticalAlign getVerticalAlignment() const { return fVerticalAlignment; }
getTextTabParagraphStyle212     const TextTabs& getTextTab() const { return fTextTab; }
setTextTabParagraphStyle213     void setTextTab(const TextTabs& textTab) { fTextTab = textTab; }
getParagraphSpacingParagraphStyle214     SkScalar getParagraphSpacing() const { return fParagraphSpacing; }
setParagraphSpacingParagraphStyle215     void setParagraphSpacing(SkScalar paragraphSpacing)
216     {
217         fParagraphSpacing = paragraphSpacing;
218     }
getIsEndAddParagraphSpacingParagraphStyle219     bool getIsEndAddParagraphSpacing() const { return fIsEndAddParagraphSpacing; }
setIsEndAddParagraphSpacingParagraphStyle220     void setIsEndAddParagraphSpacing(bool isEndAddParagraphSpacing)
221     {
222         fIsEndAddParagraphSpacing = isEndAddParagraphSpacing;
223     }
getTrailingSpaceOptimizedParagraphStyle224     bool getTrailingSpaceOptimized() const { return fIsTrailingSpaceOptimized; }
setTrailingSpaceOptimizedParagraphStyle225     void setTrailingSpaceOptimized(bool isTrailingSpaceOptimized)
226     {
227         fIsTrailingSpaceOptimized = isTrailingSpaceOptimized;
228     }
getEnableAutoSpaceParagraphStyle229     bool getEnableAutoSpace() const { return fEnableAutoSpace; }
setEnableAutoSpaceParagraphStyle230     void setEnableAutoSpace(bool enableAutoSpace)
231     {
232         fEnableAutoSpace = enableAutoSpace;
233     }
234 #endif
235 private:
236     StrutStyle fStrutStyle;
237     TextStyle fDefaultTextStyle;
238     TextAlign fTextAlign;
239     TextDirection fTextDirection;
240     size_t fLinesLimit;
241     std::u16string fEllipsisUtf16;
242     SkString fEllipsis;
243     SkScalar fHeight;
244     TextHeightBehavior fTextHeightBehavior;
245     bool fHintingIsOn;
246     bool fReplaceTabCharacters;
247     bool fTextOverflower;
248     skia::textlayout::EllipsisModal fEllipsisModal;
249     SkScalar fTextSplitRatio = 0.5f;
250 #ifdef OHOS_SUPPORT
251     TextTabs fTextTab;
252     SkScalar fParagraphSpacing{0.0f};
253     bool fIsEndAddParagraphSpacing{false};
254     bool fIsTrailingSpaceOptimized{false};
255     bool fEnableAutoSpace{false};
256     TextVerticalAlign fVerticalAlignment{TextVerticalAlign::BASELINE};
257 #endif
258 };
259 }  // namespace textlayout
260 }  // namespace skia
261 
262 #endif  // ParagraphStyle_DEFINED
263