Fix de chu DOC khi luu: vong no pad_y=8 nuot nham DONG KE TREN khoi reflow
Build Windows portable / build (push) Canceled after 0s
Build Windows portable / build (push) Canceled after 0s
Bug thu 2 cua "luu xong de len text khac" (bug 1 - de NGANG trong dong - da fix bang mep muc that): vong no doc 8pt (sinh ra de bat dau tieng Viet ve bang op roi) nuot ca run cao co chu cua DONG KE TREN khi gian dong sat (~13-14pt): tam muc run dong tren lot vao bbox+8pt -> ca cau bi xoa, first_baseline troi len 1 dong -> khoi ve lai de len vi tri dong tren, sot manh mono dau dong (tam cao hon nguong chut). Tai hien tren file that cua user (trang 2, khoi "Cac thuoc tinh HttpOnly..." nuot dong "Path=/ khien refresh token..." ngay tren). Ban dau ket luan nham la "file nhiem artifact" - DINH CHINH trong docs/12: file sach, Path=/ la dau bullet hop le. Fix: vung no 8pt chi duoc nuot op NHO (cao < 0.6 x median cao run trong khoi - manh dau); op cao co chu phai co tam trong bbox LOI. Test hoi quy reflow_tight_leading_does_not_swallow_line_above (gian dong 13pt, khoi 2 dong duoi, dong tren phai song sot + dong moi khong cham muc dong tren). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -957,17 +957,37 @@ pub fn apply_edits(
|
||||
// Nới DỌC rộng hơn ngang: dấu tiếng Việt (ngã của Ễ…)
|
||||
// nhiều file (Canva) vẽ bằng op riêng nằm TRÊN cap —
|
||||
// tâm ngoài bbox +2pt → sót lại dấu lơ lửng sau sửa.
|
||||
// 8pt vẫn nhỏ hơn nhịp dòng (≥12pt) nên không nuốt
|
||||
// nhầm dòng bên cạnh.
|
||||
// NHƯNG vùng nở 8pt chỉ được nuốt op NHỎ (mảnh dấu
|
||||
// thấp hơn hẳn chữ): với giãn dòng sát (~1.25×) tâm
|
||||
// run của DÒNG KỀ cũng lọt vào bbox+8pt — nuốt nhầm
|
||||
// cả dòng trên làm khối vẽ lại trồi lên 1 dòng, đè
|
||||
// chữ (bug "lưu xong đè text khác"). Op cao cỡ chữ
|
||||
// thường phải có tâm trong bbox LÕI mới bị nuốt.
|
||||
let pad_x = 2.0;
|
||||
let pad_y = 8.0;
|
||||
let h_med = {
|
||||
let mut hs: Vec<f32> = idxs
|
||||
.iter()
|
||||
.filter_map(|&i| text_rect(i))
|
||||
.map(|r| r.top - r.bottom)
|
||||
.filter(|h| *h > 0.1)
|
||||
.collect();
|
||||
hs.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal));
|
||||
if hs.is_empty() { 0.0 } else { hs[hs.len() / 2] }
|
||||
};
|
||||
for i in 0..entries.len() as u16 {
|
||||
if idxs.contains(&i) {
|
||||
continue;
|
||||
}
|
||||
let Some(r) = text_rect(i) else { continue };
|
||||
let (cx, cy) = ((r.left + r.right) / 2.0, (r.bottom + r.top) / 2.0);
|
||||
if cx >= bb.left - pad_x
|
||||
let in_core = cx >= bb.left
|
||||
&& cx <= bb.right
|
||||
&& cy >= bb.bottom
|
||||
&& cy <= bb.top;
|
||||
let small = (r.top - r.bottom) < (h_med * 0.6).max(2.0);
|
||||
if (in_core || small)
|
||||
&& cx >= bb.left - pad_x
|
||||
&& cx <= bb.right + pad_x
|
||||
&& cy >= bb.bottom - pad_y
|
||||
&& cy <= bb.top + pad_y
|
||||
|
||||
Reference in New Issue
Block a user