diff --git a/AUTHORS b/AUTHORS index f5f8430aa5e4788fad5f1f0efe0946e7e0754570..371ebf14237a6d9aed6d7cd18fdc7195a709e8bd 100644 --- a/AUTHORS +++ b/AUTHORS @@ -5,5 +5,6 @@ Sebastian Ramacher Other contributors are (in alphabetical order): +Christian Hesse Pavel Borzenkov William Skeith diff --git a/LICENSE b/LICENSE index ee45fdc600d9ffcb930e9020b39837065c5a2b17..490a2285df415de71c88133ee55f54ceb6920334 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011-2016 pwmt.org +Copyright (c) 2011-2017 pwmt.org This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/Makefile b/Makefile index 1fb42e256d6de6019f1d3b7321573d03ac2fbed6..835ebf7fd96ad94512f4be25d6175dc7bd1bb19e 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,8 @@ include common.mk PROJECT = zathura-pdf-mupdf PLUGIN = pdf -SOURCE = $(shell find . -iname "*.c") -HEADER = $(shell find . -iname "*.h") +SOURCE = $(sort $(wildcard *.c)) +HEADER = $(sort $(wildcard *.h)) OBJECTS = ${SOURCE:.c=.o} DOBJECTS = ${SOURCE:.c=.do} diff --git a/config.mk b/config.mk index cba8d4098b2a117237941125fa822d6e935ad624..b10e215b9391329f68162f0283e92c2e8f7e4275 100644 --- a/config.mk +++ b/config.mk @@ -2,7 +2,7 @@ VERSION_MAJOR = 0 VERSION_MINOR = 3 -VERSION_REV = 0 +VERSION_REV = 1 VERSION = ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REV} # minimum required zathura version @@ -32,10 +32,16 @@ endif OPENSSL_INC ?= $(shell pkg-config --cflags libcrypto) OPENSSL_LIB ?= $(shell pkg-config --libs libcrypto) -MUPDF_LIB ?= -lmupdf -lmujs +FREETYPE_INC ?= $(shell pkg-config --cflags freetype2) +FREETYPE_LIB ?= $(shell pkg-config --libs freetype2) -INCS = ${GTK_INC} ${GIRARA_INC} ${OPENSSL_INC} ${ZATHURA_INC} -LIBS = ${GTK_LIB} ${GIRARA_LIB} ${MUPDF_LIB} ${OPENSSL_LIB} -ljbig2dec -lopenjp2 -ljpeg +HARFBUZZ_INC ?= $(shell pkg-config --cflags harfbuzz) +HARFBUZZ_LIB ?= $(shell pkg-config --libs harfbuzz) + +MUPDF_LIB ?= -lmupdf -lmupdfthird + +INCS = ${GTK_INC} ${GIRARA_INC} ${OPENSSL_INC} ${ZATHURA_INC} ${FREETYPE_INC} ${HARFBUZZ_INC} +LIBS = ${GTK_LIB} ${GIRARA_LIB} ${MUPDF_LIB} ${OPENSSL_LIB} ${FREETYPE_LIB} ${HARFBUZZ_LIB} -ljbig2dec -lopenjp2 -ljpeg -lz # compiler flags CFLAGS += -std=c99 -fPIC -pedantic -Wall -Wno-format-zero-length $(INCS) diff --git a/document.c b/document.c index 873866c0e6294106eaafb81eac550ca91a067330..7f9f244053cd34e916d0df87dfd82f495d215276 100644 --- a/document.c +++ b/document.c @@ -3,7 +3,6 @@ #define _POSIX_C_SOURCE 1 #include -#include #include #include @@ -109,12 +108,7 @@ pdf_document_save_as(zathura_document_t* document, mupdf_document_t* } fz_try (mupdf_document->ctx) { - /* fz_write_document claims to accepts NULL as third argument but doesn't. - * pdf_write_document does not check if the third arguments is NULL for some - * options. */ - - fz_write_options opts = { 0 }; /* just use the default options */ - fz_write_document(mupdf_document->ctx, mupdf_document->document, (char*) path, &opts); + pdf_save_document(mupdf_document->ctx, (pdf_document*) mupdf_document->document, (char*) path, NULL); } fz_catch (mupdf_document->ctx) { return ZATHURA_ERROR_UNKNOWN; } diff --git a/image.c b/image.c index 97d4143322a965b5154c654c66aeab2a27de546c..b938e5c7db5a451b5de04d8c2bb8ff4f62213aca 100644 --- a/image.c +++ b/image.c @@ -93,7 +93,7 @@ pdf_page_image_get_cairo(zathura_page_t* page, mupdf_page_t* mupdf_page, fz_pixmap* pixmap = NULL; cairo_surface_t* surface = NULL; - pixmap = fz_new_pixmap_from_image(mupdf_page->ctx, mupdf_image, 0, 0); + pixmap = fz_get_pixmap_from_image(mupdf_page->ctx, mupdf_image, NULL, NULL, 0, 0); if (pixmap == NULL) { goto error_free; } diff --git a/index.c b/index.c index 8b8f8a5d0b0575474c9b15853b0388f1c840ae45..1d1ea8df9b4cfe25ca7d0c03124609eeb9da120d 100644 --- a/index.c +++ b/index.c @@ -6,7 +6,8 @@ #include "plugin.h" -static void build_index(fz_outline* outline, girara_tree_node_t* root); +static void build_index(fz_context* ctx, fz_document* document, fz_outline* + outline, girara_tree_node_t* root); girara_tree_node_t* pdf_document_index_generate(zathura_document_t* document, mupdf_document_t* mupdf_document, zathura_error_t* error) @@ -29,7 +30,7 @@ pdf_document_index_generate(zathura_document_t* document, mupdf_document_t* mupd /* generate index */ girara_tree_node_t* root = girara_node_new(zathura_index_element_new("ROOT")); - build_index(outline, root); + build_index(mupdf_document->ctx, mupdf_document->document, outline, root); /* free outline */ fz_drop_outline(mupdf_document->ctx, outline); @@ -38,7 +39,7 @@ pdf_document_index_generate(zathura_document_t* document, mupdf_document_t* mupd } static void -build_index(fz_outline* outline, girara_tree_node_t* root) +build_index(fz_context* ctx, fz_document* document, fz_outline* outline, girara_tree_node_t* root) { if (outline == NULL || root == NULL) { return; @@ -50,49 +51,24 @@ build_index(fz_outline* outline, girara_tree_node_t* root) zathura_link_type_t type = ZATHURA_LINK_INVALID; zathura_rectangle_t rect = { .x1 = 0, .y1 = 0, .x2 = 0, .y2 = 0 }; - switch (outline->dest.kind) { - case FZ_LINK_NONE: - type = ZATHURA_LINK_NONE; - break; - case FZ_LINK_URI: + if (fz_is_external_link(ctx, outline->uri) == 1) { + if (strstr(outline->uri, "file://") == outline->uri) { + type = ZATHURA_LINK_GOTO_REMOTE; + target.value = outline->uri; + } else { type = ZATHURA_LINK_URI; - target.value = outline->dest.ld.uri.uri; - break; - case FZ_LINK_GOTO: - type = ZATHURA_LINK_GOTO_DEST; - target.page_number = outline->dest.ld.gotor.page; - target.destination_type = ZATHURA_LINK_DESTINATION_XYZ; - target.left = 0; - target.top = 0; - target.scale = 0.0; - { - int gflags = outline->dest.ld.gotor.flags; - if (gflags & fz_link_flag_l_valid) { - target.left = outline->dest.ld.gotor.lt.x; - } - if (gflags & fz_link_flag_t_valid) { - target.top = outline->dest.ld.gotor.lt.y; - } - /* if (gflags & fz_link_flag_r_is_zoom) { */ - /* target.scale = outline->dest.ld.gotor.rb.x; */ - /* } */ - } - break; - case FZ_LINK_LAUNCH: - type = ZATHURA_LINK_LAUNCH; - target.value = outline->dest.ld.launch.file_spec; - break; - case FZ_LINK_NAMED: - type = ZATHURA_LINK_NAMED; - target.value = outline->dest.ld.named.named; - break; - case FZ_LINK_GOTOR: - type = ZATHURA_LINK_GOTO_REMOTE; - target.value = outline->dest.ld.gotor.file_spec; - break; - default: - outline = outline->next; // TODO: Don't skip unknown type - continue; + target.value = outline->uri; + } + } else { + float x = 0; + float y = 0; + + type = ZATHURA_LINK_GOTO_DEST; + target.destination_type = ZATHURA_LINK_DESTINATION_XYZ; + target.page_number = fz_resolve_link(ctx, document, outline->uri, &x, &y); + target.left = x; + target.top = y; + target.scale = 0.0; } index_element->link = zathura_link_new(type, rect, target); @@ -104,7 +80,7 @@ build_index(fz_outline* outline, girara_tree_node_t* root) girara_tree_node_t* node = girara_node_append_data(root, index_element); if (outline->down != NULL) { - build_index(outline->down, node); + build_index(ctx, document, outline->down, node); } outline = outline->next; diff --git a/links.c b/links.c index a947802b6ee2ea174a2867d1ebf31d9ca4548556..7423af212732a8d295f8d2b311cce9a65eb5d0ac 100644 --- a/links.c +++ b/links.c @@ -43,59 +43,31 @@ pdf_page_links_get(zathura_page_t* page, mupdf_page_t* mupdf_page, zathura_error zathura_link_type_t type = ZATHURA_LINK_INVALID; zathura_link_target_t target = { 0 }; - char* buffer = NULL; - switch (link->dest.kind) { - case FZ_LINK_NONE: - type = ZATHURA_LINK_NONE; - break; - case FZ_LINK_URI: + if (fz_is_external_link(mupdf_document->ctx, link->uri) == 1) { + if (strstr(link->uri, "file://") == link->uri) { + type = ZATHURA_LINK_GOTO_REMOTE; + target.value = link->uri; + } else { type = ZATHURA_LINK_URI; - target.value = link->dest.ld.uri.uri; - break; - case FZ_LINK_GOTO: - type = ZATHURA_LINK_GOTO_DEST; - target.page_number = link->dest.ld.gotor.page; - target.destination_type = ZATHURA_LINK_DESTINATION_XYZ; - target.left = 0; - target.top = 0; - target.scale = 0.0; - { - int gflags = link->dest.ld.gotor.flags; - if (gflags & fz_link_flag_l_valid) { - target.left = link->dest.ld.gotor.lt.x; - } - if (gflags & fz_link_flag_t_valid) { - target.top = link->dest.ld.gotor.lt.y; - } - /* if (gflags & fz_link_flag_r_is_zoom) { */ - /* target.scale = link->dest.ld.gotor.rb.x; */ - /* } */ - } - break; - case FZ_LINK_LAUNCH: - type = ZATHURA_LINK_LAUNCH; - target.value = link->dest.ld.launch.file_spec; - break; - case FZ_LINK_NAMED: - type = ZATHURA_LINK_NAMED; - target.value = link->dest.ld.named.named; - break; - case FZ_LINK_GOTOR: - type = ZATHURA_LINK_GOTO_REMOTE; - target.value = link->dest.ld.gotor.file_spec; - break; - default: - continue; + target.value = link->uri; + } + } else { + float x = 0; + float y = 0; + + type = ZATHURA_LINK_GOTO_DEST; + target.destination_type = ZATHURA_LINK_DESTINATION_XYZ; + target.page_number = fz_resolve_link(mupdf_document->ctx, + mupdf_document->document, link->uri, &x, &y); + target.left = x; + target.top = y; + target.scale = 0.0; } zathura_link_t* zathura_link = zathura_link_new(type, position, target); if (zathura_link != NULL) { girara_list_append(list, zathura_link); } - - if (buffer != NULL) { - g_free(buffer); - } } return list; diff --git a/page.c b/page.c index beb03518a89787091ed193fc0a55c8e98209d8bf..5302cb59494830cdc2d2f58d2bb865543ef0d90e 100644 --- a/page.c +++ b/page.c @@ -43,12 +43,14 @@ pdf_page_init(zathura_page_t* page) /* setup text */ mupdf_page->extracted_text = false; - mupdf_page->text = fz_new_text_page(mupdf_page->ctx); + fz_rect mediabox; + mupdf_page->text = fz_new_stext_page(mupdf_page->ctx, + fz_bound_page(mupdf_page->ctx, mupdf_page->page, &mediabox)); if (mupdf_page->text == NULL) { goto error_free; } - mupdf_page->sheet = fz_new_text_sheet(mupdf_page->ctx); + mupdf_page->sheet = fz_new_stext_sheet(mupdf_page->ctx); if (mupdf_page->sheet == NULL) { goto error_free; } @@ -74,11 +76,11 @@ pdf_page_clear(zathura_page_t* page, mupdf_page_t* mupdf_page) if (mupdf_page != NULL) { if (mupdf_page->text != NULL) { - fz_drop_text_page(mupdf_page->ctx, mupdf_page->text); + fz_drop_stext_page(mupdf_page->ctx, mupdf_page->text); } if (mupdf_page->sheet != NULL) { - fz_drop_text_sheet(mupdf_page->ctx, mupdf_page->sheet); + fz_drop_stext_sheet(mupdf_page->ctx, mupdf_page->sheet); } if (mupdf_page->page != NULL) { diff --git a/plugin.h b/plugin.h index f2fb4a063c2d918266a37758589a7fba5e9d9fa3..84c5e535b4ef5d388e66f641d4aee3ef9f273356 100644 --- a/plugin.h +++ b/plugin.h @@ -21,8 +21,8 @@ typedef struct mupdf_page_s { fz_page* page; /**< Reference to the mupdf page */ fz_context* ctx; /**< Context */ - fz_text_sheet* sheet; /**< Text sheet */ - fz_text_page* text; /**< Page text */ + fz_stext_sheet* sheet; /**< Text sheet */ + fz_stext_page* text; /**< Page text */ fz_rect bbox; /**< Bbox */ bool extracted_text; /**< If text has already been extracted */ } mupdf_page_t; diff --git a/render.c b/render.c index 2a92a234f16f35f6c3665d24e82815ba94e35fe3..00adb83aaccb537097d60d6f80349ef9d67b5455 100644 --- a/render.c +++ b/render.c @@ -20,7 +20,7 @@ pdf_page_render_to_buffer(mupdf_document_t* mupdf_document, mupdf_page_t* mupdf_ return ZATHURA_ERROR_UNKNOWN; } - fz_display_list* display_list = fz_new_display_list(mupdf_page->ctx); + fz_display_list* display_list = fz_new_display_list(mupdf_page->ctx, NULL); fz_device* device = fz_new_list_device(mupdf_page->ctx, display_list); fz_try (mupdf_document->ctx) { @@ -37,10 +37,10 @@ pdf_page_render_to_buffer(mupdf_document_t* mupdf_document, mupdf_page_t* mupdf_ fz_rect rect = { .x1 = page_width, .y1 = page_height }; fz_colorspace* colorspace = fz_device_bgr(mupdf_document->ctx); - fz_pixmap* pixmap = fz_new_pixmap_with_bbox_and_data(mupdf_page->ctx, colorspace, &irect, image); + fz_pixmap* pixmap = fz_new_pixmap_with_bbox_and_data(mupdf_page->ctx, colorspace, &irect, 1, image); fz_clear_pixmap_with_value(mupdf_page->ctx, pixmap, 0xFF); - device = fz_new_draw_device(mupdf_page->ctx, pixmap); + device = fz_new_draw_device(mupdf_page->ctx, NULL, pixmap); fz_run_display_list(mupdf_page->ctx, display_list, device, &fz_identity, &rect, NULL); fz_drop_device(mupdf_page->ctx, device); diff --git a/search.c b/search.c index 3a9fad4e6c2d8fccc65e8e3c105c523c580bd562..c672b9ff769dddd508506a54abac2a02910895a6 100644 --- a/search.c +++ b/search.c @@ -40,7 +40,7 @@ pdf_page_search_text(zathura_page_t* page, mupdf_page_t* mupdf_page, const char* } fz_rect* hit_bbox = fz_malloc_array(mupdf_page->ctx, N_SEARCH_RESULTS, sizeof(fz_rect)); - int num_results = fz_search_text_page(mupdf_page->ctx, mupdf_page->text, + int num_results = fz_search_stext_page(mupdf_page->ctx, mupdf_page->text, (char*) text, hit_bbox, N_SEARCH_RESULTS); for (int i = 0; i < num_results; i++) { diff --git a/utils.c b/utils.c index 4a003b94a37917a085bb1f0ec428bb0eddfc187e..5605783550c574435781b8069c2eaebe19c9e783 100644 --- a/utils.c +++ b/utils.c @@ -14,7 +14,7 @@ mupdf_page_extract_text(mupdf_document_t* mupdf_document, mupdf_page_t* mupdf_pa fz_device* text_device = NULL; fz_try (mupdf_page->ctx) { - text_device = fz_new_text_device(mupdf_page->ctx, mupdf_page->sheet, mupdf_page->text); + text_device = fz_new_stext_device(mupdf_page->ctx, mupdf_page->sheet, mupdf_page->text, NULL); /* Disable FZ_IGNORE_IMAGE to collect image blocks */ fz_disable_device_hints(mupdf_page->ctx, text_device, FZ_IGNORE_IMAGE); @@ -23,6 +23,7 @@ mupdf_page_extract_text(mupdf_document_t* mupdf_document, mupdf_page_t* mupdf_pa fz_scale(&ctm, 1.0, 1.0); fz_run_page(mupdf_page->ctx, mupdf_page->page, text_device, &ctm, NULL); } fz_always (mupdf_document->ctx) { + fz_close_device(mupdf_page->ctx, text_device); fz_drop_device(mupdf_page->ctx, text_device); } fz_catch(mupdf_document->ctx) { }