7#include "attributed_glyph_line.hpp"
9#include "../required.hpp"
10#include "../alignment.hpp"
11#include "../graphic_path.hpp"
12#include "../recursive_iterator.hpp"
13#include "../geometry/extent.hpp"
14#include "../geometry/point.hpp"
39 alignment(alignment::middle_center), boundingBox(), width(0.0f), preferred_extent(), lines() {}
70 tt::alignment
const alignment=alignment::middle_center,
87 tt::alignment const alignment=alignment::middle_center,
101 std::u8string_view text,
104 tt::alignment const alignment=alignment::middle_center,
108 [[nodiscard]]
size_t size() const noexcept {
110 for (ttlet &line: lines) {
111 count += std::ssize(line);
113 return narrow_cast<size_t>(count);
116 [[nodiscard]] iterator begin() noexcept {
return recursive_iterator_begin(lines); }
117 [[nodiscard]] const_iterator begin() const noexcept {
return recursive_iterator_begin(lines); }
118 [[nodiscard]] const_iterator cbegin() const noexcept {
return recursive_iterator_begin(lines); }
120 [[nodiscard]] iterator end() noexcept {
return recursive_iterator_end(lines); }
121 [[nodiscard]] const_iterator end() const noexcept {
return recursive_iterator_end(lines); }
122 [[nodiscard]] const_iterator cend() const noexcept {
return recursive_iterator_end(lines); }
124 float topAccender() const noexcept {
125 return lines.
front().ascender;
128 float bottomDescender() const noexcept {
129 return lines.
back().descender;
132 float topCapHeight() const noexcept {
133 return lines.
front().capHeight;
136 float bottomCapHeight() const noexcept {
137 return lines.
back().capHeight;
143 if ((std::ssize(lines) % 2) == 1) {
144 return lines[std::ssize(lines) / 2].capHeight;
146 return (lines[std::ssize(lines) / 2 - 1].capHeight + lines[std::ssize(lines) / 2].capHeight) * 0.5f;
156 if (alignment == vertical_alignment::top) {
157 return height - topAccender();
158 }
else if (alignment == vertical_alignment::bottom) {
159 return bottomDescender();
160 }
else if (alignment == vertical_alignment::middle) {
173 if (alignment == vertical_alignment::top) {
174 return height - topCapHeight() * 0.5f;
175 }
else if (alignment == vertical_alignment::bottom) {
176 return height - bottomCapHeight() * 0.5f;
177 }
else if (alignment == vertical_alignment::middle) {
Class which represents an axis-aligned rectangle.
Definition axis_aligned_rectangle.hpp:18
A path is a vector graphics object.
Definition graphic_path.hpp:28
An iterator which recursively iterates through nested containers.
Definition recursive_iterator.hpp:18
Definition gstring.hpp:13
shaped_text represent a piece of text shaped to be displayed.
Definition shaped_text.hpp:23
shaped_text(std::vector< attributed_grapheme > const &text, float width, tt::alignment const alignment=alignment::middle_center, bool wrap=true) noexcept
Create shaped text from attributed text.
float baselineOffset(float height) noexcept
Get the offset of the baseline The offset of the baseline when the text needs to be rendered inside a...
Definition shaped_text.hpp:155
std::vector< int > indicesFromCoordinates(point2 start, point2 current) const noexcept
Get the index into the text from a coordinate.
std::optional< ssize_t > indexOfWordOnTheLeft(ssize_t logical_index) const noexcept
Get the first character of the word on the left.
std::optional< ssize_t > indexOfCharOnTheRight(ssize_t logical_index) const noexcept
Get the character right of the given character.
std::optional< ssize_t > indexOfWordOnTheRight(ssize_t logical_index) const noexcept
Get the last character of the word on the right.
float middleCapHeight() const noexcept
Get the capHeight of the middle line(s).
Definition shaped_text.hpp:142
std::vector< aarectangle > selectionRectangles(ssize_t first, ssize_t last) const noexcept
Return a list of merged rectangles to display for the selection.
translate2 translate_base_line(point2 position) noexcept
Get the translation for where to place the text.
Definition shaped_text.hpp:188
graphic_path get_path() const noexcept
Convert the whole shaped text into a layered path.
std::pair< ssize_t, ssize_t > indicesOfWord(ssize_t logical_index) const noexcept
Get the word with the given character.
std::pair< ssize_t, ssize_t > indicesOfParagraph(ssize_t logical_index) const noexcept
Get the character right of the given character.
aarectangle leftToRightCaret(ssize_t index, bool overwrite) const noexcept
Return the cursor-carets.
std::optional< ssize_t > indexOfCharAtCoordinate(point2 coordinate) const noexcept
Get the character close to a coordinate.
ssize_t indexAtRightSideOfWord(ssize_t logical_index) const noexcept
Get the character right of the given character.
const_iterator find(ssize_t position) const noexcept
Find a glyph that corresponds to position.
float middleOffset(float height) const noexcept
Get the offset of the middle of a line.
Definition shaped_text.hpp:172
aarectangle rectangleOfgrapheme(ssize_t index) const noexcept
Get a rectangle for the grapheme.
int indexFromCoordinate(point2 coordinate) const noexcept
Get the index into the text from a coordinate.
std::optional< ssize_t > indexOfCharOnTheLeft(ssize_t logical_index) const noexcept
Get the character left of the given character.
Definition text_style.hpp:16