diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/gtkpdf.c | 670 | ||||
-rw-r--r-- | test/pdfclean.c | 173 | ||||
-rw-r--r-- | test/pdfdebug.c | 188 | ||||
-rw-r--r-- | test/pdffunction.c | 263 | ||||
-rw-r--r-- | test/pdfmerge.c | 230 | ||||
-rw-r--r-- | test/pdfrip.c | 182 | ||||
-rw-r--r-- | test/showcmap.c | 22 | ||||
-rw-r--r-- | test/w32pdf.c | 656 | ||||
-rw-r--r-- | test/x11pdf.c | 590 | ||||
-rw-r--r-- | test/ximage.c | 666 |
10 files changed, 0 insertions, 3640 deletions
diff --git a/test/gtkpdf.c b/test/gtkpdf.c deleted file mode 100644 index 07730b38..00000000 --- a/test/gtkpdf.c +++ /dev/null @@ -1,670 +0,0 @@ -/* - -TODO: - - threaded pdf/page loading - - info dialog - - resource dialog - - password dialog - - outline tree - - magnifying glass - - text selection - - text search - -*/ - -#include <fitz.h> -#include <mupdf.h> - -#include <gtk/gtk.h> -#include <glib.h> -#include <pthread.h> - -typedef struct PDFApp PDFApp; - -enum { ZOOM, FITWIDTH, FITPAGE }; - -struct PDFApp -{ - GtkWidget *canvas; - GtkWidget *status; - GtkWidget *scroll; - int statusid; - int viewmode; - - char *filename; - int pageno; - int rotate; - float zoom; - - fz_renderer *gc; - pdf_xref *xref; - pdf_pagetree *pagetree; - fz_obj *pageobj; - pdf_page *page; - fz_pixmap *image; -}; - -static volatile int busy = 0; - -PDFApp *gapp; - -static void showstatus(char *fmt, ...) -{ - char msg[256]; - va_list ap; - - va_start(ap, fmt); - vsnprintf(msg, 256, fmt, ap); - va_end(ap); - - gtk_statusbar_pop(GTK_STATUSBAR(gapp->status), gapp->statusid); - gtk_statusbar_push(GTK_STATUSBAR(gapp->status), gapp->statusid, msg); -} - -static void panic(fz_error *error) -{ - gapp->filename = ""; - gapp->pageno = 1; - gapp->rotate = 0; - gapp->zoom = 1.0; - - gapp->gc = nil; - gapp->xref = nil; - gapp->pagetree = nil; - gapp->page = nil; - gapp->image = nil; - - fz_abort(error); -} - -static void forkwork(void*(*func)(void*)) -{ - pthread_t tid; - if (busy) return; - pthread_create(&tid, NULL, func, nil); -} - -static void* drawpage(void*args) -{ - char msg[256]; - fz_error *error; - float scalex, scaley, scale; - fz_matrix ctm; - fz_irect bbox; - fz_obj *obj; - - if (!gapp->xref) - return nil; - - busy = 1; - - while (gapp->rotate < 0) - gapp->rotate += 360; - gapp->rotate = gapp->rotate % 360; - - obj = pdf_getpageobject(gapp->pagetree, gapp->pageno - 1); - if (obj == gapp->pageobj) - goto Lskipload; - gapp->pageobj = obj; - - if (gapp->page) - pdf_droppage(gapp->page); - - gdk_threads_enter(); - sprintf(msg, " loading page %d ... ", gapp->pageno); - showstatus(msg); - gdk_threads_leave(); - - error = pdf_loadpage(&gapp->page, gapp->xref, gapp->pageobj); - if (error) - panic(error); - -Lskipload: - - gdk_threads_enter(); - showstatus(" drawing ... "); - - ctm = fz_identity(); - ctm = fz_concat(ctm, fz_translate(0, -gapp->page->mediabox.max.y)); - ctm = fz_concat(ctm, fz_rotate(gapp->rotate + gapp->page->rotate)); - bbox = fz_roundrect(fz_transformaabb(ctm, gapp->page->mediabox)); - - scale = gapp->zoom; - scalex = scaley = 1.0; - - if (gapp->viewmode == FITWIDTH || gapp->viewmode == FITPAGE) - { - GtkAdjustment *hadj; - int w; - hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(gapp->scroll)); - w = bbox.max.x - bbox.min.x; - if (w != 0) - scalex = hadj->page_size / (float)w; - scale = scalex; - } - - if (gapp->viewmode == FITPAGE) - { - GtkAdjustment *vadj; - int h; - vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gapp->scroll)); - h = bbox.max.y - bbox.min.y; - if (h != 0) - scaley = vadj->page_size / (float)h; - scale = MIN(scale, scaley); - } - - gapp->zoom = scale; - - gdk_threads_leave(); - - if (gapp->image) - fz_droppixmap(gapp->image); - gapp->image = nil; - - ctm = fz_identity(); - ctm = fz_concat(ctm, fz_translate(0, -gapp->page->mediabox.max.y)); - ctm = fz_concat(ctm, fz_scale(gapp->zoom, -gapp->zoom)); - ctm = fz_concat(ctm, fz_rotate(gapp->rotate + gapp->page->rotate)); - bbox = fz_roundrect(fz_transformaabb(ctm, gapp->page->mediabox)); - - error = fz_rendertree(&gapp->image, gapp->gc, gapp->page->tree, ctm, bbox, 1); - if (error) - panic(error); - - gdk_threads_enter(); - sprintf(msg, " page %d of %d zoom %g rotate %d ", - gapp->pageno, pdf_getpagecount(gapp->pagetree), - gapp->zoom, gapp->rotate); - showstatus(msg); - gtk_widget_set_usize(gapp->canvas, gapp->image->w, gapp->image->h); - gtk_widget_queue_draw(gapp->canvas); - gdk_threads_leave(); - - busy = 0; - - return nil; -} - -static void* openpdf(void*args) -{ - fz_error *error; - char msg[256]; - - busy = 1; - - gdk_threads_enter(); - sprintf(msg, " Loading %s...", gapp->filename); - showstatus(msg); - gdk_threads_leave(); - - if (gapp->xref) - { - pdf_droppage(gapp->page); - pdf_droppagetree(gapp->pagetree); - pdf_closepdf(gapp->xref); - gapp->page = nil; - gapp->pagetree = nil; - gapp->xref = nil; - } - - error = pdf_openpdf(&gapp->xref, gapp->filename); - if (error) panic(error); - - error = pdf_decryptpdf(gapp->xref); - if (error) panic(error); - - /* TODO: ask for password */ - if (gapp->xref->crypt) - { - error = pdf_setpassword(gapp->xref->crypt, ""); - if (error) panic(error); - } - - error = pdf_loadpagetree(&gapp->pagetree, gapp->xref); - if (error) panic(error); - - gdk_threads_enter(); - showstatus(""); - gdk_threads_leave(); - - gapp->pageno = 1; - drawpage(nil); - - busy = 0; - - return nil; -} - -/* - * Handle event callbacks - */ - -static void onquit(GtkWidget *widget, void *data) -{ - exit(0); -} - -static void onopenokay(GtkWidget *w, GtkFileSelection *fs) -{ - gapp->filename = strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs))); - gtk_widget_destroy(GTK_WIDGET(fs)); - forkwork(openpdf); -} - -static void onopen(GtkWidget *widget, void *data) -{ - GtkWidget *filew; - if (busy) return; - filew = gtk_file_selection_new ("Open PDF file"); - gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), - "clicked", (GtkSignalFunc)onopenokay, filew); - gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button), - "clicked", (GtkSignalFunc)gtk_widget_destroy, GTK_OBJECT(filew)); - gtk_widget_show(filew); -} - -static void oninfo(GtkWidget *widget, void *data) -{ -} - -static void onback10(GtkWidget *widget, void *data) -{ - if (busy) return; - if (!gapp->xref) return; - gapp->pageno -= 10; - if (gapp->pageno < 1) - gapp->pageno = 1; - forkwork(drawpage); -} - -static void onnext10(GtkWidget *widget, void *data) -{ - if (busy) return; - if (!gapp->xref) return; - gapp->pageno += 10; - if (gapp->pageno > pdf_getpagecount(gapp->pagetree)) - gapp->pageno = pdf_getpagecount(gapp->pagetree); - forkwork(drawpage); -} - -static void onback(GtkWidget *widget, void *data) -{ - if (busy) return; - if (!gapp->xref) return; - if (gapp->pageno > 1) - { - gapp->pageno --; - forkwork(drawpage); - } -} - -static void onnext(GtkWidget *widget, void *data) -{ - if (busy) return; - if (!gapp->xref) return; - if (gapp->pageno < pdf_getpagecount(gapp->pagetree)) - { - gapp->pageno ++; - forkwork(drawpage); - } -} - -static void onfirst(GtkWidget *widget, void *data) -{ - if (busy) return; - if (!gapp->xref) return; - gapp->pageno = 1; - forkwork(drawpage); -} - -static void onlast(GtkWidget *widget, void *data) -{ - if (busy) return; - if (!gapp->xref) return; - gapp->pageno = pdf_getpagecount(gapp->pagetree); - forkwork(drawpage); -} - -static void onzoomin(GtkWidget * widget, void *data) -{ - gapp->viewmode = ZOOM; - gapp->zoom *= 1.25; - forkwork(drawpage); -} - -static void onzoomout(GtkWidget * widget, void *data) -{ - gapp->viewmode = ZOOM; - gapp->zoom *= 0.8; - forkwork(drawpage); -} - -static void onzoom100(GtkWidget * widget, void *data) -{ - gapp->viewmode = ZOOM; - gapp->zoom = 1.0; - forkwork(drawpage); -} - -static void onrotl(GtkWidget *widget, void *data) { gapp->rotate -= 90; forkwork(drawpage); } -static void onrotr(GtkWidget *widget, void *data) { gapp->rotate += 90; forkwork(drawpage); } - -static void onfitwidth(GtkWidget *widget, void *data) -{ - gapp->viewmode = FITWIDTH; - forkwork(drawpage); -} - -static void onfitpage(GtkWidget *widget, void *data) -{ - gapp->viewmode = FITPAGE; - forkwork(drawpage); -} - -static int startxpos; -static int startypos; -static int dopan = 0; -guint32 pangrabtime = 0; - -static void mousedown(GtkWidget *widget, GdkEventMotion *event, void *data) -{ - GdkModifierType mods; - gtk_widget_grab_focus(gapp->scroll); - - gdk_window_get_pointer(gapp->scroll->window, &startxpos, &startypos, &mods); - if (mods & GDK_BUTTON2_MASK) { - GtkAdjustment *adj; - adj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(gapp->scroll)); - startxpos += adj->value; - - adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gapp->scroll)); - startypos += adj->value; - - gdk_pointer_grab(gapp->scroll->window, TRUE, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, NULL, NULL /* TODO: pan cursor */, event->time); - - dopan = 1; - } - else { - dopan = 0; - } -} - -static void mouseup(GtkWidget *widget, GdkEventMotion *event, void *data) -{ - dopan = 0; - gdk_pointer_ungrab(event->time); -} - -static void mousemove(GtkWidget *widget, GdkEventMotion *event, void *data) -{ - int xpos, ypos; - GdkModifierType mods; - GtkAdjustment *adj; - - if (!dopan) return; - - gdk_window_get_pointer(gapp->scroll->window, &xpos, &ypos, &mods); - - if (mods & GDK_BUTTON2_MASK) { - adj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(gapp->scroll)); - adj->value = startxpos - xpos; - adj->value = CLAMP(adj->value, adj->lower, adj->upper - adj->page_size); - - gtk_adjustment_value_changed(adj); - - adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gapp->scroll)); - adj->value = startypos - ypos; - adj->value = CLAMP(adj->value, adj->lower, adj->upper - adj->page_size); - - /* clamp to viewport... */ - - gtk_adjustment_value_changed(adj); - } - else - mouseup(widget, event, data); -} - -static void keypress(GtkWidget *widget, GdkEventKey *event, void *data) -{ - if (busy) return; - switch (event->string[0]) - { - case 'q': onquit(widget, data); break; - case 'g': onlast(widget, data); break; - case '0': onfirst(widget, data); break; - case 'b': onback(widget, data); break; - case 'B': onback10(widget, data); break; - case ' ': onnext(widget, data); break; - case 'f': onnext(widget, data); break; - case 'F': onnext10(widget, data); break; - case '+': onzoomin(widget, data); break; - case '-': onzoomout(widget, data); break; - case '1': onzoom100(widget, data); break; - case 'l': onrotl(widget, data); break; - case 'r': onrotr(widget, data); break; - case 'L': gapp->rotate -= 15; forkwork(drawpage); break; - case 'R': gapp->rotate += 15; forkwork(drawpage); break; - } -} - -static void onexpose(GtkWidget *widget, GdkEventExpose *event, void *data) -{ - PDFApp *app = data; - if (app->image) - { - int x0 = event->area.x; - int y0 = event->area.y; - int w = event->area.width; - int h = event->area.height; - int x1, y1; - int x, y; - - unsigned char *rgb = fz_malloc(w * h * 3); - unsigned char *s, *d; - - x1 = MIN(x0 + w, app->image->w); - y1 = MIN(y0 + h, app->image->h); - - if (x0 + w > x1 || y0 + h > y1) - memset(rgb, 200, w * h * 3); - - for (y = y0; y < y1; y++) - { - s = app->image->samples + (y * app->image->w + x0) * 4; - d = rgb + (y - y0) * w * 3; - for (x = x0; x < x1; x++) - { - d[0] = s[1]; - d[1] = s[2]; - d[2] = s[3]; - s += 4; - d += 3; - } - } - - gdk_draw_rgb_image(widget->window, - widget->style->black_gc, - x0, y0, w, h, - GDK_RGB_DITHER_NONE, rgb, - w * 3); - - fz_free(rgb); - } -} - -/* - * Construct widgets - */ - -static GtkWidget * -addmenuitem(GtkWidget *menu, const char *name, GtkSignalFunc callback, - void *callback_data, GtkAccelGroup *ag, const char *accel) -{ - GtkWidget *menuitem; - menuitem = gtk_menu_item_new_with_label(name); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); - if (accel != NULL) - { - guint accel_key, accel_mods; - gtk_accelerator_parse(accel, &accel_key, &accel_mods); - gtk_widget_add_accelerator(menuitem, "activate", ag, - accel_key, accel_mods, GTK_ACCEL_VISIBLE); - } - gtk_signal_connect(GTK_OBJECT(menuitem), "activate", - (GtkSignalFunc)callback, callback_data); - return menuitem; -} - -static void -addmenuseparator(GtkWidget *menu) -{ - GtkWidget *menuitem; - menuitem = gtk_menu_item_new(); - gtk_menu_append(GTK_MENU(menu), menuitem); - gtk_widget_show(menuitem); -} - -void makeapp(PDFApp *app) -{ - GtkWidget *frame; - GtkWidget *menubar; - GtkWidget *menu; - GtkWidget *menuitem; - GtkWidget *da; - GtkWidget *sb; - GtkWidget *sv; - GtkWidget *vbox; - GtkAccelGroup *ag; - void *data = app; - - frame = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_signal_connect(GTK_OBJECT(frame), "destroy", (GtkSignalFunc)onquit, "WM destroy"); - gtk_window_set_title(GTK_WINDOW(frame), "MuPDF"); - gtk_widget_set_usize(GTK_WIDGET(frame), 300, 200); - - vbox = gtk_vbox_new(FALSE, 1); - gtk_container_add(GTK_CONTAINER(frame), vbox); - gtk_widget_show(vbox); - - menubar = gtk_menu_bar_new(); - ag = gtk_accel_group_new(); - gtk_window_add_accel_group(GTK_WINDOW(frame), ag); - gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); - gtk_widget_show(menubar); - - menu = gtk_menu_new(); - menuitem = gtk_menu_item_new_with_label("File"); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); - gtk_menu_bar_append(GTK_MENU_BAR(menubar), menuitem); - gtk_widget_show(menuitem); - gtk_menu_set_accel_group(GTK_MENU(menu), ag); - addmenuitem(menu, "Info...", (GtkSignalFunc)oninfo, data, ag, "<ctrl>I"); - addmenuitem(menu, "Open...", (GtkSignalFunc)onopen, data, ag, "<ctrl>O"); - addmenuseparator(menu); - addmenuitem(menu, "Quit", (GtkSignalFunc)onquit, data, ag, "<ctrl>Q"); - - menu = gtk_menu_new(); - menuitem = gtk_menu_item_new_with_label("Go"); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); - gtk_menu_bar_append(GTK_MENU_BAR(menubar), menuitem); - gtk_widget_show(menuitem); - gtk_menu_set_accel_group(GTK_MENU(menu), ag); - addmenuitem(menu, "Back", (GtkSignalFunc)onback10, data, ag, "<ctrl>B"); - addmenuitem(menu, "Next", (GtkSignalFunc)onnext10, data, ag, "<ctrl>F"); - addmenuitem(menu, "Back 10", (GtkSignalFunc)onback10, data, ag, nil); - addmenuitem(menu, "Next 10", (GtkSignalFunc)onnext10, data, ag, nil); - addmenuseparator(menu); - addmenuitem(menu, "First", (GtkSignalFunc)onfirst, data, ag, nil); - addmenuitem(menu, "Last", (GtkSignalFunc)onlast, data, ag, "<ctrl>G"); - - menu = gtk_menu_new(); - menuitem = gtk_menu_item_new_with_label("View"); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu); - gtk_menu_bar_append(GTK_MENU_BAR(menubar), menuitem); - gtk_widget_show(menuitem); - gtk_menu_set_accel_group(GTK_MENU(menu), ag); - addmenuitem(menu, "Zoom in", (GtkSignalFunc)onzoomin, data, ag, "<ctrl>'+'"); - addmenuitem(menu, "Zoom out", (GtkSignalFunc)onzoomout, data, ag, "<ctrl>'-'"); - addmenuitem(menu, "Zoom 100%", (GtkSignalFunc)onzoom100, data, ag, "<ctrl>1"); - addmenuitem(menu, "Fit width", (GtkSignalFunc)onfitwidth, data, ag, nil); - addmenuitem(menu, "Fit page", (GtkSignalFunc)onfitpage, data, ag, nil); - addmenuseparator(menu); - addmenuitem(menu, "Rotate left", (GtkSignalFunc)onrotl, data, ag, "<ctrl>L"); - addmenuitem(menu, "Rotate right", (GtkSignalFunc)onrotr, data, ag, "<ctrl>R"); - - sv = gtk_scrolled_window_new(NULL, NULL); - app->scroll = sv; - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sv), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - GTK_WIDGET_SET_FLAGS(sv, GTK_CAN_FOCUS); - gtk_widget_set_extension_events(sv, GDK_EXTENSION_EVENTS_ALL); - gtk_signal_connect(GTK_OBJECT(sv), "button_press_event", (GtkSignalFunc)mousedown, data); - gtk_signal_connect(GTK_OBJECT(sv), "motion_notify_event", (GtkSignalFunc)mousemove, data); - gtk_signal_connect(GTK_OBJECT(sv), "button_release_event", (GtkSignalFunc)mouseup, data); - gtk_signal_connect(GTK_OBJECT(sv), "key_press_event", (GtkSignalFunc)keypress, data); - gtk_box_pack_start(GTK_BOX(vbox), sv, TRUE, TRUE, 0); - gtk_widget_show(sv); - - da = gtk_drawing_area_new(); - app->canvas = da; - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sv), da); - gtk_signal_connect(GTK_OBJECT(da), "expose_event", (GtkSignalFunc)onexpose, data); - gtk_widget_set_events (da, - GDK_BUTTON_PRESS_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_POINTER_MOTION_MASK); - gtk_widget_show(da); - - sb = gtk_statusbar_new(); - app->status = sb; - app->statusid = gtk_statusbar_get_context_id(GTK_STATUSBAR(sb), "mupdf"); - gtk_box_pack_start(GTK_BOX(vbox), sb, FALSE, FALSE, 0); - gtk_widget_show(sb); - - gtk_window_set_default_size(GTK_WINDOW(frame), 512, 512); - gtk_widget_grab_focus(sv); - gtk_widget_show(frame); -} - -int main(int argc, char **argv) -{ - fz_error *error; - PDFApp theapp; - - g_thread_init(NULL); - gtk_init(&argc, &argv); - gtk_widget_set_default_colormap(gdk_rgb_get_cmap()); - gtk_widget_set_default_visual(gdk_rgb_get_visual()); - - makeapp(&theapp); - gapp = &theapp; - - gapp->pageno = 1; - gapp->rotate = 0; - gapp->zoom = 1.0; - - gapp->image = nil; - gapp->xref = nil; - gapp->pagetree = nil; - gapp->page = nil; - - fz_cpudetect(); - fz_accelerate(); - - error = fz_newrenderer(&gapp->gc, pdf_devicergb, 0, 1024 * 512); - if (error) - fz_abort(error); - - if (argc > 1) - { - gapp->filename = argv[1]; - forkwork(openpdf); - } - - gdk_threads_enter(); - gtk_main(); - gdk_threads_leave(); - return 0; -} - diff --git a/test/pdfclean.c b/test/pdfclean.c deleted file mode 100644 index a55b94ef..00000000 --- a/test/pdfclean.c +++ /dev/null @@ -1,173 +0,0 @@ -#include <fitz.h> -#include <mupdf.h> - -void usage() -{ - fprintf(stderr, - "usage: pdfclean [options] infile.pdf outfile.pdf\n" - " -r\trebuild xref table\n" - " -g\tgarbage collect unused objects\n" - " -x\texpand compressed streams\n" - " -d -\tset user password for decryption\n" - " -e\tencrypt outfile\n" - " -u -\tset user password for encryption\n" - " -o -\tset owner password\n" - " -p -\tset permissions\n" - " -n -\tkey length in bits: 40 <= n <= 128\n" - ); - exit(1); -} - -void preloadobjstms(pdf_xref *xref) -{ - fz_error *error; - fz_obj *obj; - int i; - - for (i = 0; i < xref->len; i++) - { - if (xref->table[i].type == 'o') - { - error = pdf_loadobject(&obj, xref, i, 0); - if (error) fz_abort(error); - fz_dropobj(obj); - } - } -} - -void expandstreams(pdf_xref *xref) -{ - fz_error *error; - fz_obj *stmobj; - fz_buffer *buf; - fz_obj *stmlen; - int i, gen; - - for (i = 0; i < xref->len; i++) - { - if (xref->table[i].type == 'n') - { - gen = xref->table[i].gen; - - if (pdf_isstream(xref, i, gen)) - { - error = pdf_loadobject(&stmobj, xref, i, gen); - if (error) fz_abort(error); - - error = pdf_loadstream(&buf, xref, i, gen); - if (error) fz_abort(error); - - fz_dictdels(stmobj, "Filter"); - fz_dictdels(stmobj, "DecodeParms"); - - error = fz_newint(&stmlen, buf->wp - buf->rp); - if (error) fz_abort(error); - error = fz_dictputs(stmobj, "Length", stmlen); - if (error) fz_abort(error); - fz_dropobj(stmlen); - - pdf_updateobject(xref, i, gen, stmobj); - pdf_updatestream(xref, i, gen, buf); - - fz_dropobj(stmobj); - } - } - } -} - -int main(int argc, char **argv) -{ - fz_error *error; - char *infile; - char *outfile; - pdf_xref *xref; - int c; - - pdf_crypt *encrypt = 0; - int doencrypt = 0; - int dorepair = 0; - int doexpand = 0; - int dogc = 0; - - char *userpw = ""; - char *ownerpw = ""; - int perms = -4; /* 0xfffffffc */ - int keylen = 40; - char *password = ""; - - while ((c = getopt(argc, argv, "rgxd:eu:o:p:n:")) != -1) - { - switch (c) - { - case 'r': ++ dorepair; break; - case 'x': ++ doexpand; break; - case 'g': ++ dogc; break; - case 'e': ++ doencrypt; break; - case 'u': userpw = optarg; break; - case 'o': ownerpw = optarg; break; - case 'p': perms = atoi(optarg); break; - case 'n': keylen = atoi(optarg); break; - case 'd': password = optarg; break; - default: usage(); - } - } - - if (argc - optind < 2) - usage(); - - infile = argv[optind++]; - outfile = argv[optind++]; - - error = pdf_newxref(&xref); - - if (dorepair) - error = pdf_repairxref(xref, infile); - else - error = pdf_loadxref(xref, infile); - if (error) - fz_abort(error); - - error = pdf_decryptxref(xref); - if (error) - fz_abort(error); - - if (xref->crypt) - { - error = pdf_setpassword(xref->crypt, password); - if (error) fz_abort(error); - } - - if (doencrypt) - { - fz_obj *id = fz_dictgets(xref->trailer, "ID"); - if (!id) - fz_packobj(&id, "[(ABCDEFGHIJKLMNOP)(ABCDEFGHIJKLMNOP)]"); - else - fz_keepobj(id); - error = pdf_newencrypt(&encrypt, userpw, ownerpw, perms, keylen, id); - if (error) - fz_abort(error); - fz_dropobj(id); - } - - if (doexpand) - expandstreams(xref); - - if (dogc) - { - preloadobjstms(xref); - pdf_garbagecollect(xref); - } - - error = pdf_savexref(xref, outfile, encrypt); - if (error) - fz_abort(error); - - if (encrypt) - pdf_dropcrypt(encrypt); - - pdf_closexref(xref); - - return 0; -} - diff --git a/test/pdfdebug.c b/test/pdfdebug.c deleted file mode 100644 index 2a18ade7..00000000 --- a/test/pdfdebug.c +++ /dev/null @@ -1,188 +0,0 @@ -#include <fitz.h> -#include <mupdf.h> - -static char *password = ""; -static int dodecode = 0; -static int doprintxref = 0; - -void usage() -{ - fprintf(stderr, "usage: pdfdebug [-dxs] [-u password] file.pdf [oid ...]\n"); - exit(1); -} - -/* - * Debug-print stream contents - */ - -static int safecol = 0; - -void printsafe(unsigned char *buf, int n) -{ - int i; - for (i = 0; i < n; i++) { - if (buf[i] == '\r' || buf[i] == '\n') { - printf("\n"); - safecol = 0; - } - else if (buf[i] < 32 || buf[i] > 126) { - printf("."); - safecol ++; - } - else { - printf("%c", buf[i]); - safecol ++; - } - if (safecol == 79) { - printf("\n"); - safecol = 0; - } - } -} - -void decodestream(pdf_xref *xref, int oid, int gid) -{ - fz_error *error; - unsigned char buf[512]; - - safecol = 0; - - error = pdf_openstream(xref, oid, gid); - if (error) fz_abort(error); - - while (1) - { - int n = fz_read(xref->stream, buf, sizeof buf); - if (n == 0) - break; - if (n < 0) - fz_abort(fz_ferror(xref->stream)); - printsafe(buf, n); - } - - pdf_closestream(xref); -} - -void copystream(pdf_xref *xref, int oid, int gid) -{ - fz_error *error; - unsigned char buf[512]; - - safecol = 0; - - error = pdf_openrawstream(xref, oid, gid); - if (error) fz_abort(error); - - while (1) - { - int n = fz_read(xref->stream, buf, sizeof buf); - if (n == 0) - break; - if (n < 0) - fz_abort(fz_ferror(xref->stream)); - printsafe(buf, n); - } - - pdf_closestream(xref); -} - -void printobject(pdf_xref *xref, int oid, int gid) -{ - fz_error *error; - fz_obj *obj; - - error = pdf_loadobject(&obj, xref, oid, gid); - if (error) fz_abort(error); - - printf("%d %d obj\n", oid, gid); - fz_debugobj(obj); - printf("\n"); - - if (xref->table[oid].stmofs) { - printf("stream\n"); - if (dodecode) - decodestream(xref, oid, gid); - else - copystream(xref, oid, gid); - printf("endstream\n"); - } - - printf("endobj\n"); - - fz_dropobj(obj); -} - -int main(int argc, char **argv) -{ - fz_error *error; - char *filename; - pdf_xref *xref; - int c; - - while ((c = getopt(argc, argv, "drxopu:")) != -1) - { - switch (c) - { - case 'd': - dodecode ++; - break; - case 'x': - doprintxref ++; - break; - case 'u': - password = optarg; - break; - default: - usage(); - } - } - - if (argc - optind == 0) - usage(); - - filename = argv[optind++]; - - error = pdf_newxref(&xref); - if (error) - fz_abort(error); - - error = pdf_loadxref(xref, filename); - if (error) - { - fz_warn("trying to repair"); - error = pdf_repairxref(xref, filename); - if (error) - fz_abort(error); - } - - error = pdf_decryptxref(xref); - if (error) - fz_abort(error); - - if (xref->crypt) - { - error = pdf_setpassword(xref->crypt, password); - if (error) fz_abort(error); - } - - if (optind == argc) - { - printf("trailer\n"); - fz_debugobj(xref->trailer); - printf("\n"); - } - - for ( ; optind < argc; optind++) - { - printobject(xref, atoi(argv[optind]), 0); - printf("\n"); - } - - if (doprintxref) - pdf_debugxref(xref); - - pdf_closexref(xref); - - return 0; -} - diff --git a/test/pdffunction.c b/test/pdffunction.c deleted file mode 100644 index 20dabf1e..00000000 --- a/test/pdffunction.c +++ /dev/null @@ -1,263 +0,0 @@ -#include <fitz.h> -#include <mupdf.h> - -static char *password = ""; -static int dodecode = 0; -static int dorepair = 0; -static int doprintxref = 0; - -typedef struct psobj_s psobj; - -struct pdf_function_s -{ - unsigned short type; /* 0=sample 2=exponential 3=stitching 4=postscript */ - int m; /* number of input values */ - int n; /* number of output values */ - float *domain; /* even index : min value, odd index : max value */ - float *range; /* even index : min value, odd index : max value */ - union - { - struct { - unsigned short bps; - unsigned short order; - int *size; /* the num of samples in each input dimension */ - float *encode; - float *decode; - int *samples; - } sa; - struct { - float n; - float *c0; - float *c1; - } e; - struct { - int k; - pdf_function **funcs; - float *bounds; - float *encode; - } st; - struct { - psobj *code; - int cap; - } p; - }u; -}; - -void usage() -{ - fprintf(stderr, "usage: pdffunction [-drxs] [-u password] file.pdf oid [input ...]\n"); - exit(1); -} - -static int safecol = 0; - -void printsafe(unsigned char *buf, int n) -{ - int i; - for (i = 0; i < n; i++) { - if (buf[i] == '\r' || buf[i] == '\n') { - printf("\n"); - safecol = 0; - } - else if (buf[i] < 32 || buf[i] > 126) { - printf("."); - safecol ++; - } - else { - printf("%c", buf[i]); - safecol ++; - } - if (safecol == 79) { - printf("\n"); - safecol = 0; - } - } -} - -void decodestream(pdf_xref *xref, int oid, int gid) -{ - fz_error *error; - unsigned char buf[512]; - - safecol = 0; - - error = pdf_openstream(xref, oid, gid); - if (error) fz_abort(error); - - while (1) - { - int n = fz_read(xref->stream, buf, sizeof buf); - if (n == 0) - break; - if (n < 0) - fz_abort(fz_ferror(xref->stream)); - printsafe(buf, n); - } - - pdf_closestream(xref); -} - -void copystream(pdf_xref *xref, int oid, int gid) -{ - fz_error *error; - unsigned char buf[512]; - - safecol = 0; - - error = pdf_openrawstream(xref, oid, gid); - if (error) fz_abort(error); - - while (1) - { - int n = fz_read(xref->stream, buf, sizeof buf); - if (n == 0) - break; - if (n < 0) - fz_abort(fz_ferror(xref->stream)); - printsafe(buf, n); - } - - pdf_closestream(xref); -} - -void printobject(pdf_xref *xref, int oid, int gid) -{ - fz_error *error; - fz_obj *obj; - - error = pdf_loadobject(&obj, xref, oid, gid); - if (error) fz_abort(error); - - printf("%d %d obj\n", oid, gid); - fz_debugobj(obj); - printf("\n"); - - if (xref->table[oid].stmofs) { - printf("stream\n"); - if (dodecode) - decodestream(xref, oid, gid); - else - copystream(xref, oid, gid); - printf("endstream\n"); - } - - printf("endobj\n"); - - fz_dropobj(obj); -} - -int main(int argc, char **argv) -{ - fz_error *error; - char *filename; - pdf_xref *xref; - int c; - - while ((c = getopt(argc, argv, "drxopu:")) != -1) - { - switch (c) - { - case 'd': - dodecode ++; - break; - case 'r': - dorepair ++; - break; - case 'x': - doprintxref ++; - break; - case 'u': - password = optarg; - break; - default: - usage(); - } - } - - if (argc - optind == 0) - usage(); - - filename = argv[optind++]; - - if (dorepair) - error = pdf_repairpdf(&xref, filename); - else - error = pdf_openpdf(&xref, filename); - if (error) - fz_abort(error); - - error = pdf_decryptpdf(xref); - if (error) - fz_abort(error); - - if (xref->crypt) - { - error = pdf_setpassword(xref->crypt, password); - if (error) fz_abort(error); - } - - if (optind == argc) - { - printf("trailer\n"); - fz_debugobj(xref->trailer); - printf("\n"); - } - else - { - int oid = atoi(argv[optind++]); - if(optind == argc) - printobject(xref, oid, 0); - else - { - float *in = nil, *out = nil; - pdf_function *func; - fz_obj *funcobj; - int i; - - /* type 0 and type 4 funcs must be indirect to read stream */ - error = fz_newindirect(&funcobj,oid,0); - if(error) fz_abort(error); - error = pdf_loadfunction(&func,xref,funcobj); - if(error) fz_abort(error); - in = fz_malloc(func->m * sizeof(float)); - out = fz_malloc(func->n * sizeof(float)); - - if(!in || !out) - fz_abort(fz_outofmem); - - for(i = 0; optind < argc; optind++, i++) - { - if(i >= func->m) - fz_abort(fz_throw("too much input values")); - - in[i] = atof(argv[optind]); - } - - if(i < func->m) - fz_abort(fz_throw("too few input values")); - - error = pdf_evalfunction(func, in, func->m, out, func->n); - if(error) fz_abort(error); - - for(i = 0; i < func->n; ++i) - fprintf(stderr, "output[%d] : %f\n", i, out[i]); - - fz_dropobj(funcobj); - pdf_dropfunction(func); - } - } - - for ( ; optind < argc; optind++) - { - printobject(xref, atoi(argv[optind]), 0); - printf("\n"); - } - - if (doprintxref) - pdf_debugpdf(xref); - - pdf_closepdf(xref); - - return 0; -} - diff --git a/test/pdfmerge.c b/test/pdfmerge.c deleted file mode 100644 index 3bb7c868..00000000 --- a/test/pdfmerge.c +++ /dev/null @@ -1,230 +0,0 @@ -#include <fitz.h> -#include <mupdf.h> - -void usage() -{ - fprintf(stderr, - "usage: pdfmerge [options] file.pdf pages ...\n" - " -o -\toutput file name (default out.pdf)\n" - " -d -\tset user password for decryption\n" - " -e\tencrypt outfile\n" - " -U -\tset user password for encryption\n" - " -O -\tset owner password\n" - " -P -\tset permissions\n" - " -N -\tkey length in bits: 40 <= n <= 128\n" - ); - exit(1); -} - -int main(int argc, char **argv) -{ - fz_error *error; - char *savename = "out.pdf"; - pdf_pagetree *srcpages; - fz_obj *srcrefs; - fz_obj *newsrcrefs; - fz_obj *dstrefs; - pdf_xref *dst; - pdf_xref *src; - int rootoid; - int rootgid; - int pagesoid; - int pagesgid; - fz_obj *pagesref; - fz_obj *obj; - int i, k; - int c; - - pdf_crypt *encrypt = 0; - int doencrypt = 0; - - char *userpw = ""; - char *ownerpw = ""; - int perms = -4; /* 0xfffffffc */ - int keylen = 40; - char *password = ""; - - while ((c = getopt(argc, argv, "reo:U:O:P:N:")) != -1) - { - switch (c) - { - case 'e': ++ doencrypt; break; - case 'o': savename = optarg; break; - case 'U': userpw = optarg; break; - case 'O': ownerpw = optarg; break; - case 'P': perms = atoi(optarg); break; - case 'N': keylen = atoi(optarg); break; - case 'd': password = optarg; break; - default: usage(); - } - } - - if (argc - optind < 1) - usage(); - - /* - * Create new blank xref table - */ - - error = pdf_newpdf(&dst); - if (error) - fz_abort(error); - - error = fz_newarray(&dstrefs, 100); - if (error) - fz_abort(error); - - /* - * Copy pages saving refs in dstrefs - */ - - for (i = optind; i < argc; i++) - { - error = pdf_openpdf(&src, argv[i]); - if (error) - fz_abort(error); - - error = pdf_decryptpdf(src); - if (error) - fz_abort(error); - - if (src->crypt) - { - error = pdf_setpassword(src->crypt, password); - if (error) - fz_abort(error); - } - - error = pdf_loadpagetree(&srcpages, src); - if (error) - fz_abort(error); - - error = fz_newarray(&srcrefs, 100); - if (error) - fz_abort(error); - - for (k = 0; k < srcpages->count; k++) - { - fz_dictdels(srcpages->pobj[k], "Parent"); - fz_dictdels(srcpages->pobj[k], "B"); - fz_dictdels(srcpages->pobj[k], "PieceInfo"); - fz_dictdels(srcpages->pobj[k], "Metadata"); - fz_dictdels(srcpages->pobj[k], "Annots"); - fz_dictdels(srcpages->pobj[k], "Tabs"); - - pdf_updateobject(src, - fz_tonum(srcpages->pref[k]), - fz_togen(srcpages->pref[k]), - srcpages->pobj[k]); - error = fz_arraypush(srcrefs, srcpages->pref[k]); - if (error) - fz_abort(error); - } - - error = pdf_transplant(dst, src, &newsrcrefs, srcrefs); - if (error) - fz_abort(error); - - for (k = 0; k < fz_arraylen(newsrcrefs); k++) - { - error = fz_arraypush(dstrefs, fz_arrayget(newsrcrefs, k)); - if (error) - fz_abort(error); - } - - fz_dropobj(srcrefs); - fz_dropobj(newsrcrefs); - - pdf_droppagetree(srcpages); - - pdf_closepdf(src); - } - - /* - * Create and relink Pages object - */ - - error = pdf_allocobject(dst, &pagesoid, &pagesgid); - if (error) - fz_abort(error); - - error = fz_packobj(&obj, - "<</Type/Pages/Count %i/Kids %o>>", - fz_arraylen(dstrefs), - dstrefs); - if (error) - fz_abort(error); - - pdf_updateobject(dst, pagesoid, pagesgid, obj); - - fz_dropobj(obj); - - error = fz_newindirect(&pagesref, pagesoid, pagesgid); - if (error) - fz_abort(error); - - for (i = 0; i < fz_arraylen(dstrefs); i++) - { - int oid = fz_tonum(fz_arrayget(dstrefs, i)); - int gid = fz_togen(fz_arrayget(dstrefs, i)); - error = pdf_loadobject(&obj, dst, oid, gid); - if (error) - fz_abort(error); - error = fz_dictputs(obj, "Parent", pagesref); - if (error) - fz_abort(error); - pdf_updateobject(dst, oid, gid, obj); - fz_dropobj(obj); - } - - fz_dropobj(pagesref); - - /* - * Create Catalog and trailer - */ - - error = pdf_allocobject(dst, &rootoid, &rootgid); - if (error) - fz_abort(error); - - error = fz_packobj(&obj, - "<</Type/Catalog/Pages %r>>", - pagesoid, pagesgid); - if (error) - fz_abort(error); - - pdf_updateobject(dst, rootoid, rootgid, obj); - - fz_dropobj(obj); - - error = fz_packobj(&dst->trailer, "<</Root %r>>", rootoid, rootgid); - if (error) - fz_abort(error); - - /* - * Write out the new PDF - */ - - if (doencrypt) - { - fz_obj *id = fz_dictgets(dst->trailer, "ID"); - if (!id) - fz_packobj(&id, "[(ABCDEFGHIJKLMNOP)(ABCDEFGHIJKLMNOP)]"); - else - fz_keepobj(id); - error = pdf_newencrypt(&encrypt, userpw, ownerpw, perms, keylen, id); - if (error) - fz_abort(error); - fz_dropobj(id); - } - - error = pdf_savepdf(dst, savename, encrypt); - if (error) - fz_abort(error); - - fz_dropobj(dstrefs); - pdf_closepdf(dst); - - return 0; -} - diff --git a/test/pdfrip.c b/test/pdfrip.c deleted file mode 100644 index b6d2b9d8..00000000 --- a/test/pdfrip.c +++ /dev/null @@ -1,182 +0,0 @@ -#include <fitz.h> -#include <mupdf.h> - -int showtree = 0; -float zoom = 1.0; -char *namefmt = "out-%02d.ppm"; -fz_renderer *gc; -int nbands = 1; - -void usage() -{ - fprintf(stderr, "usage: pdfrip [-d] [-b bands] [-o out-%%02d.ppm] [-p password] [-z zoom] file.pdf pages...\n"); - exit(1); -} - -/* - * Draw page - */ - -void showpage(pdf_xref *xref, fz_obj *pageobj, int pagenum) -{ - fz_error *error; - pdf_page *page; - char namebuf[256]; - fz_pixmap *pix; - fz_matrix ctm; - fz_irect bbox; - fz_irect band; - FILE *f; - int x, y; - int w, h; - int b; - - sprintf(namebuf, namefmt, pagenum); - - error = pdf_loadpage(&page, xref, pageobj); - if (error) - fz_abort(error); - - if (showtree) - { - fz_debugobj(pageobj); - printf("\n"); - - printf("page\n"); - printf(" mediabox [ %g %g %g %g ]\n", - page->mediabox.min.x, page->mediabox.min.y, - page->mediabox.max.x, page->mediabox.max.y); - printf(" rotate %d\n", page->rotate); - - printf(" resources\n"); - fz_debugobj(page->resources); - printf("\n"); - - printf("tree\n"); - fz_debugtree(page->tree); - printf("endtree\n"); - } - - ctm = fz_concat(fz_translate(0, -page->mediabox.max.y), - fz_scale(zoom, -zoom)); - - bbox = fz_roundrect(page->mediabox); - bbox.min.x = bbox.min.x * zoom; - bbox.min.y = bbox.min.y * zoom; - bbox.max.x = bbox.max.x * zoom; - bbox.max.y = bbox.max.y * zoom; - w = bbox.max.x - bbox.min.x; - h = bbox.max.y - bbox.min.y; - - f = fopen(namebuf, "wb"); - fprintf(f, "P6\n%d %d\n255\n", w, h); - - for (b = 0; b < nbands; b++) - { - printf("band %d / %d\n", b, nbands); - - band.min.x = bbox.min.x; - band.max.x = bbox.max.x; - band.min.y = bbox.min.y + (h * b) / nbands; - band.max.y = bbox.min.y + (h * (b + 1)) / nbands; - - error = fz_rendertree(&pix, gc, page->tree, ctm, band, 1); - if (error) - fz_abort(error); - - for (y = 0; y < pix->h; y++) - { - for (x = 0; x < pix->w; x++) - { - putc(pix->samples[y * pix->w * 4 + x * 4 + 1], f); - putc(pix->samples[y * pix->w * 4 + x * 4 + 2], f); - putc(pix->samples[y * pix->w * 4 + x * 4 + 3], f); - } - } - - fz_droppixmap(pix); - } - - fclose(f); - -} - -int main(int argc, char **argv) -{ - fz_error *error; - char *filename; - pdf_xref *xref; - pdf_pagetree *pages; - int c; - - char *password = ""; - - fz_cpudetect(); - fz_accelerate(); - - while ((c = getopt(argc, argv, "dz:p:o:b:")) != -1) - { - switch (c) - { - case 'p': password = optarg; break; - case 'z': zoom = atof(optarg); break; - case 'd': ++showtree; break; - case 'o': namefmt = optarg; break; - case 'b': nbands = atoi(optarg); break; - default: usage(); - } - } - - if (argc - optind == 0) - usage(); - - filename = argv[optind++]; - - error = pdf_newxref(&xref); - if (error) - fz_abort(error); - - error = pdf_loadxref(xref, filename); - if (error) - fz_abort(error); - - error = pdf_decryptxref(xref); - if (error) - fz_abort(error); - - if (xref->crypt) - { - error = pdf_setpassword(xref->crypt, password); - if (error) - fz_abort(error); - } - - error = pdf_loadpagetree(&pages, xref); - if (error) - fz_abort(error); - - if (optind == argc) - { - printf("number of pages: %d\n", pdf_getpagecount(pages)); - } - - error = fz_newrenderer(&gc, pdf_devicergb, 0, 1024 * 512); - if (error) - fz_abort(error); - - for ( ; optind < argc; optind++) - { - int page = atoi(argv[optind]); - if (page < 1 || page > pdf_getpagecount(pages)) - fprintf(stderr, "page out of bounds: %d\n", page); - printf("page %d\n", page); - showpage(xref, pdf_getpageobject(pages, page - 1), page); - } - - fz_droprenderer(gc); - - pdf_closexref(xref); - - return 0; -} - diff --git a/test/showcmap.c b/test/showcmap.c deleted file mode 100644 index 3e6e5e8e..00000000 --- a/test/showcmap.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <fitz.h> -#include <mupdf.h> - -int main(int argc, char **argv) -{ - fz_error *err; - fz_cmap *cmap; - fz_file *file; - - err = fz_openfile(&file, argv[1], FZ_READ); - if (err) - fz_abort(err); - - err = pdf_parsecmap(&cmap, file); - if (err) - fz_abort(err); - - fz_debugcmap(cmap); - - return 0; -} - diff --git a/test/w32pdf.c b/test/w32pdf.c deleted file mode 100644 index 33fb589c..00000000 --- a/test/w32pdf.c +++ /dev/null @@ -1,656 +0,0 @@ -#include <fitz.h> -#include <mupdf.h> - -#define WIN32_LEAN_AND_MEAN -#include <windows.h> - -static HWND hwnd; -static HDC hdc; -static BITMAPINFO *dibinf; -static TCHAR szAppName[] = TEXT("mupdf"); -static HCURSOR arrowcurs, handcurs, waitcurs; -static LRESULT CALLBACK winproc(HWND, UINT, WPARAM, LPARAM); - -static char *doctitle = "<untitled>"; -static float zoom = 1.0; -static int rotate = 0; -static int pageno = 1; -static int count = 0; - -static pdf_page *page = nil; -static fz_obj *pageobj = nil; - -static int hist[256]; -static int histlen = 0; - -/* for 123G commands */ -static unsigned char pagebuf[256]; -static int pagebufidx = 0; - -static pdf_xref *xref; -static pdf_pagetree *pages; -static pdf_outline *outline; -static fz_renderer *rast; -static fz_pixmap *image; - -void usage() -{ - fprintf(stderr, "usage: w32pdf [-b] [-pzr page/zoom/rotate] [-u password] file.pdf\n"); - exit(1); -} - -void winabort(const char *msg) -{ - MessageBoxA(NULL, msg, "Fatal error", MB_ICONERROR); - abort(); -} - -void winopen() -{ - WNDCLASS wc; - - /* Create and register window class */ - wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; - wc.lpfnWndProc = winproc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = 0; //hInstance; - wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); - wc.hCursor = NULL; //LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = NULL;//(HBRUSH) GetStockObject(BLACK_BRUSH); - wc.lpszMenuName = NULL; - wc.lpszClassName = szAppName; - assert(RegisterClass(&wc) && "Register window class"); - - /* Create cursors */ - arrowcurs = LoadCursor(NULL, IDC_ARROW); - handcurs = LoadCursor(NULL, IDC_HAND); - waitcurs = LoadCursor(NULL, IDC_WAIT); - - /* Init DIB info for buffer */ - dibinf = malloc(sizeof(BITMAPINFO) + 12); - assert(dibinf != NULL); - dibinf->bmiHeader.biSize = sizeof(dibinf->bmiHeader); - dibinf->bmiHeader.biPlanes = 1; - dibinf->bmiHeader.biBitCount = 24; - dibinf->bmiHeader.biCompression = BI_RGB; - dibinf->bmiHeader.biXPelsPerMeter = 2834; - dibinf->bmiHeader.biYPelsPerMeter = 2834; - dibinf->bmiHeader.biClrUsed = 0; - dibinf->bmiHeader.biClrImportant = 0; - dibinf->bmiHeader.biClrUsed = 0; - - /* Create window */ - hwnd = CreateWindow(szAppName, // window class name - NULL, // window caption - //WS_OVERLAPPEDWINDOW, // window style - WS_CAPTION|WS_THICKFRAME|WS_SYSMENU|WS_MINIMIZEBOX, - CW_USEDEFAULT, // initial x position - 5, // CW_USEDEFAULT, // initial y position - 300, // initial x size - 300, // initial y size - NULL, // parent window handle - NULL, // window menu handle - 0,//hInstance, // program instance handle - NULL); // creation parameters - - hdc = NULL; - - SetWindowTextA(hwnd, "MuPDF"); - - SetCursor(arrowcurs); -} - -void winblit() -{ - /* TODO: repack image in windows format */ - int stride = ((image->w * 3 + 3) / 4) * 4; - char *buf; - char *s; - char *p; - int y, x; - - buf = fz_malloc(image->h * stride); - if (!buf) - return; - - for (y = 0; y < image->h; y++) - { - p = buf + y * stride; - s = image->samples + y * image->w * 4; - for (x = 0; x < image->w; x++) - { - p[x * 3 + 0] = s[x * 4 + 3]; - p[x * 3 + 1] = s[x * 4 + 2]; - p[x * 3 + 2] = s[x * 4 + 1]; - } - } - - dibinf->bmiHeader.biWidth = image->w; - dibinf->bmiHeader.biHeight = -image->h; - dibinf->bmiHeader.biSizeImage = image->h * stride; - - assert(hdc != NULL); - SetDIBitsToDevice(hdc, - 0, /* destx */ - 0, /* desty */ - image->w, /* destw */ - image->h, /* desth */ - 0, /* srcx */ - 0, /* srcy */ - 0, /* startscan */ - image->h, /* numscans */ - buf, /* pBits */ - dibinf, /* pInfo */ - DIB_RGB_COLORS /* color use flag */ - ); - - fz_free(buf); -} - -void winresize(int w, int h) -{ - ShowWindow(hwnd, SW_SHOWDEFAULT); - w += GetSystemMetrics(SM_CXFRAME) * 2; - h += GetSystemMetrics(SM_CYFRAME) * 2; - h += GetSystemMetrics(SM_CYCAPTION); - SetWindowPos(hwnd, 0, 0, 0, w, h, SWP_NOZORDER | SWP_NOMOVE); -} - -void winrepaint(void) -{ - RECT wr = (RECT){0, 0, image->w, image->h}; - InvalidateRect(hwnd, &wr, 0); -} - -void dragndrop() -{ - SetCapture(hwnd); - ReleaseCapture(); -} - -static void showpage(void) -{ - fz_error *error; - fz_matrix ctm; - fz_rect bbox; - fz_obj *obj; - - assert(pageno > 0 && pageno <= pdf_getpagecount(pages)); - - SetCursor(waitcurs); - - if (image) - fz_droppixmap(image); - image = nil; - - obj = pdf_getpageobject(pages, pageno - 1); - if (obj == pageobj) - goto Lskipload; - pageobj = obj; - - if (page) - pdf_droppage(page); - - error = pdf_loadpage(&page, xref, pageobj); - if (error) - fz_abort(error); - -Lskipload: - - ctm = fz_identity(); - ctm = fz_concat(ctm, fz_translate(0, -page->mediabox.max.y)); - ctm = fz_concat(ctm, fz_scale(zoom, -zoom)); - ctm = fz_concat(ctm, fz_rotate(rotate + page->rotate)); - - bbox = fz_transformaabb(ctm, page->mediabox); - - error = fz_rendertree(&image, rast, page->tree, ctm, fz_roundrect(bbox), 1); - if (error) - fz_abort(error); - - SetCursor(arrowcurs); - { - char buf[512]; - sprintf(buf, "%s - %d/%d", doctitle, pageno, count); - SetWindowTextA(hwnd, buf); - } - - winresize(image->w, image->h); - winrepaint(); -} - -static void pdfopen(char *filename, char *password) -{ - fz_error *error; - fz_obj *obj; - - error = pdf_newxref(&xref); - if (error) - fz_abort(error); - - error = pdf_loadxref(xref, filename); - if (error) - { - fz_warn(error->msg); - printf("trying to repair...\n"); - error = pdf_repairxref(xref, filename); - if (error) - fz_abort(error); - } - - error = pdf_decryptxref(xref); - if (error) - fz_abort(error); - - if (xref->crypt) - { - error = pdf_setpassword(xref->crypt, password); - if (error) fz_abort(error); - } - - obj = fz_dictgets(xref->trailer, "Root"); - if (!obj) - fz_abort(fz_throw("syntaxerror: missing Root object")); - error = pdf_loadindirect(&xref->root, xref, obj); - if (error) fz_abort(error); - - obj = fz_dictgets(xref->trailer, "Info"); - if (obj) - { - error = pdf_loadindirect(&xref->info, xref, obj); - if (error) fz_abort(error); - } - - error = pdf_loadnametrees(xref); - if (error) fz_abort(error); - - error = pdf_loadoutline(&outline, xref); - if (error) fz_abort(error); - - doctitle = filename; - if (xref->info) - { - obj = fz_dictgets(xref->info, "Title"); - if (obj) - { - error = pdf_toutf8(&doctitle, obj); - if (error) fz_abort(error); - } - } - -// if (outline) -// pdf_debugoutline(outline, 0); - - error = pdf_loadpagetree(&pages, xref); - if (error) fz_abort(error); - - count = pdf_getpagecount(pages); - - error = fz_newrenderer(&rast, pdf_devicergb, 0, 1024 * 512); - if (error) fz_abort(error); - - image = nil; -} - -static void gotouri(fz_obj *uri) -{ - char cmd[2048]; - char buf[2048]; - - printf("goto uri: "); - fz_debugobj(uri); - printf("\n"); - - memcpy(buf, fz_tostrbuf(uri), fz_tostrlen(uri)); - buf[fz_tostrlen(uri)] = 0; - - if (getenv("BROWSER")) - sprintf(cmd, "$BROWSER %s &", buf); - else - sprintf(cmd, "start %s", buf); - system(cmd); -} - -static void gotopage(fz_obj *obj) -{ - int oid = fz_tonum(obj); - int gen = fz_togen(obj); - int i; - - printf("goto page: %d %d R\n", oid, gen); - - for (i = 0; i < count; i++) - { - if (fz_tonum(pages->pref[i]) == oid) - { - if (histlen + 1 == 256) - { - memmove(hist, hist + 1, sizeof(int) * 255); - histlen --; - } - hist[histlen++] = pageno; - pageno = i + 1; - showpage(); - return; - } - } -} - -static void handlekey(int c) -{ - int oldpage = pageno; - float oldzoom = zoom; - int oldrotate = rotate; - - if (c >= '0' && c <= '9') - pagebuf[pagebufidx++] = c; - else - if (c != 'g' && c != 'G') - pagebufidx = 0; - - switch (c) - { - case 'd': fz_debugglyphcache(rast->cache); break; - case 'a': rotate -= 5; break; - case 's': rotate += 5; break; -// case 'x': dumptext(); break; -// case 'o': drawlinks(); break; - - case '\b': - case 'b': - pageno--; - if (pageno < 1) - pageno = 1; - break; - case 'B': - pageno -= 10; - if (pageno < 1) - pageno = 1; - break; - case ' ': - case 'f': - pageno++; - if (pageno > count) - pageno = count; - break; - case 'F': - pageno += 10; - if (pageno > count) - pageno = count; - break; - case 'm': - if (histlen + 1 == 256) - { - memmove(hist, hist + 1, sizeof(int) * 255); - histlen --; - } - hist[histlen++] = pageno; - break; - case 't': - case 'T': - if (histlen > 0) - pageno = hist[--histlen]; - break; - case '-': - zoom -= 0.1; - if (zoom < 0.1) - zoom = 0.1; - break; - case '+': - zoom += 0.1; - if (zoom > 3.0) - zoom = 3.0; - break; - case '<': - rotate -= 90; - break; - case '>': - rotate += 90; - break; - case 'q': - exit(0); - case 'g': - case 'G': - if (pagebufidx > 0) - { - pagebuf[pagebufidx] = '\0'; - pageno = atoi(pagebuf); - pagebufidx = 0; - if (pageno < 1) - pageno = 1; - if (pageno > count) - pageno = count; - } - else - { - if (c == 'G') - { - pageno = count; - } - } - break; - } - - if (pageno != oldpage || zoom != oldzoom || rotate != oldrotate) - showpage(); -} - -static void handlemouse(int x, int y, int btn) -{ - pdf_link *link; - fz_matrix ctm; - fz_point p; - - p.x = x + image->x; - p.y = y + image->y; - - ctm = fz_identity(); - ctm = fz_concat(ctm, fz_translate(0, -page->mediabox.max.y)); - ctm = fz_concat(ctm, fz_scale(zoom, -zoom)); - ctm = fz_concat(ctm, fz_rotate(rotate + page->rotate)); - ctm = fz_invertmatrix(ctm); - - p = fz_transformpoint(ctm, p); - - for (link = page->links; link; link = link->next) - { - if (p.x >= link->rect.min.x && p.x <= link->rect.max.x) - if (p.y >= link->rect.min.y && p.y <= link->rect.max.y) - break; - } - - if (link) - { - SetCursor(handcurs); - if (btn) - { - if (fz_isstring(link->dest)) - gotouri(link->dest); - if (fz_isindirect(link->dest)) - gotopage(link->dest); - } - } - else - { - SetCursor(arrowcurs); - } -} - -LRESULT CALLBACK -winproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - int x = (signed short) LOWORD(lParam); - int y = (signed short) HIWORD(lParam); - int key; - - switch (message) - { - case WM_CREATE: - //puts("WM_CREATE"); - return 0; - - case WM_DESTROY: - //puts("WM_DESTROY"); - PostQuitMessage(0); - return 0; - - case WM_CLOSE: - //puts("WM_CLOSE"); - PostQuitMessage(0); - return 0; - - case WM_KILLFOCUS: - //puts("WM_KILLFOCUS"); - return 0; - - case WM_SIZING: - //puts("WM_SIZING"); - return 0; - - /* Paint events are low priority and automagically catenated - * so we don't need to do any fancy waiting to defer repainting. - */ - case WM_PAINT: - { - //puts("WM_PAINT"); - PAINTSTRUCT ps; - hdc = BeginPaint(hwnd, &ps); - winblit(); - hdc = NULL; - EndPaint(hwnd, &ps); - return 0; - } - - /* Mouse events */ - - case WM_LBUTTONDOWN: - //puts("WM_LBUTTONDOWN"); - handlemouse(x, y, 1); - return 0; - case WM_RBUTTONDOWN: - //puts("WM_RBUTTONDOWN"); - handlemouse(x, y, 4); - return 0; - case WM_MBUTTONDOWN: - //puts("WM_MBUTTONDOWN"); - handlemouse(x, y, 2); - return 0; - - case WM_LBUTTONUP: - //puts("WM_LBUTTONUP"); - handlemouse(x, y, 0); - return 0; - case WM_RBUTTONUP: - //puts("WM_RBUTTONUP"); - handlemouse(x, y, 0); - return 0; - case WM_MBUTTONUP: - //puts("WM_RBUTTONUP"); - handlemouse(x, y, 0); - return 0; - - case WM_MOUSEMOVE: - //puts("WM_MOUSEMOVE"); - handlemouse(x, y, 0); - return 0; - - /* Mouse wheel */ - case WM_MOUSEWHEEL: - if ((signed short)HIWORD(wParam) > 0) { - // wheel-up - } - else { - // wheel-down - } - return 0; - - /* Keyboard events */ - - /* Only deal with key-down */ - case WM_KEYUP: - return 0; - case WM_SYSKEYUP: - return 0; - - case WM_SYSCHAR: - //printf("WM_SYSCHAR: %d '%c'\n", wParam, wParam); - return 0; - - case WM_SYSKEYDOWN: - //printf("WM_SYSKEYDOWN: %d '%c'\n", wParam, wParam); - return 0; - - case WM_KEYDOWN: - //printf("WM_KEYDOWN: %d '%c'\n", wParam, wParam); - return 0; - - /* unicode encoded chars, including escape, backspace etc... */ - case WM_CHAR: - //printf("WM_CHAR: %d '%c'\n", wParam, wParam); - key = wParam; - handlekey(key); - return 0; - } - - fflush(stdout); - - /* Pass on unhandled events to Windows */ - return DefWindowProc(hwnd, message, wParam, lParam); -} - -int main(int argc, char **argv) -{ - char *filename; - int c; - - int benchmark = 0; - char *password = ""; - - while ((c = getopt(argc, argv, "bz:r:p:u:")) != -1) - { - switch (c) - { - case 'b': ++benchmark; break; - case 'u': password = optarg; break; - case 'p': pageno = atoi(optarg); break; - case 'z': zoom = atof(optarg); break; - case 'r': rotate = atoi(optarg); break; - default: usage(); - } - } - - if (argc - optind == 0) - usage(); - - fz_cpudetect(); - fz_accelerate(); - - filename = argv[optind++]; - - winopen(); - pdfopen(filename, password); - showpage(); - - if (benchmark) - { - while (pageno < count) - { - pageno ++; - showpage(); - } - return 0; - } - - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - pdf_closexref(xref); - - return 0; -} - diff --git a/test/x11pdf.c b/test/x11pdf.c deleted file mode 100644 index e35f90a6..00000000 --- a/test/x11pdf.c +++ /dev/null @@ -1,590 +0,0 @@ -#include <fitz.h> -#include <mupdf.h> - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/Xatom.h> -#include <X11/Intrinsic.h> -#include <X11/cursorfont.h> -#include <X11/keysym.h> - -extern int ximage_init(Display *display, int screen, Visual *visual); -extern int ximage_get_depth(void); -extern Visual *ximage_get_visual(void); -extern Colormap ximage_get_colormap(void); -extern void ximage_blit(Drawable d, GC gc, int dstx, int dsty, - unsigned char *srcdata, - int srcx, int srcy, int srcw, int srch, int srcstride); - -static Display *xdpy; -static int xscr; -static Window xwin; -static GC xgc; -static XEvent xevt; -static int mapped = 0; -static Cursor xcarrow, xchand, xcwait; - -static char *doctitle = "<untitled>"; - -static float zoom = 1.0; -static int rotate = 0; -static int pageno = 1; -static int count = 0; - -static pdf_page *page = nil; -static fz_obj *pageobj = nil; - -static int hist[256]; -static int histlen = 0; - -/* for 123G commands */ -static unsigned char pagebuf[256]; -static int pagebufidx = 0; - -static pdf_xref *xref; -static pdf_pagetree *pages; -static pdf_outline *outline; -static fz_renderer *rast; -static fz_pixmap *image; - -void usage() -{ - fprintf(stderr, "usage: x11pdf [-b] [-pzr page/zoom/rotate] [-u password] file.pdf\n"); - fprintf(stderr, -"\n" - ); - exit(1); -} - -/* - * X11 magic - */ - -static void xopen(void) -{ - xdpy = XOpenDisplay(nil); - assert(xdpy != nil); - - xscr = DefaultScreen(xdpy); - - ximage_init(xdpy, xscr, DefaultVisual(xdpy, xscr)); - - xcarrow = XCreateFontCursor(xdpy, XC_left_ptr); - xchand = XCreateFontCursor(xdpy, XC_hand2); - xcwait = XCreateFontCursor(xdpy, XC_watch); - - xwin = XCreateWindow(xdpy, DefaultRootWindow(xdpy), - 10, 10, 200, 100, 1, - ximage_get_depth(), - InputOutput, - ximage_get_visual(), - 0, - nil); - - XSetWindowColormap(xdpy, xwin, ximage_get_colormap()); - XSelectInput(xdpy, xwin, - StructureNotifyMask | ExposureMask | KeyPressMask | - PointerMotionMask | ButtonPressMask); - - mapped = 0; - - xgc = XCreateGC(xdpy, xwin, 0, nil); -} - -static void xresize(void) -{ - XWindowChanges values; - int mask; - - mask = CWWidth | CWHeight; - values.width = image->w; - values.height = image->h; - XConfigureWindow(xdpy, xwin, mask, &values); - - if (!mapped) - { - XMapWindow(xdpy, xwin); - XFlush(xdpy); - - while (1) - { - XNextEvent(xdpy, &xevt); - if (xevt.type == MapNotify) - break; - } - - XSetForeground(xdpy, xgc, WhitePixel(xdpy, xscr)); - XFillRectangle(xdpy, xwin, xgc, 0, 0, image->w, image->h); - XFlush(xdpy); - - mapped = 1; - } -} - -static void xblit(void) -{ - ximage_blit(xwin, xgc, 0, 0, image->samples, 0, 0, - image->w, image->h, image->w * image->n); -} - -static void xtitle(char *s) -{ - XmbSetWMProperties(xdpy, xwin, s, s, 0, 0, 0, 0, 0); -} - -static void showpage(void) -{ - fz_error *error; - fz_matrix ctm; - fz_rect bbox; - fz_obj *obj; - char s[256]; - - assert(pageno > 0 && pageno <= pdf_getpagecount(pages)); - - XDefineCursor(xdpy, xwin, xcwait); - XFlush(xdpy); - - if (image) - fz_droppixmap(image); - image = nil; - - obj = pdf_getpageobject(pages, pageno - 1); - if (obj == pageobj) - goto Lskipload; - pageobj = obj; - - if (page) - pdf_droppage(page); - - sprintf(s, "Loading page %d", pageno); - XSetForeground(xdpy, xgc, BlackPixel(xdpy, xscr)); - XDrawString(xdpy, xwin, xgc, 10, 20, s, strlen(s)); - XFlush(xdpy); - - error = pdf_loadpage(&page, xref, pageobj); - if (error) - fz_abort(error); - -Lskipload: - - sprintf(s, "Rendering..."); - XSetForeground(xdpy, xgc, BlackPixel(xdpy, xscr)); - XDrawString(xdpy, xwin, xgc, 10, 30, s, strlen(s)); - XFlush(xdpy); - - ctm = fz_identity(); - ctm = fz_concat(ctm, fz_translate(0, -page->mediabox.max.y)); - ctm = fz_concat(ctm, fz_scale(zoom, -zoom)); - ctm = fz_concat(ctm, fz_rotate(rotate + page->rotate)); - - bbox = fz_transformaabb(ctm, page->mediabox); - - error = fz_rendertree(&image, rast, page->tree, ctm, fz_roundrect(bbox), 1); - if (error) - fz_abort(error); - - XDefineCursor(xdpy, xwin, xcarrow); - XFlush(xdpy); - - { - char buf[512]; - sprintf(buf, "%s - %d/%d", doctitle, pageno, count); - xtitle(buf); - } - - xresize(); - xblit(); -} - -static void pdfopen(char *filename, char *password) -{ - fz_error *error; - fz_obj *obj; - - error = pdf_newxref(&xref); - if (error) - fz_abort(error); - - error = pdf_loadxref(xref, filename); - if (error) - { - fz_warn(error->msg); - printf("trying to repair...\n"); - error = pdf_repairxref(xref, filename); - if (error) - fz_abort(error); - } - - error = pdf_decryptxref(xref); - if (error) - fz_abort(error); - - if (xref->crypt) - { - error = pdf_setpassword(xref->crypt, password); - if (error) fz_abort(error); - } - - obj = fz_dictgets(xref->trailer, "Root"); - if (!obj) - fz_abort(fz_throw("syntaxerror: missing Root object")); - error = pdf_loadindirect(&xref->root, xref, obj); - if (error) fz_abort(error); - - obj = fz_dictgets(xref->trailer, "Info"); - if (obj) - { - error = pdf_loadindirect(&xref->info, xref, obj); - if (error) fz_abort(error); - } - - error = pdf_loadnametrees(xref); - if (error) fz_abort(error); - - error = pdf_loadoutline(&outline, xref); - if (error) fz_abort(error); - - doctitle = filename; - if (xref->info) - { - obj = fz_dictgets(xref->info, "Title"); - if (obj) - { - error = pdf_toutf8(&doctitle, obj); - if (error) fz_abort(error); - } - } - - if (outline) - pdf_debugoutline(outline, 0); - - error = pdf_loadpagetree(&pages, xref); - if (error) fz_abort(error); - - count = pdf_getpagecount(pages); - - error = fz_newrenderer(&rast, pdf_devicergb, 0, 1024 * 512); - if (error) fz_abort(error); - - image = nil; -} - -static void dumptext() -{ - fz_error *error; - pdf_textline *line; - - printf("----"); - - error = pdf_loadtextfromtree(&line, page->tree); - if (error) - fz_abort(error); - - pdf_debugtextline(line); - - pdf_droptextline(line); -} - -static void gotouri(fz_obj *uri) -{ - char cmd[2048]; - char buf[2048]; - - printf("goto uri: "); - fz_debugobj(uri); - printf("\n"); - - memcpy(buf, fz_tostrbuf(uri), fz_tostrlen(uri)); - buf[fz_tostrlen(uri)] = 0; - - if (getenv("BROWSER")) - sprintf(cmd, "$BROWSER %s &", buf); - else -#ifdef WIN32 - sprintf(cmd, "start %s", buf); -#else - sprintf(cmd, "open %s", buf); -#endif - system(cmd); -} - -static void gotopage(fz_obj *obj) -{ - int oid = fz_tonum(obj); - int gen = fz_togen(obj); - int i; - - printf("goto page: %d %d R\n", oid, gen); - - for (i = 0; i < count; i++) - { - if (fz_tonum(pages->pref[i]) == oid) - { - if (histlen + 1 == 256) - { - memmove(hist, hist + 1, sizeof(int) * 255); - histlen --; - } - hist[histlen++] = pageno; - pageno = i + 1; - showpage(); - return; - } - } -} - -static void drawlinks(void) -{ - pdf_link *link; - fz_matrix ctm; - fz_point a, b, c, d; - fz_rect r; - - ctm = fz_identity(); - ctm = fz_concat(ctm, fz_translate(0, -page->mediabox.max.y)); - ctm = fz_concat(ctm, fz_scale(zoom, -zoom)); - ctm = fz_concat(ctm, fz_rotate(rotate + page->rotate)); - ctm = fz_concat(ctm, fz_translate(-image->x, -image->y)); - - for (link = page->links; link; link = link->next) - { - r = link->rect; - - a.x = r.min.x; a.y = r.min.y; - b.x = r.min.x; b.y = r.max.y; - c.x = r.max.x; c.y = r.max.y; - d.x = r.max.x; d.y = r.min.y; - - a = fz_transformpoint(ctm, a); - b = fz_transformpoint(ctm, b); - c = fz_transformpoint(ctm, c); - d = fz_transformpoint(ctm, d); - - XDrawLine(xdpy, xwin, xgc, a.x, a.y, b.x, b.y); - XDrawLine(xdpy, xwin, xgc, b.x, b.y, c.x, c.y); - XDrawLine(xdpy, xwin, xgc, c.x, c.y, d.x, d.y); - XDrawLine(xdpy, xwin, xgc, d.x, d.y, a.x, a.y); - } - - XFlush(xdpy); -} - -static void handlekey(int c) -{ - int oldpage = pageno; - float oldzoom = zoom; - int oldrotate = rotate; - - if (c >= '0' && c <= '9') - pagebuf[pagebufidx++] = c; - else - if (c != 'g' && c != 'G') - pagebufidx = 0; - - switch (c) - { - case 'd': fz_debugglyphcache(rast->cache); break; - case 'a': rotate -= 5; break; - case 's': rotate += 5; break; - case 'x': dumptext(); break; - case 'o': drawlinks(); break; - - case '\b': - case 'b': - pageno--; - if (pageno < 1) - pageno = 1; - break; - case 'B': - pageno -= 10; - if (pageno < 1) - pageno = 1; - break; - case ' ': - case 'f': - pageno++; - if (pageno > count) - pageno = count; - break; - case 'F': - pageno += 10; - if (pageno > count) - pageno = count; - break; - case 'm': - if (histlen + 1 == 256) - { - memmove(hist, hist + 1, sizeof(int) * 255); - histlen --; - } - hist[histlen++] = pageno; - break; - case 't': - case 'T': - if (histlen > 0) - pageno = hist[--histlen]; - break; - case '-': - zoom -= 0.1; - if (zoom < 0.1) - zoom = 0.1; - break; - case '+': - zoom += 0.1; - if (zoom > 3.0) - zoom = 3.0; - break; - case '<': - rotate -= 90; - break; - case '>': - rotate += 90; - break; - case 'q': - exit(0); - case 'g': - case 'G': - if (pagebufidx > 0) - { - pagebuf[pagebufidx] = '\0'; - pageno = atoi(pagebuf); - pagebufidx = 0; - if (pageno < 1) - pageno = 1; - if (pageno > count) - pageno = count; - } - else - { - if (c == 'G') - { - pageno = count; - } - } - break; - } - - if (pageno != oldpage || zoom != oldzoom || rotate != oldrotate) - showpage(); -} - -static void handlemouse(float x, int y, int btn) -{ - pdf_link *link; - fz_matrix ctm; - fz_point p; - - p.x = x + image->x; - p.y = y + image->y; - - ctm = fz_identity(); - ctm = fz_concat(ctm, fz_translate(0, -page->mediabox.max.y)); - ctm = fz_concat(ctm, fz_scale(zoom, -zoom)); - ctm = fz_concat(ctm, fz_rotate(rotate + page->rotate)); - ctm = fz_invertmatrix(ctm); - - p = fz_transformpoint(ctm, p); - - for (link = page->links; link; link = link->next) - { - if (p.x >= link->rect.min.x && p.x <= link->rect.max.x) - if (p.y >= link->rect.min.y && p.y <= link->rect.max.y) - break; - } - - if (link) - { - XDefineCursor(xdpy, xwin, xchand); - if (btn) - { - if (fz_isstring(link->dest)) - gotouri(link->dest); - if (fz_isindirect(link->dest)) - gotopage(link->dest); - } - } - else - { - XDefineCursor(xdpy, xwin, xcarrow); - } -} - -int main(int argc, char **argv) -{ - char *filename; - int c; - - int benchmark = 0; - char *password = ""; - - while ((c = getopt(argc, argv, "bz:r:p:u:")) != -1) - { - switch (c) - { - case 'b': ++benchmark; break; - case 'u': password = optarg; break; - case 'p': pageno = atoi(optarg); break; - case 'z': zoom = atof(optarg); break; - case 'r': rotate = atoi(optarg); break; - default: usage(); - } - } - - if (argc - optind == 0) - usage(); - - fz_cpudetect(); - fz_accelerate(); - - filename = argv[optind++]; - - xopen(); - pdfopen(filename, password); - showpage(); - - if (benchmark) - { - while (pageno < count) - { - pageno ++; - showpage(); - } - return 0; - } - - while (1) - { - int len; - unsigned char buf[128]; - KeySym keysym; - - XNextEvent(xdpy, &xevt); - switch (xevt.type) - { - case Expose: - if (xevt.xexpose.count == 0) - xblit(); - break; - - case KeyPress: - len = XLookupString(&xevt.xkey, buf, sizeof buf, &keysym, 0); - if (len) - handlekey(buf[0]); - break; - - case MotionNotify: - handlemouse(xevt.xbutton.x, xevt.xbutton.y, 0); - break; - - case ButtonPress: - handlemouse(xevt.xbutton.x, xevt.xbutton.y, 1); - break; - } - } - - pdf_closexref(xref); - - return 0; -} - diff --git a/test/ximage.c b/test/ximage.c deleted file mode 100644 index 9f7ec064..00000000 --- a/test/ximage.c +++ /dev/null @@ -1,666 +0,0 @@ -/* - * Blit ARGB images to X with X(Shm)Images - */ - -#include <fitz.h> - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <sys/ipc.h> -#include <sys/shm.h> -#include <X11/extensions/XShm.h> - -typedef void (*ximage_convert_func_t) - ( - const unsigned char *src, - int srcstride, - unsigned char *dst, - int dststride, - int w, - int h - ); - -#define POOLSIZE 4 -#define WIDTH 256 -#define HEIGHT 256 - -enum { - ARGB8888, - BGRA8888, - RGBA8888, - ABGR8888, - RGB888, - BGR888, - RGB565, - RGB565_BR, - RGB555, - RGB555_BR, - BGR233, - UNKNOWN -}; - -static char *modename[] = { - "ARGB8888", - "BGRA8888", - "RGBA8888", - "ABGR8888", - "RGB888", - "BGR888", - "RGB565", - "RGB565_BR", - "RGB555", - "RGB555_BR", - "BGR233", - "UNKNOWN" -}; - -extern ximage_convert_func_t ximage_convert_funcs[]; - -static struct -{ - Display *display; - int screen; - XVisualInfo visual; - Colormap colormap; - - int bitsperpixel; - int mode; - - XColor rgbcube[256]; - - ximage_convert_func_t convert_func; - - int useshm; - XImage *pool[POOLSIZE]; - /* MUST exist during the lifetime of the shared ximage according to the - xc/doc/hardcopy/Xext/mit-shm.PS.gz */ - XShmSegmentInfo shminfo[POOLSIZE]; - int lastused; -} info; - -static XImage * -createximage(Display *dpy, Visual *vis, XShmSegmentInfo *xsi, int depth, int w, int h) -{ - XImage *img; - Status status; - - if (!XShmQueryExtension(dpy)) goto fallback; - - img = XShmCreateImage(dpy, vis, depth, ZPixmap, nil, xsi, w, h); - if (!img) - { - fprintf(stderr, "warn: could not XShmCreateImage\n"); - goto fallback; - } - - xsi->shmid = shmget(IPC_PRIVATE, - img->bytes_per_line * img->height, - IPC_CREAT | 0777); - if (xsi->shmid < 0) - { - XDestroyImage(img); - fprintf(stderr, "warn: could not shmget\n"); - goto fallback; - } - - img->data = xsi->shmaddr = shmat(xsi->shmid, 0, 0); - if (img->data == (char*)-1) - { - XDestroyImage(img); - fprintf(stderr, "warn: could not shmat\n"); - goto fallback; - } - - xsi->readOnly = False; - status = XShmAttach(dpy, xsi); - if (!status) - { - shmdt(xsi->shmaddr); - XDestroyImage(img); - fprintf(stderr, "warn: could not XShmAttach\n"); - goto fallback; - } - - XSync(dpy, False); - - shmctl(xsi->shmid, IPC_RMID, 0); - - return img; - -fallback: - info.useshm = 0; - - img = XCreateImage(dpy, vis, depth, ZPixmap, 0, 0, w, h, 32, 0); - if (!img) - { - fprintf(stderr, "fail: could not XCreateImage"); - abort(); - } - - img->data = malloc(h * img->bytes_per_line); - if (!img->data) - { - fprintf(stderr, "fail: could not malloc"); - abort(); - } - - return img; -} - -static void -make_colormap(void) -{ - if (info.visual.class == PseudoColor && info.visual.depth == 8) - { - int i, r, g, b; - i = 0; - for (b = 0; b < 4; b++) { - for (g = 0; g < 8; g++) { - for (r = 0; r < 8; r++) { - info.rgbcube[i].pixel = i; - info.rgbcube[i].red = (r * 36) << 8; - info.rgbcube[i].green = (g * 36) << 8; - info.rgbcube[i].blue = (b * 85) << 8; - info.rgbcube[i].flags = - DoRed | DoGreen | DoBlue; - i++; - } - } - } - info.colormap = XCreateColormap(info.display, - RootWindow(info.display, info.screen), - info.visual.visual, - AllocAll); - XStoreColors(info.display, info.colormap, info.rgbcube, 256); - return; - } - else if (info.visual.class == TrueColor) - { - info.colormap = 0; - return; - } - fprintf(stderr, "Cannot handle visual class %d with depth: %d\n", - info.visual.class, info.visual.depth); - return; -} - -static void -select_mode(void) -{ - - int byteorder; - int byterev; - unsigned long rm, gm, bm; - unsigned long rs, gs, bs; - - byteorder = ImageByteOrder(info.display); -#if BYTE_ORDER == BIG_ENDIAN - byterev = byteorder != MSBFirst; -#else - byterev = byteorder != LSBFirst; -#endif - - rm = info.visual.red_mask; - gm = info.visual.green_mask; - bm = info.visual.blue_mask; - - rs = ffs(rm) - 1; - gs = ffs(gm) - 1; - bs = ffs(bm) - 1; - - printf("ximage: mode %d/%d %08lx %08lx %08lx (%ld,%ld,%ld) %s%s\n", - info.visual.depth, - info.bitsperpixel, - rm, gm, bm, rs, gs, bs, - byteorder == MSBFirst ? "msb" : "lsb", - byterev ? " <swap>":""); - - info.mode = UNKNOWN; - if (info.bitsperpixel == 8) { - /* Either PseudoColor with BGR233 colormap, or TrueColor */ - info.mode = BGR233; - } - else if (info.bitsperpixel == 16) { - if (rm == 0xF800 && gm == 0x07E0 && bm == 0x001F) - info.mode = !byterev ? RGB565 : RGB565_BR; - if (rm == 0x7C00 && gm == 0x03E0 && bm == 0x001F) - info.mode = !byterev ? RGB555 : RGB555_BR; - } - else if (info.bitsperpixel == 24) { - if (rs == 0 && gs == 8 && bs == 16) - info.mode = byteorder == MSBFirst ? RGB888 : BGR888; - if (rs == 16 && gs == 8 && bs == 0) - info.mode = byteorder == MSBFirst ? BGR888 : RGB888; - } - else if (info.bitsperpixel == 32) { - if (rs == 0 && gs == 8 && bs == 16) - info.mode = byteorder == MSBFirst ? ABGR8888 : RGBA8888; - if (rs == 8 && gs == 16 && bs == 24) - info.mode = byteorder == MSBFirst ? BGRA8888 : ARGB8888; - if (rs == 16 && gs == 8 && bs == 0) - info.mode = byteorder == MSBFirst ? ARGB8888 : BGRA8888; - if (rs == 24 && gs == 16 && bs == 8) - info.mode = byteorder == MSBFirst ? RGBA8888 : ABGR8888; - } - - printf("ximage: ARGB8888 to %s\n", modename[info.mode]); - - /* select conversion function */ - info.convert_func = ximage_convert_funcs[info.mode]; -} - -static int -create_pool(void) -{ - int i; - - info.lastused = 0; - - for (i = 0; i < POOLSIZE; i++) { - info.pool[i] = nil; - } - - for (i = 0; i < POOLSIZE; i++) { - info.pool[i] = createximage(info.display, - info.visual.visual, &info.shminfo[i], info.visual.depth, - WIDTH, HEIGHT); - if (info.pool[i] == nil) { - return 0; - } - } - - return 1; -} - -static XImage * -next_pool_image(void) -{ - if (info.lastused + 1 >= POOLSIZE) { - if (info.useshm) - XSync(info.display, False); - else - XFlush(info.display); - info.lastused = 0; - } - return info.pool[info.lastused ++]; -} - -int -ximage_init(Display *display, int screen, Visual *visual) -{ - XVisualInfo template; - XVisualInfo *visuals; - int nvisuals; - XPixmapFormatValues *formats; - int nformats; - int ok; - int i; - - info.display = display; - info.screen = screen; - info.colormap = 0; - - /* Get XVisualInfo for this visual */ - template.visualid = XVisualIDFromVisual(visual); - visuals = XGetVisualInfo(display, VisualIDMask, &template, &nvisuals); - if (nvisuals != 1) { - fprintf(stderr, "Visual not found!\n"); - XFree(visuals); - return 0; - } - memcpy(&info.visual, visuals, sizeof (XVisualInfo)); - XFree(visuals); - - /* Get appropriate PixmapFormat for this visual */ - formats = XListPixmapFormats(info.display, &nformats); - for (i = 0; i < nformats; i++) { - if (formats[i].depth == info.visual.depth) { - info.bitsperpixel = formats[i].bits_per_pixel; - break; - } - } - XFree(formats); - if (i == nformats) { - fprintf(stderr, "PixmapFormat not found!\n"); - return 0; - } - - /* extract mode */ - select_mode(); - - /* prepare colormap */ - make_colormap(); - - /* prepare pool of XImages */ - info.useshm = 1; - ok = create_pool(); - if (!ok) - return 0; - - printf("ximage: %sPutImage\n", info.useshm ? "XShm" : "X"); - - return 1; -} - -int -ximage_get_depth(void) -{ - return info.visual.depth; -} - -Visual * -ximage_get_visual(void) -{ - return info.visual.visual; -} - -Colormap -ximage_get_colormap(void) -{ - return info.colormap; -} - -void -ximage_blit(Drawable d, GC gc, - int dstx, int dsty, - unsigned char *srcdata, - int srcx, int srcy, - int srcw, int srch, - int srcstride) -{ - XImage *image; - int ax, ay; - int w, h; - unsigned char *srcptr; - - for (ay = 0; ay < srch; ay += HEIGHT) - { - h = MIN(srch - ay, HEIGHT); - for (ax = 0; ax < srcw; ax += WIDTH) - { - w = MIN(srcw - ax, WIDTH); - - image = next_pool_image(); - - srcptr = srcdata + - (ay + srcy) * srcstride + - (ax + srcx) * 4; - - info.convert_func(srcptr, srcstride, - image->data, - image->bytes_per_line, w, h); - - if (info.useshm) - { - XShmPutImage(info.display, d, gc, image, - 0, 0, dstx + ax, dsty + ay, - w, h, False); - } - else - { - XPutImage(info.display, d, gc, image, - 0, 0, - dstx + ax, - dsty + ay, - w, h); - } - } - } -} - -/* - * - */ -#ifndef _C99 -#ifdef __GNUC__ -#define restrict __restrict__ -#else -#define restrict -#endif -#endif - -#define PARAMS \ - const unsigned char * restrict src, \ - int srcstride, \ - unsigned char * restrict dst, \ - int dststride, \ - int w, \ - int h - -/* - * Convert byte:ARGB8888 to various formats - */ - -static void -ximage_convert_argb8888(PARAMS) -{ - int x, y; - unsigned *s = (unsigned *)src; - unsigned *d = (unsigned *)dst; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - d[x] = s[x]; - } - d += dststride>>2; - s += srcstride>>2; - } -} - -static void -ximage_convert_bgra8888(PARAMS) -{ - int x, y; - unsigned *s = (unsigned *)src; - unsigned *d = (unsigned *)dst; - unsigned val; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - val = s[x]; - d[x] = - (val >> 24) | - ((val >> 8) & 0xff00) | - (val << 24) | - ((val << 8) & 0xff0000); -/* - d[x] = - (((val >> 24) & 0xff) << 0) | - (((val >> 16) & 0xff) << 8) | - (((val >> 8) & 0xff) << 16) | - (((val >> 0) & 0xff) << 24); -*/ - } - d += dststride>>2; - s += srcstride>>2; - } -} - -/* following have yet to recieve some MMX love ;-) */ - -static void -ximage_convert_abgr8888(PARAMS) -{ - int x, y; - unsigned *s = (unsigned *)src; - unsigned *d = (unsigned *)dst; - unsigned val; - - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - val = s[x]; -#if 1 /* FZ_MSB */ - d[x] = (val & 0xff00ff00) | - (((val << 16) | (val >> 16)) & 0x00ff00ff); -#else /* FZ_LSB */ - d[x] = (val << 24) | ((val >> 8) & 0xff); -#endif - } - d += dststride>>2; - s += srcstride>>2; - } -} - -static void -ximage_convert_rgba8888(PARAMS) -{ - int x, y; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - dst[x * 4 + 0] = src[x * 4 + 1]; - dst[x * 4 + 1] = src[x * 4 + 2]; - dst[x * 4 + 2] = src[x * 4 + 3]; - dst[x * 4 + 3] = src[x * 4 + 0]; - } - dst += dststride; - src += srcstride; - } -} - -static void -ximage_convert_bgr888(PARAMS) -{ - int x, y; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - dst[3*x + 0] = src[4*x + 3]; - dst[3*x + 1] = src[4*x + 2]; - dst[3*x + 2] = src[4*x + 1]; - } - src += srcstride; - dst += dststride; - } -} - -static void -ximage_convert_rgb888(PARAMS) -{ - int x, y; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - dst[3*x + 0] = src[4*x + 1]; - dst[3*x + 1] = src[4*x + 2]; - dst[3*x + 2] = src[4*x + 3]; - } - src += srcstride; - dst += dststride; - } -} - -static void -ximage_convert_rgb565(PARAMS) -{ - unsigned char r, g, b; - int x, y; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - r = src[4*x + 1]; - g = src[4*x + 2]; - b = src[4*x + 3]; - ((unsigned short *)dst)[x] = - ((r & 0xF8) << 8) | - ((g & 0xFC) << 3) | - (b >> 3); - } - src += srcstride; - dst += dststride; - } -} - -static void -ximage_convert_rgb565_br(PARAMS) -{ - unsigned char r, g, b; - int x, y; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - r = src[4*x + 1]; - g = src[4*x + 2]; - b = src[4*x + 3]; - /* final word is: - g4 g3 g2 b7 b6 b5 b4 b3 r7 r6 r5 r4 r3 g7 g6 g5 - */ - ((unsigned short *)dst)[x] = - (r & 0xF8) | - ((g & 0xE0) >> 5) | - ((g & 0x1C) << 11) | - ((b & 0xF8) << 5); - } - src += srcstride; - dst += dststride; - } -} - -static void -ximage_convert_rgb555(PARAMS) -{ - unsigned char r, g, b; - int x, y; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - r = src[4*x + 1]; - g = src[4*x + 2]; - b = src[4*x + 3]; - ((unsigned short *)dst)[x] = - ((r & 0xF8) << 7) | - ((g & 0xF8) << 2) | - (b >> 3); - } - src += srcstride; - dst += dststride; - } -} - -static void -ximage_convert_rgb555_br(PARAMS) -{ - unsigned char r, g, b; - int x, y; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - r = src[4*x + 1]; - g = src[4*x + 2]; - b = src[4*x + 3]; - /* final word is: - g5 g4 g3 b7 b6 b5 b4 b3 0 r7 r6 r5 r4 r3 g7 g6 - */ - ((unsigned short *)dst)[x] = - ((r & 0xF8) >> 1) | - ((g & 0xC0) >> 6) | - ((g & 0x38) << 10) | - ((b & 0xF8) << 5); - } - src += srcstride; - dst += dststride; - } -} - -static void -ximage_convert_bgr233(PARAMS) -{ - unsigned char r, g, b; - int x,y; - for(y = 0; y < h; y++) { - for(x = 0; x < w; x++) { - r = src[4*x + 1]; - g = src[4*x + 2]; - b = src[4*x + 3]; - /* format: b7 b6 g7 g6 g5 r7 r6 r5 */ - dst[x] = (b&0xC0) | ((g>>2)&0x38) | ((r>>5)&0x7); - } - src += srcstride; - dst += dststride; - } -} - -ximage_convert_func_t ximage_convert_funcs[] = { - ximage_convert_argb8888, - ximage_convert_bgra8888, - ximage_convert_rgba8888, - ximage_convert_abgr8888, - ximage_convert_rgb888, - ximage_convert_bgr888, - ximage_convert_rgb565, - ximage_convert_rgb565_br, - ximage_convert_rgb555, - ximage_convert_rgb555_br, - ximage_convert_bgr233, -}; |