unsigned int position_to_page_number(zathura_document_t* document, double pos_x, double pos_y) { g_return_val_if_fail(document != NULL, 0); unsigned int doc_width, doc_height; zathura_document_get_document_size(document, &doc_height, &doc_width); unsigned int cell_width, cell_height; zathura_document_get_cell_size(document, &cell_height, &cell_width); unsigned int c0 = zathura_document_get_first_page_column(document); unsigned int npag = zathura_document_get_number_of_pages(document); unsigned int ncol = zathura_document_get_pages_per_row(document); unsigned int nrow = (npag + c0 - 1 + ncol - 1) / ncol; /* number of rows */ unsigned int pad = zathura_document_get_page_padding(document); unsigned int col = floor(pos_x * (double)doc_width / (double)(cell_width + pad)); unsigned int row = floor(pos_y * (double)doc_height / (double)(cell_height + pad)); unsigned int page = ncol * (row % nrow) + (col % ncol); if (page < c0 - 1) { return 0; } else { return page - (c0 - 1); } }
void zathura_document_get_document_size(zathura_document_t* document, unsigned int* height, unsigned int* width) { g_return_if_fail(document != NULL && height != NULL && width != NULL); const unsigned int npag = zathura_document_get_number_of_pages(document); const unsigned int ncol = zathura_document_get_pages_per_row(document); const unsigned int c0 = zathura_document_get_first_page_column(document); const unsigned int nrow = (npag + c0 - 1 + ncol - 1) / ncol; /* number of rows */ const unsigned int pad = zathura_document_get_page_padding(document); unsigned int cell_height = 0; unsigned int cell_width = 0; zathura_document_get_cell_size(document, &cell_height, &cell_width); *width = ncol * cell_width + (ncol - 1) * pad; *height = nrow * cell_height + (nrow - 1) * pad; }
void page_number_to_position(zathura_document_t* document, unsigned int page_number, double xalign, double yalign, double* pos_x, double* pos_y) { g_return_if_fail(document != NULL); unsigned int c0 = zathura_document_get_first_page_column(document); unsigned int npag = zathura_document_get_number_of_pages(document); unsigned int ncol = zathura_document_get_pages_per_row(document); unsigned int nrow = (npag + c0 - 1 + ncol - 1) / ncol; /* number of rows */ /* row and column for page_number indexed from 0 */ unsigned int row = (page_number + c0 - 1) / ncol; unsigned int col = (page_number + c0 - 1) % ncol; /* sizes of page cell, viewport and document */ unsigned int cell_height = 0, cell_width = 0; zathura_document_get_cell_size(document, &cell_height, &cell_width); unsigned int view_height = 0, view_width = 0; zathura_document_get_viewport_size(document, &view_height, &view_width); unsigned int doc_height = 0, doc_width = 0; zathura_document_get_document_size(document, &doc_height, &doc_width); /* compute the shift to align to the viewport. If the page fits to viewport, just center it. */ double shift_x = 0.5, shift_y = 0.5; if (cell_width > view_width) { shift_x = 0.5 + (xalign - 0.5) * ((double)cell_width - (double)view_width) / (double)cell_width; } if (cell_height > view_height) { shift_y = 0.5 + (yalign - 0.5) * ((double)cell_height - (double)view_height) / (double)cell_height; } /* compute the position */ *pos_x = ((double)col + shift_x) / (double)ncol; *pos_y = ((double)row + shift_y) / (double)nrow; }
unsigned int position_to_page_number(zathura_document_t* document, double pos_x, double pos_y) { g_return_val_if_fail(document != NULL, 0); unsigned int doc_width, doc_height; zathura_document_get_document_size(document, &doc_height, &doc_width); unsigned int cell_width, cell_height; zathura_document_get_cell_size(document, &cell_height, &cell_width); unsigned int c0 = zathura_document_get_first_page_column(document); unsigned int npag = zathura_document_get_number_of_pages(document); unsigned int ncol = zathura_document_get_pages_per_row(document); unsigned int nrow = 0; unsigned int pad = zathura_document_get_page_padding(document); if (c0 == 1) { /* There is no offset, so this is easy. */ nrow = (npag + ncol - 1) / ncol; } else { /* If there is a offset, we handle the first row extra. */ nrow = 1 + (npag - (ncol - c0 - 1) + (ncol - 1)) / ncol; } unsigned int col = floor(pos_x * (double)doc_width / (double)(cell_width + pad)); unsigned int row = floor(pos_y * (double)doc_height / (double)(cell_height + pad)); unsigned int page = ncol * (row % nrow) + (col % ncol); if (page < c0 - 1) { return 0; } else { return MIN(page - (c0 - 1), npag - 1); } }