| /* |
| * Copyright 2026 Rive |
| */ |
| |
| #ifndef _RIVE_LINE_BREAK_HPP_ |
| #define _RIVE_LINE_BREAK_HPP_ |
| |
| #include "rive/span.hpp" |
| #include <cstdint> |
| |
| namespace rive |
| { |
| |
| // UAX #14 line break classes after LB1 resolution (AI, SG, XX and SA never |
| // appear). Order must match CLASSES in dev/unicode/generate_line_break.py. |
| enum class LineBreakClass : uint8_t |
| { |
| AL, |
| AK, |
| AP, |
| AS, |
| B2, |
| BA, |
| BB, |
| BK, |
| CB, |
| CJ, |
| CL, |
| CM, |
| CP, |
| CR, |
| EB, |
| EM, |
| EX, |
| GL, |
| H2, |
| H3, |
| HH, |
| HL, |
| HY, |
| ID, |
| IN, |
| IS, |
| JL, |
| JT, |
| JV, |
| LF, |
| NL, |
| NS, |
| NU, |
| OP, |
| PO, |
| PR, |
| QU, |
| RI, |
| SP, |
| SY, |
| VF, |
| VI, |
| WJ, |
| ZW, |
| ZWJ, |
| }; |
| |
| // Extra properties some rules need beyond the class. Values must match the |
| // FLAG_ constants in the generator. |
| enum LineBreakFlags : uint8_t |
| { |
| lineBreakEastAsian = 1, // East_Asian_Width is F, W or H |
| lineBreakPi = 2, // General_Category Pi |
| lineBreakPf = 4, // General_Category Pf |
| lineBreakDottedCircle = 8, // U+25CC |
| lineBreakPictographicCn = 16 // Extended_Pictographic and unassigned |
| }; |
| |
| struct LineBreakProps |
| { |
| LineBreakClass cls; |
| uint8_t flags; |
| }; |
| |
| LineBreakProps lineBreakProps(uint32_t codepoint); |
| |
| enum class LineBreak : uint8_t |
| { |
| none, // no break allowed at this boundary |
| allowed, // break opportunity |
| mandatory, // hard break |
| }; |
| |
| // Computes the break status of every boundary in text. out must hold |
| // text.size() + 1 entries: out[i] is the boundary before codepoint i and |
| // out[0] is always none. End of text is always a break (LB3), reported as |
| // mandatory only when the last codepoint is itself a hard break so callers |
| // can tell a trailing empty line apart. |
| void computeLineBreaks(Span<const uint32_t> text, Span<LineBreak> out); |
| |
| } // namespace rive |
| #endif |