| // Copyright 2019 Google LLC. |
| |
| #ifndef DartTypes_DEFINED |
| #define DartTypes_DEFINED |
| |
| #include "include/core/SkRect.h" |
| #include "include/core/SkTypes.h" |
| |
| #include <algorithm> |
| #include <iterator> |
| #include <limits> |
| |
| namespace skia { |
| namespace textlayout { |
| |
| enum Affinity { kUpstream, kDownstream }; |
| |
| enum class RectHeightStyle { |
| // Provide tight bounding boxes that fit heights per run. |
| kTight, |
| |
| // The height of the boxes will be the maximum height of all runs in the |
| // line. All rects in the same line will be the same height. |
| kMax, |
| |
| // Extends the top and/or bottom edge of the bounds to fully cover any line |
| // spacing. The top edge of each line should be the same as the bottom edge |
| // of the line above. There should be no gaps in vertical coverage given any |
| // ParagraphStyle line_height. |
| // |
| // The top and bottom of each rect will cover half of the |
| // space above and half of the space below the line. |
| kIncludeLineSpacingMiddle, |
| // The line spacing will be added to the top of the rect. |
| kIncludeLineSpacingTop, |
| // The line spacing will be added to the bottom of the rect. |
| kIncludeLineSpacingBottom, |
| // |
| kStrut |
| }; |
| |
| enum class RectWidthStyle { |
| // Provide tight bounding boxes that fit widths to the runs of each line |
| // independently. |
| kTight, |
| |
| // Extends the width of the last rect of each line to match the position of |
| // the widest rect over all the lines. |
| kMax |
| }; |
| |
| enum class TextAlign { |
| kLeft, |
| kRight, |
| kCenter, |
| kJustify, |
| kStart, |
| kEnd, |
| }; |
| |
| enum class TextDirection { |
| kRtl, |
| kLtr, |
| }; |
| |
| struct PositionWithAffinity { |
| int32_t position; |
| Affinity affinity; |
| |
| PositionWithAffinity() : position(0), affinity(kDownstream) {} |
| PositionWithAffinity(int32_t p, Affinity a) : position(p), affinity(a) {} |
| }; |
| |
| struct TextBox { |
| SkRect rect; |
| TextDirection direction; |
| |
| TextBox(SkRect r, TextDirection d) : rect(r), direction(d) {} |
| }; |
| |
| // ------------------------------------------------------------------- |
| // --- Reversed iterable |
| |
| template<typename C, typename UnaryFunction> |
| UnaryFunction directional_for_each(C& c, bool forwards, UnaryFunction f) { |
| return forwards |
| ? std::for_each(std::begin(c), std::end(c), f) |
| : std::for_each(std::rbegin(c), std::rend(c), f); |
| } |
| |
| const size_t EMPTY_INDEX = std::numeric_limits<size_t>::max(); |
| template <typename T> struct SkRange { |
| SkRange() : start(), end() {} |
| SkRange(T s, T e) : start(s), end(e) {} |
| |
| using SignedT = std::make_signed_t<T>; |
| |
| T start, end; |
| |
| bool operator==(const SkRange<T>& other) const { |
| return start == other.start && end == other.end; |
| } |
| |
| T width() const { return end - start; } |
| |
| void Shift(SignedT delta) { |
| start += delta; |
| end += delta; |
| } |
| |
| bool contains(SkRange<size_t> other) const { |
| return start <= other.start && end >= other.end; |
| } |
| |
| bool intersects(SkRange<size_t> other) const { |
| return std::max(start, other.start) <= std::min(end, other.end); |
| } |
| |
| SkRange<size_t> intersection(SkRange<size_t> other) const { |
| return SkRange<size_t>(std::max(start, other.start), std::min(end, other.end)); |
| } |
| |
| bool empty() const { |
| return start == EMPTY_INDEX && end == EMPTY_INDEX; |
| } |
| }; |
| |
| const SkRange<size_t> EMPTY_RANGE = SkRange<size_t>(EMPTY_INDEX, EMPTY_INDEX); |
| |
| |
| enum class TextBaseline { |
| kAlphabetic, |
| kIdeographic, |
| }; |
| |
| enum TextHeightBehavior { |
| kAll = 0x0, |
| kDisableFirstAscent = 0x1, |
| kDisableLastDescent = 0x2, |
| kDisableAll = 0x1 | 0x2, |
| }; |
| |
| enum class LineMetricStyle : uint8_t { |
| // Use ascent, descent, etc from a fixed baseline. |
| Typographic, |
| // Use ascent, descent, etc like css with the leading split and with height adjustments |
| CSS |
| }; |
| |
| } // namespace textlayout |
| } // namespace skia |
| |
| #endif // DartTypes_DEFINED |