pub fn break_positions(
chars: &[char],
advances: &[i32],
max_w: i32,
break_all: bool,
start_forbidden: impl Fn(char) -> bool,
end_forbidden: impl Fn(char) -> bool,
) -> Vec<usize>Expand description
折り返し位置(新しい行が始まる文字の添字)を求める。\n は強制改行として行をリセットする
(位置としては返さない。呼び出し側が \n を自分で扱う)。
- 折り返し機会:
can_break_between(前, 次)かつ「次」が行頭禁則でなく「前」が行末禁則でない (break_allなら常に機会あり)。 - 次の文字で行幅を超えるとき、そこが機会ならそこで、機会でなければ行内で最後の機会まで 戻って単語ごと次の行へ送る。行内に機会が無ければ(一語が行より長い)はみ出させる。
- 空白は行幅を超えても折り返しの引き金にしない(行末の空白はぶら下げる。CSS と同じ)。
【2026-09-26】従来は計測(vector_font)と描画(web_engine::layout)に同じ趣旨の実装が
2 つあり、どちらも「単語を送らずにはみ出させる」簡略版だった。英語の文献リスト
(sugi-lab.net/papers.htm)で単語が窓からはみ出し、描画側で勝手に改行されて重なっていた。
両者がこの関数を使うことで、箱の高さと実際の行分けが常に一致する。
計算量: O(N)(戻りの走査は各文字高々 1 回)。