This commit is contained in:
azeeee05
2026-06-10 19:30:24 +05:30
+65
View File
@@ -1075,6 +1075,71 @@ std::expected<PageModel, EngineError> 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;