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