/** * djvu_text_page_selection_process_box: * @page: #DjvuTextPage instance * @p: s-expression to append bounding box of * @delimit: character/word/... delimiter * * Appends bounding box of the line containing miniexp_t to page->results * * Returns: whether the end was not reached in this s-expression */ static gboolean djvu_text_page_selection_process_box (DjvuTextPage *page, miniexp_t p, int delimit) { if (page->results || p == page->start) { EvRectangle box; const char *text; box.x1 = miniexp_to_int (miniexp_nth (1, p)); box.y1 = miniexp_to_int (miniexp_nth (2, p)); box.x2 = miniexp_to_int (miniexp_nth (3, p)); box.y2 = miniexp_to_int (miniexp_nth (4, p)); text = miniexp_to_str (miniexp_nth (5, p)); if (text != NULL && text[0] != '\0') { if (!(delimit & 2) && page->results != NULL) { EvRectangle *union_box = (EvRectangle *)page->results->data; /* If still on the same line, add box to union */ djvu_text_page_union (union_box, &box); } else { /* A new line, a new box */ page->results = g_list_prepend (page->results, ev_rectangle_copy (&box)); } } if (p == page->end) return FALSE; } return TRUE; }
/** * djvu_text_page_sexpr_process: * @page: #DjvuTextPage instance * @p: s-expression to append * @start: first s-expression in the selection * @end: last s-expression in the selection * * Appends the rectangle defined by @p to the internal bounding box rectangle. * * Returns: whether the end was not reached in this s-expression */ static gboolean djvu_text_page_sexpr_process (DjvuTextPage *page, miniexp_t p, miniexp_t start, miniexp_t end) { if (page->bounding_box || p == start) { EvRectangle *new_rectangle = g_new (EvRectangle, 1); new_rectangle->x1 = miniexp_to_int (miniexp_nth (1, p)); new_rectangle->y1 = miniexp_to_int (miniexp_nth (2, p)); new_rectangle->x2 = miniexp_to_int (miniexp_nth (3, p)); new_rectangle->y2 = miniexp_to_int (miniexp_nth (4, p)); if (page->bounding_box) { djvu_text_page_union (page->bounding_box, new_rectangle); g_free (new_rectangle); } else page->bounding_box = new_rectangle; if (p == end) return FALSE; } return TRUE; }