diff options
Diffstat (limited to 'backend/escl/escl_pdf.c')
-rw-r--r-- | backend/escl/escl_pdf.c | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/backend/escl/escl_pdf.c b/backend/escl/escl_pdf.c index 02dce66..8277e1d 100644 --- a/backend/escl/escl_pdf.c +++ b/backend/escl/escl_pdf.c @@ -44,8 +44,9 @@ #if HAVE_POPPLER_GLIB -#define INPUT_BUFFER_SIZE 4096 +#define ESCL_PDF_USE_MAPPED_FILE POPPLER_CHECK_VERSION(0,82,0) +#if ! ESCL_PDF_USE_MAPPED_FILE static unsigned char* set_file_in_buffer(FILE *fp, int *size) { @@ -70,6 +71,7 @@ set_file_in_buffer(FILE *fp, int *size) *size = nx; return data; } +#endif static unsigned char * cairo_surface_to_pixels (cairo_surface_t *surface, int bps) @@ -109,28 +111,52 @@ get_PDF_data(capabilities_t *scanner, int *width, int *height, int *bps) PopplerPage *page; PopplerDocument *doc; double dw, dh; - int w, h, size = 0; - char *data = NULL; + int w, h; unsigned char* surface = NULL; SANE_Status status = SANE_STATUS_GOOD; +#if ESCL_PDF_USE_MAPPED_FILE + GMappedFile *file; + GBytes *bytes; + + file = g_mapped_file_new_from_fd (fileno (scanner->tmp), 0, NULL); + if (!file) { + DBG(1, "Error : g_mapped_file_new_from_fd"); + status = SANE_STATUS_INVAL; + goto close_file; + } + + bytes = g_mapped_file_get_bytes (file); + if (!bytes) { + DBG(1, "Error : g_mapped_file_get_bytes"); + status = SANE_STATUS_INVAL; + goto free_file; + } + + doc = poppler_document_new_from_bytes (bytes, NULL, NULL); + if (!doc) { + DBG(1, "Error : poppler_document_new_from_bytes"); + status = SANE_STATUS_INVAL; + goto free_bytes; + } +#else + int size = 0; + char *data = NULL; data = (char*)set_file_in_buffer(scanner->tmp, &size); if (!data) { - DBG(1, "Error : poppler_document_new_from_data"); + DBG(1, "Error : set_file_in_buffer"); status = SANE_STATUS_INVAL; goto close_file; } - doc = poppler_document_new_from_data(data, - size, - NULL, - NULL); + doc = poppler_document_new_from_data (data, size, NULL, NULL); if (!doc) { DBG(1, "Error : poppler_document_new_from_data"); status = SANE_STATUS_INVAL; - goto free_file; + goto free_data; } +#endif page = poppler_document_get_page (doc, 0); if (!page) { @@ -201,8 +227,15 @@ free_page: g_object_unref (page); free_doc: g_object_unref (doc); +#if ESCL_PDF_USE_MAPPED_FILE +free_bytes: + g_bytes_unref (bytes); free_file: + g_mapped_file_unref (file); +#else +free_data: free(data); +#endif close_file: if (scanner->tmp) fclose(scanner->tmp); |