1 // Copyright 2019 Google LLC. 2 3 #ifndef DartTypes_DEFINED 4 #define DartTypes_DEFINED 5 6 #include "include/core/SkRect.h" 7 #include "include/core/SkTypes.h" 8 9 #include <iterator> 10 #include <limits> 11 12 namespace skia { 13 namespace textlayout { 14 15 enum Affinity { kUpstream, kDownstream }; 16 17 enum class RectHeightStyle { 18 // Provide tight bounding boxes that fit heights per run. 19 kTight, 20 21 // The height of the boxes will be the maximum height of all runs in the 22 // line. All rects in the same line will be the same height. 23 kMax, 24 25 // Extends the top and/or bottom edge of the bounds to fully cover any line 26 // spacing. The top edge of each line should be the same as the bottom edge 27 // of the line above. There should be no gaps in vertical coverage given any 28 // ParagraphStyle line_height. 29 // 30 // The top and bottom of each rect will cover half of the 31 // space above and half of the space below the line. 32 kIncludeLineSpacingMiddle, 33 // The line spacing will be added to the top of the rect. 34 kIncludeLineSpacingTop, 35 // The line spacing will be added to the bottom of the rect. 36 kIncludeLineSpacingBottom, 37 // 38 kStrut 39 }; 40 41 enum class RectWidthStyle { 42 // Provide tight bounding boxes that fit widths to the runs of each line 43 // independently. 44 kTight, 45 46 // Extends the width of the last rect of each line to match the position of 47 // the widest rect over all the lines. 48 kMax 49 }; 50 51 enum class TextAlign { 52 kLeft, 53 kRight, 54 kCenter, 55 kJustify, 56 kStart, 57 kEnd, 58 }; 59 60 enum class TextDirection { 61 kRtl, 62 kLtr, 63 }; 64 65 struct PositionWithAffinity { 66 int32_t position; 67 Affinity affinity; 68 PositionWithAffinityPositionWithAffinity69 PositionWithAffinity() : position(0), affinity(kDownstream) {} PositionWithAffinityPositionWithAffinity70 PositionWithAffinity(int32_t p, Affinity a) : position(p), affinity(a) {} 71 }; 72 73 struct TextBox { 74 SkRect rect; 75 TextDirection direction; 76 TextBoxTextBox77 TextBox(SkRect r, TextDirection d) : rect(r), direction(d) {} 78 }; 79 80 // ------------------------------------------------------------------- 81 // --- Reversed iterable 82 83 template<typename C, typename UnaryFunction> directional_for_each(C & c,bool forwards,UnaryFunction f)84 UnaryFunction directional_for_each(C& c, bool forwards, UnaryFunction f) { 85 return forwards 86 ? std::for_each(std::begin(c), std::end(c), f) 87 : std::for_each(std::rbegin(c), std::rend(c), f); 88 } 89 90 const size_t EMPTY_INDEX = std::numeric_limits<size_t>::max(); 91 template <typename T> struct SkRange { SkRangeSkRange92 SkRange() : start(), end() {} SkRangeSkRange93 SkRange(T s, T e) : start(s), end(e) {} 94 95 T start, end; 96 97 bool operator==(const SkRange<T>& other) const { 98 return start == other.start && end == other.end; 99 } 100 widthSkRange101 T width() const { return end - start; } 102 ShiftSkRange103 void Shift(T delta) { 104 start += delta; 105 end += delta; 106 } 107 containsSkRange108 bool contains(SkRange<size_t> other) const { 109 return start <= other.start && end >= other.end; 110 } 111 intersectsSkRange112 bool intersects(SkRange<size_t> other) const { 113 return std::max(start, other.start) <= std::min(end, other.end); 114 } 115 intersectionSkRange116 SkRange<size_t> intersection(SkRange<size_t> other) const { 117 return SkRange<size_t>(std::max(start, other.start), std::min(end, other.end)); 118 } 119 emptySkRange120 bool empty() const { 121 return start == EMPTY_INDEX && end == EMPTY_INDEX; 122 } 123 }; 124 125 const SkRange<size_t> EMPTY_RANGE = SkRange<size_t>(EMPTY_INDEX, EMPTY_INDEX); 126 127 128 enum class TextBaseline { 129 kAlphabetic, 130 kIdeographic, 131 }; 132 133 enum TextHeightBehavior { 134 kAll = 0x0, 135 kDisableFirstAscent = 0x1, 136 kDisableLastDescent = 0x2, 137 kDisableAll = 0x1 | 0x2, 138 }; 139 140 enum class LineMetricStyle : uint8_t { 141 // Use ascent, descent, etc from a fixed baseline. 142 Typographic, 143 // Use ascent, descent, etc like css with the leading split and with height adjustments 144 CSS 145 }; 146 147 enum class DrawOptions { 148 kRecord, 149 kReplay, 150 kDirect 151 }; 152 153 } // namespace textlayout 154 } // namespace skia 155 156 #endif // DartTypes_DEFINED 157