From e84d522ad355482304f06845f851f31b0147b6a7 Mon Sep 17 00:00:00 2001 From: saqib mir Date: Wed, 10 Jun 2026 14:46:56 +0530 Subject: [PATCH] fix --- engine/src/parser/pdfium_document.cpp | 65 +++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/engine/src/parser/pdfium_document.cpp b/engine/src/parser/pdfium_document.cpp index 66ce337..9b47ccf 100644 --- a/engine/src/parser/pdfium_document.cpp +++ b/engine/src/parser/pdfium_document.cpp @@ -1074,6 +1074,71 @@ std::expected PdfiumPage::extractDocumentModel() const { } } + // Phase 5H: Geometry Rollup + auto computeRunBBox = [](TextRun& r) { + if (r.glyphs.empty()) return; + double minX = r.glyphs[0].bboxX; + double minY = r.glyphs[0].bboxY; + double maxX = r.glyphs[0].bboxX + r.glyphs[0].bboxW; + double maxY = r.glyphs[0].bboxY + r.glyphs[0].bboxH; + for (size_t i = 1; i < r.glyphs.size(); ++i) { + minX = (std::min)(minX, r.glyphs[i].bboxX); + minY = (std::min)(minY, r.glyphs[i].bboxY); + maxX = (std::max)(maxX, r.glyphs[i].bboxX + r.glyphs[i].bboxW); + maxY = (std::max)(maxY, r.glyphs[i].bboxY + r.glyphs[i].bboxH); + } + r.x = minX; + r.y = minY; + r.w = maxX - minX; + r.h = maxY - minY; + }; + + auto computeLineBBox = [](TextLine& l) { + if (l.runs.empty()) return; + double minX = l.runs[0].x; + double minY = l.runs[0].y; + double maxX = l.runs[0].x + l.runs[0].w; + double maxY = l.runs[0].y + l.runs[0].h; + for (size_t i = 1; i < l.runs.size(); ++i) { + minX = (std::min)(minX, l.runs[i].x); + minY = (std::min)(minY, l.runs[i].y); + maxX = (std::max)(maxX, l.runs[i].x + l.runs[i].w); + maxY = (std::max)(maxY, l.runs[i].y + l.runs[i].h); + } + l.x = minX; + l.y = minY; + l.w = maxX - minX; + l.h = maxY - minY; + }; + + auto computeParaBBox = [](Paragraph& p) { + if (p.lines.empty()) return; + double minX = p.lines[0].x; + double minY = p.lines[0].y; + double maxX = p.lines[0].x + p.lines[0].w; + double maxY = p.lines[0].y + p.lines[0].h; + for (size_t i = 1; i < p.lines.size(); ++i) { + minX = (std::min)(minX, p.lines[i].x); + minY = (std::min)(minY, p.lines[i].y); + maxX = (std::max)(maxX, p.lines[i].x + p.lines[i].w); + maxY = (std::max)(maxY, p.lines[i].y + p.lines[i].h); + } + p.x = minX; + p.y = minY; + p.w = maxX - minX; + p.h = maxY - minY; + }; + + for (auto& p : paragraphs) { + for (auto& l : p.lines) { + for (auto& r : l.runs) { + computeRunBBox(r); + } + computeLineBBox(l); + } + computeParaBBox(p); + } + model.paragraphs = std::move(paragraphs); return model;