Skip to main content

break_positions

Function break_positions 

Source
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 回)。