zathura_rectangle_t recalc_rectangle(zathura_page_t* page, zathura_rectangle_t rectangle) { if (page == NULL) { goto error_ret; } zathura_document_t* document = zathura_page_get_document(page); if (document == NULL) { goto error_ret; } double page_height = zathura_page_get_height(page); double page_width = zathura_page_get_width(page); double scale = zathura_document_get_scale(document); zathura_rectangle_t tmp = rotate_rectangle(rectangle, zathura_document_get_rotation(document), page_height, page_width); tmp.x1 *= scale; tmp.x2 *= scale; tmp.y1 *= scale; tmp.y2 *= scale; return tmp; error_ret: return rectangle; }
bool sc_rotate(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int t) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); zathura_t* zathura = session->global.data; g_return_val_if_fail(zathura->document != NULL, false); const unsigned int page_number = zathura_document_get_current_page_number(zathura->document); int angle = 90; if (argument != NULL && argument->n == ROTATE_CCW) { angle = 270; } /* update rotate value */ t = (t == 0) ? 1 : t; unsigned int rotation = zathura_document_get_rotation(zathura->document); zathura_document_set_rotation(zathura->document, (rotation + angle * t) % 360); /* update scale */ girara_argument_t new_argument = { zathura_document_get_adjust_mode(zathura->document), NULL }; sc_adjust_window(zathura->ui.session, &new_argument, NULL, 0); /* render all pages again */ render_all(zathura); page_set(zathura, page_number); return false; }
double page_calc_height_width(zathura_page_t* page, unsigned int* page_height, unsigned int* page_width, bool rotate) { g_return_val_if_fail(page != NULL && page_height != NULL && page_width != NULL, 0.0); zathura_document_t* document = zathura_page_get_document(page); if (document == NULL) { return 0.0; } double height = zathura_page_get_height(page); double width = zathura_page_get_width(page); double scale = zathura_document_get_scale(document); double real_scale; if (rotate && zathura_document_get_rotation(document) % 180) { *page_width = ceil(height * scale); *page_height = ceil(width * scale); real_scale = MAX(*page_width / height, *page_height / width); } else { *page_width = ceil(width * scale); *page_height = ceil(height * scale); real_scale = MAX(*page_width / width, *page_height / height); } return real_scale; }
double page_calc_height_width(zathura_document_t* document, double height, double width, unsigned int* page_height, unsigned int* page_width, bool rotate) { g_return_val_if_fail(document != NULL && page_height != NULL && page_width != NULL, 0.0); double scale = zathura_document_get_scale(document); if (rotate && zathura_document_get_rotation(document) % 180) { *page_width = round(height * scale); *page_height = round(width * scale); scale = MAX(*page_width / height, *page_height / width); } else { *page_width = round(width * scale); *page_height = round(height * scale); scale = MAX(*page_width / width, *page_height / height); } return scale; }
void page_calc_position(zathura_document_t* document, double x, double y, double* xn, double* yn) { g_return_if_fail(document != NULL && xn != NULL && yn != NULL); const unsigned int rot = zathura_document_get_rotation(document); if (rot == 90) { *xn = 1 - y; *yn = x; } else if (rot == 180) { *xn = 1 - x; *yn = 1 - y; } else if (rot == 270) { *xn = y; *yn = 1 - x; } else { *xn = x; *yn = y; } }
char* djvu_page_get_text(zathura_page_t* page, void* UNUSED(data), zathura_rectangle_t rectangle, zathura_error_t* error) { if (page == NULL) { if (error != NULL) { *error = ZATHURA_ERROR_INVALID_ARGUMENTS; } goto error_ret; } zathura_document_t* document = zathura_page_get_document(page); if (document == NULL) { goto error_ret; } djvu_document_t* djvu_document = zathura_document_get_data(document); djvu_page_text_t* page_text = djvu_page_text_new(djvu_document, page); if (page_text == NULL) { goto error_ret; } double tmp = 0; double page_height = zathura_page_get_height(page); double page_width = zathura_page_get_width(page); switch (zathura_document_get_rotation(document)) { case 90: tmp = rectangle.x1; rectangle.x1 = rectangle.y1; rectangle.y1 = tmp; tmp = rectangle.x2; rectangle.x2 = rectangle.y2; rectangle.y2 = tmp; break; case 180: tmp = rectangle.x1; rectangle.x1 = (page_width - rectangle.x2); rectangle.x2 = (page_width - tmp); break; case 270: tmp = rectangle.y2; rectangle.y2 = (page_height - rectangle.x1); rectangle.x1 = (page_width - tmp); tmp = rectangle.y1; rectangle.y1 = (page_height - rectangle.x2); rectangle.x2 = (page_width - tmp); break; default: tmp = rectangle.y1; rectangle.y1 = (page_height - rectangle.y2); rectangle.y2 = (page_height - tmp); break; } /* adjust to scale */ rectangle.x1 /= ZATHURA_DJVU_SCALE; rectangle.x2 /= ZATHURA_DJVU_SCALE; rectangle.y1 /= ZATHURA_DJVU_SCALE; rectangle.y2 /= ZATHURA_DJVU_SCALE; char* text = djvu_page_text_select(page_text, rectangle); djvu_page_text_free(page_text); return text; error_ret: if (error != NULL && *error == ZATHURA_ERROR_OK) { *error = ZATHURA_ERROR_UNKNOWN; } return NULL; }