jint* get_djvu_hyperlink_area(ddjvu_pageinfo_t *page_info, miniexp_t sexp, int &type, int &len) { miniexp_t iter; iter = sexp; DEBUG("Hyperlink area %s", miniexp_to_name(miniexp_car(sexp))); if (miniexp_car(iter) == miniexp_symbol("rect")) type = 1; else if (miniexp_car(iter) == miniexp_symbol("oval")) type = 2; else if (miniexp_car(iter) == miniexp_symbol("poly")) type = 3; else return NULL; len = miniexp_length(iter); jint* array = new jint[len]; int x, i = 0; iter = miniexp_cdr(iter); while (iter != miniexp_nil) { if (!number_from_miniexp(miniexp_car(iter), &x)) break; iter = miniexp_cdr(iter); array[i++] = (jint) x; if (i >= len) break; } len = i; if ((type == 1 || type == 2) && len == 4) { int miny, width, height; miny = array[1]; width = array[2]; height = array[3]; array[1] = (page_info->height - (miny + height)); array[2] = array[0] + width; array[3] = (page_info->height - miny); } if (type == 3 && (len % 2) == 0) { int ccc; for (int k = 1; k < len; k += 2) { ccc = array[k]; array[k] = (page_info->height - ccc); } } return array; }
static gboolean get_djvu_hyperlink_area (ddjvu_pageinfo_t *page_info, miniexp_t sexp, EvMapping *ev_link_mapping) { miniexp_t iter; iter = sexp; if ((miniexp_car (iter) == miniexp_symbol ("rect") || miniexp_car (iter) == miniexp_symbol ("oval")) && miniexp_length (iter) == 5) { /* FIXME: get bounding box for (oval) since Evince doesn't support shaped links */ int minx, miny, width, height; iter = miniexp_cdr (iter); if (!number_from_miniexp (miniexp_car (iter), &minx)) goto unknown_link; iter = miniexp_cdr (iter); if (!number_from_miniexp (miniexp_car (iter), &miny)) goto unknown_link; iter = miniexp_cdr (iter); if (!number_from_miniexp (miniexp_car (iter), &width)) goto unknown_link; iter = miniexp_cdr (iter); if (!number_from_miniexp (miniexp_car (iter), &height)) goto unknown_link; ev_link_mapping->area.x1 = minx; ev_link_mapping->area.x2 = (minx + width); ev_link_mapping->area.y1 = (page_info->height - (miny + height)); ev_link_mapping->area.y2 = (page_info->height - miny); } else if (miniexp_car (iter) == miniexp_symbol ("poly") && miniexp_length (iter) >= 5 && miniexp_length (iter) % 2 == 1) { /* FIXME: get bounding box since Evince doesn't support shaped links */ int minx = G_MAXINT, miny = G_MAXINT; int maxx = G_MININT, maxy = G_MININT; iter = miniexp_cdr(iter); while (iter != miniexp_nil) { int x, y; if (!number_from_miniexp (miniexp_car(iter), &x)) goto unknown_link; iter = miniexp_cdr (iter); if (!number_from_miniexp (miniexp_car(iter), &y)) goto unknown_link; iter = miniexp_cdr (iter); minx = MIN (minx, x); miny = MIN (miny, y); maxx = MAX (maxx, x); maxy = MAX (maxy, y); } ev_link_mapping->area.x1 = minx; ev_link_mapping->area.x2 = maxx; ev_link_mapping->area.y1 = (page_info->height - maxy); ev_link_mapping->area.y2 = (page_info->height - miny); } else { /* unknown */ goto unknown_link; } return TRUE; unknown_link: g_warning("DjvuLibre error: Unknown hyperlink area %s", miniexp_to_name(miniexp_car(sexp))); return FALSE; }