1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2019 Google LLC. 2*c8dee2aaSAndroid Build Coastguard Worker #ifndef ParagraphStyle_DEFINED 3*c8dee2aaSAndroid Build Coastguard Worker #define ParagraphStyle_DEFINED 4*c8dee2aaSAndroid Build Coastguard Worker 5*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontStyle.h" 6*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 7*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 8*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/DartTypes.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skparagraph/include/TextStyle.h" 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include <stddef.h> 12*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm> 13*c8dee2aaSAndroid Build Coastguard Worker #include <limits> 14*c8dee2aaSAndroid Build Coastguard Worker #include <string> 15*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 16*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker namespace skia { 19*c8dee2aaSAndroid Build Coastguard Worker namespace textlayout { 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker struct StrutStyle { 22*c8dee2aaSAndroid Build Coastguard Worker StrutStyle(); 23*c8dee2aaSAndroid Build Coastguard Worker getFontFamiliesStrutStyle24*c8dee2aaSAndroid Build Coastguard Worker const std::vector<SkString>& getFontFamilies() const { return fFontFamilies; } setFontFamiliesStrutStyle25*c8dee2aaSAndroid Build Coastguard Worker void setFontFamilies(std::vector<SkString> families) { fFontFamilies = std::move(families); } 26*c8dee2aaSAndroid Build Coastguard Worker getFontStyleStrutStyle27*c8dee2aaSAndroid Build Coastguard Worker SkFontStyle getFontStyle() const { return fFontStyle; } setFontStyleStrutStyle28*c8dee2aaSAndroid Build Coastguard Worker void setFontStyle(SkFontStyle fontStyle) { fFontStyle = fontStyle; } 29*c8dee2aaSAndroid Build Coastguard Worker getFontSizeStrutStyle30*c8dee2aaSAndroid Build Coastguard Worker SkScalar getFontSize() const { return fFontSize; } setFontSizeStrutStyle31*c8dee2aaSAndroid Build Coastguard Worker void setFontSize(SkScalar size) { fFontSize = size; } 32*c8dee2aaSAndroid Build Coastguard Worker setHeightStrutStyle33*c8dee2aaSAndroid Build Coastguard Worker void setHeight(SkScalar height) { fHeight = height; } getHeightStrutStyle34*c8dee2aaSAndroid Build Coastguard Worker SkScalar getHeight() const { return fHeight; } 35*c8dee2aaSAndroid Build Coastguard Worker setLeadingStrutStyle36*c8dee2aaSAndroid Build Coastguard Worker void setLeading(SkScalar Leading) { fLeading = Leading; } getLeadingStrutStyle37*c8dee2aaSAndroid Build Coastguard Worker SkScalar getLeading() const { return fLeading; } 38*c8dee2aaSAndroid Build Coastguard Worker getStrutEnabledStrutStyle39*c8dee2aaSAndroid Build Coastguard Worker bool getStrutEnabled() const { return fEnabled; } setStrutEnabledStrutStyle40*c8dee2aaSAndroid Build Coastguard Worker void setStrutEnabled(bool v) { fEnabled = v; } 41*c8dee2aaSAndroid Build Coastguard Worker getForceStrutHeightStrutStyle42*c8dee2aaSAndroid Build Coastguard Worker bool getForceStrutHeight() const { return fForceHeight; } setForceStrutHeightStrutStyle43*c8dee2aaSAndroid Build Coastguard Worker void setForceStrutHeight(bool v) { fForceHeight = v; } 44*c8dee2aaSAndroid Build Coastguard Worker getHeightOverrideStrutStyle45*c8dee2aaSAndroid Build Coastguard Worker bool getHeightOverride() const { return fHeightOverride; } setHeightOverrideStrutStyle46*c8dee2aaSAndroid Build Coastguard Worker void setHeightOverride(bool v) { fHeightOverride = v; } 47*c8dee2aaSAndroid Build Coastguard Worker setHalfLeadingStrutStyle48*c8dee2aaSAndroid Build Coastguard Worker void setHalfLeading(bool halfLeading) { fHalfLeading = halfLeading; } getHalfLeadingStrutStyle49*c8dee2aaSAndroid Build Coastguard Worker bool getHalfLeading() const { return fHalfLeading; } 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const StrutStyle& rhs) const { 52*c8dee2aaSAndroid Build Coastguard Worker return this->fEnabled == rhs.fEnabled && 53*c8dee2aaSAndroid Build Coastguard Worker this->fHeightOverride == rhs.fHeightOverride && 54*c8dee2aaSAndroid Build Coastguard Worker this->fForceHeight == rhs.fForceHeight && 55*c8dee2aaSAndroid Build Coastguard Worker this->fHalfLeading == rhs.fHalfLeading && 56*c8dee2aaSAndroid Build Coastguard Worker nearlyEqual(this->fLeading, rhs.fLeading) && 57*c8dee2aaSAndroid Build Coastguard Worker nearlyEqual(this->fHeight, rhs.fHeight) && 58*c8dee2aaSAndroid Build Coastguard Worker nearlyEqual(this->fFontSize, rhs.fFontSize) && 59*c8dee2aaSAndroid Build Coastguard Worker this->fFontStyle == rhs.fFontStyle && 60*c8dee2aaSAndroid Build Coastguard Worker this->fFontFamilies == rhs.fFontFamilies; 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker private: 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker std::vector<SkString> fFontFamilies; 66*c8dee2aaSAndroid Build Coastguard Worker SkFontStyle fFontStyle; 67*c8dee2aaSAndroid Build Coastguard Worker SkScalar fFontSize; 68*c8dee2aaSAndroid Build Coastguard Worker SkScalar fHeight; 69*c8dee2aaSAndroid Build Coastguard Worker SkScalar fLeading; 70*c8dee2aaSAndroid Build Coastguard Worker bool fForceHeight; 71*c8dee2aaSAndroid Build Coastguard Worker bool fEnabled; 72*c8dee2aaSAndroid Build Coastguard Worker bool fHeightOverride; 73*c8dee2aaSAndroid Build Coastguard Worker // true: half leading. 74*c8dee2aaSAndroid Build Coastguard Worker // false: scale ascent/descent with fHeight. 75*c8dee2aaSAndroid Build Coastguard Worker bool fHalfLeading; 76*c8dee2aaSAndroid Build Coastguard Worker }; 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker struct ParagraphStyle { 79*c8dee2aaSAndroid Build Coastguard Worker ParagraphStyle(); 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const ParagraphStyle& rhs) const { 82*c8dee2aaSAndroid Build Coastguard Worker return this->fHeight == rhs.fHeight && 83*c8dee2aaSAndroid Build Coastguard Worker this->fEllipsis == rhs.fEllipsis && 84*c8dee2aaSAndroid Build Coastguard Worker this->fEllipsisUtf16 == rhs.fEllipsisUtf16 && 85*c8dee2aaSAndroid Build Coastguard Worker this->fTextDirection == rhs.fTextDirection && this->fTextAlign == rhs.fTextAlign && 86*c8dee2aaSAndroid Build Coastguard Worker this->fDefaultTextStyle == rhs.fDefaultTextStyle && 87*c8dee2aaSAndroid Build Coastguard Worker this->fReplaceTabCharacters == rhs.fReplaceTabCharacters; 88*c8dee2aaSAndroid Build Coastguard Worker } 89*c8dee2aaSAndroid Build Coastguard Worker getStrutStyleParagraphStyle90*c8dee2aaSAndroid Build Coastguard Worker const StrutStyle& getStrutStyle() const { return fStrutStyle; } setStrutStyleParagraphStyle91*c8dee2aaSAndroid Build Coastguard Worker void setStrutStyle(StrutStyle strutStyle) { fStrutStyle = std::move(strutStyle); } 92*c8dee2aaSAndroid Build Coastguard Worker getTextStyleParagraphStyle93*c8dee2aaSAndroid Build Coastguard Worker const TextStyle& getTextStyle() const { return fDefaultTextStyle; } setTextStyleParagraphStyle94*c8dee2aaSAndroid Build Coastguard Worker void setTextStyle(const TextStyle& textStyle) { fDefaultTextStyle = textStyle; } 95*c8dee2aaSAndroid Build Coastguard Worker getTextDirectionParagraphStyle96*c8dee2aaSAndroid Build Coastguard Worker TextDirection getTextDirection() const { return fTextDirection; } setTextDirectionParagraphStyle97*c8dee2aaSAndroid Build Coastguard Worker void setTextDirection(TextDirection direction) { fTextDirection = direction; } 98*c8dee2aaSAndroid Build Coastguard Worker getTextAlignParagraphStyle99*c8dee2aaSAndroid Build Coastguard Worker TextAlign getTextAlign() const { return fTextAlign; } setTextAlignParagraphStyle100*c8dee2aaSAndroid Build Coastguard Worker void setTextAlign(TextAlign align) { fTextAlign = align; } 101*c8dee2aaSAndroid Build Coastguard Worker getMaxLinesParagraphStyle102*c8dee2aaSAndroid Build Coastguard Worker size_t getMaxLines() const { return fLinesLimit; } setMaxLinesParagraphStyle103*c8dee2aaSAndroid Build Coastguard Worker void setMaxLines(size_t maxLines) { fLinesLimit = maxLines; } 104*c8dee2aaSAndroid Build Coastguard Worker getEllipsisParagraphStyle105*c8dee2aaSAndroid Build Coastguard Worker SkString getEllipsis() const { return fEllipsis; } getEllipsisUtf16ParagraphStyle106*c8dee2aaSAndroid Build Coastguard Worker std::u16string getEllipsisUtf16() const { return fEllipsisUtf16; } setEllipsisParagraphStyle107*c8dee2aaSAndroid Build Coastguard Worker void setEllipsis(const std::u16string& ellipsis) { fEllipsisUtf16 = ellipsis; } setEllipsisParagraphStyle108*c8dee2aaSAndroid Build Coastguard Worker void setEllipsis(const SkString& ellipsis) { fEllipsis = ellipsis; } 109*c8dee2aaSAndroid Build Coastguard Worker getHeightParagraphStyle110*c8dee2aaSAndroid Build Coastguard Worker SkScalar getHeight() const { return fHeight; } setHeightParagraphStyle111*c8dee2aaSAndroid Build Coastguard Worker void setHeight(SkScalar height) { fHeight = height; } 112*c8dee2aaSAndroid Build Coastguard Worker getTextHeightBehaviorParagraphStyle113*c8dee2aaSAndroid Build Coastguard Worker TextHeightBehavior getTextHeightBehavior() const { return fTextHeightBehavior; } setTextHeightBehaviorParagraphStyle114*c8dee2aaSAndroid Build Coastguard Worker void setTextHeightBehavior(TextHeightBehavior v) { fTextHeightBehavior = v; } 115*c8dee2aaSAndroid Build Coastguard Worker unlimited_linesParagraphStyle116*c8dee2aaSAndroid Build Coastguard Worker bool unlimited_lines() const { 117*c8dee2aaSAndroid Build Coastguard Worker return fLinesLimit == std::numeric_limits<size_t>::max(); 118*c8dee2aaSAndroid Build Coastguard Worker } ellipsizedParagraphStyle119*c8dee2aaSAndroid Build Coastguard Worker bool ellipsized() const { return !fEllipsis.isEmpty() || !fEllipsisUtf16.empty(); } 120*c8dee2aaSAndroid Build Coastguard Worker TextAlign effective_align() const; hintingIsOnParagraphStyle121*c8dee2aaSAndroid Build Coastguard Worker bool hintingIsOn() const { return fHintingIsOn; } turnHintingOffParagraphStyle122*c8dee2aaSAndroid Build Coastguard Worker void turnHintingOff() { fHintingIsOn = false; } 123*c8dee2aaSAndroid Build Coastguard Worker getReplaceTabCharactersParagraphStyle124*c8dee2aaSAndroid Build Coastguard Worker bool getReplaceTabCharacters() const { return fReplaceTabCharacters; } setReplaceTabCharactersParagraphStyle125*c8dee2aaSAndroid Build Coastguard Worker void setReplaceTabCharacters(bool value) { fReplaceTabCharacters = value; } 126*c8dee2aaSAndroid Build Coastguard Worker getApplyRoundingHackParagraphStyle127*c8dee2aaSAndroid Build Coastguard Worker bool getApplyRoundingHack() const { return fApplyRoundingHack; } setApplyRoundingHackParagraphStyle128*c8dee2aaSAndroid Build Coastguard Worker void setApplyRoundingHack(bool value) { fApplyRoundingHack = value; } 129*c8dee2aaSAndroid Build Coastguard Worker 130*c8dee2aaSAndroid Build Coastguard Worker private: 131*c8dee2aaSAndroid Build Coastguard Worker StrutStyle fStrutStyle; 132*c8dee2aaSAndroid Build Coastguard Worker TextStyle fDefaultTextStyle; 133*c8dee2aaSAndroid Build Coastguard Worker TextAlign fTextAlign; 134*c8dee2aaSAndroid Build Coastguard Worker TextDirection fTextDirection; 135*c8dee2aaSAndroid Build Coastguard Worker size_t fLinesLimit; 136*c8dee2aaSAndroid Build Coastguard Worker std::u16string fEllipsisUtf16; 137*c8dee2aaSAndroid Build Coastguard Worker SkString fEllipsis; 138*c8dee2aaSAndroid Build Coastguard Worker SkScalar fHeight; 139*c8dee2aaSAndroid Build Coastguard Worker TextHeightBehavior fTextHeightBehavior; 140*c8dee2aaSAndroid Build Coastguard Worker bool fHintingIsOn; 141*c8dee2aaSAndroid Build Coastguard Worker bool fReplaceTabCharacters; 142*c8dee2aaSAndroid Build Coastguard Worker bool fApplyRoundingHack = true; 143*c8dee2aaSAndroid Build Coastguard Worker }; 144*c8dee2aaSAndroid Build Coastguard Worker } // namespace textlayout 145*c8dee2aaSAndroid Build Coastguard Worker } // namespace skia 146*c8dee2aaSAndroid Build Coastguard Worker 147*c8dee2aaSAndroid Build Coastguard Worker #endif // ParagraphStyle_DEFINED 148