blob: 289a9ffd99fea90cd828a7389356a8696ac27907 [file] [log] [blame]
// 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