From db48370192298549db57a19205104644755240a2 Mon Sep 17 00:00:00 2001 From: malc Date: Mon, 7 Jun 2010 03:01:49 +0400 Subject: [PATCH] temp --- build.ml | 2 +- link.c | 402 +++++++++++++++++++++++++++++++-------------------------------- main.ml | 81 ++++++++----- tbs | 8 +- 4 files changed, 254 insertions(+), 239 deletions(-) diff --git a/build.ml b/build.ml index e7c5721..a6b5140 100644 --- a/build.ml +++ b/build.ml @@ -65,7 +65,7 @@ let bso name objs = let so = name ^ ".so" in let mupdf_libs = " -L" ^ mupdflibpath ^ - " -lmupdf -lfitz -lfonts -lfitzdraw -lcmaps -ljpeg -lz -lfreetype" + " -lmupdf -lopenjpeg -ljbig2dec -ljpeg -lz -lfreetype" in let o = List.map (fun s -> s ^ ".o") objs in ocaml' diff --git a/link.c b/link.c index b4597ae..161d6ff 100644 --- a/link.c +++ b/link.c @@ -26,6 +26,47 @@ #include +static long pagesize; + +struct page { + int pagenum; + fz_pixmap *pixmap; + GLuint texid; + struct page2 *page2; + struct page *prev; +}; + +struct page2 { + fz_bbox bbox; + fz_matrix ctm; + fz_pixmap pixmap; + int pagenum; +}; + +struct { + int sock; + int texid; + pthread_t thread; + pthread_cond_t cond; + pthread_mutex_t mutex; + struct page *pages; + struct page2 *pages2; + int page; + int pagecount; + pdf_xref *xref; + /* pdf_page *drawpage; */ + fz_glyphcache *cache; + size_t mapsize; + void *map; + int w, h; + Display *dpy; + GLXContext ctx; + GLXDrawable drawable; +} state = { + .cond = PTHREAD_COND_INITIALIZER, + .mutex = PTHREAD_MUTEX_INITIALIZER +}; + static double now (void) { struct timeval tv; @@ -80,77 +121,35 @@ static void __attribute__ ((format (printf, 2, 3))) writedata (fd, buf, len); } -static const char *parsepointer (const char *s, int len, void **ptr) +static void closexref (void); + +static void createmmap (struct page *page) { - int i; - intptr_t val = 0; + int fd, ret; + size_t size; - if (len < 3) { - return s; - } + size = page->pixmap->w * page->pixmap->h * 4; - for (i = 0; i < len; ++i) { - char c = s[i]; - if (c >= '0' && c <= '9') { - val = (val << 4) | (c - '0'); - } - else if (c >= 'a' && c <= 'f') { - val = (val << 4) | ((c - 'a') + 10); - } - else { - fprintf (stderr, "parsepointer(%.*s) i=%d len=%d invalid char=%c\n", - len, s, i, len, c); - break; - } + fd = open ("pdfmap", O_CREAT|O_TRUNC|O_RDWR); + if (fd == -1) { + err (1, "open"); + } + ret = unlink ("pdfmap"); + if (ret) { + err (1, "unlink"); + } + size = (size + pagesize - 1) & ~(pagesize - 1); + ret = ftruncate (fd, size); + if (ret) { + err (1, "ftruncate"); + } + page->pixmap->samples = mmap (NULL, size, PROT_READ|PROT_WRITE, + MAP_PRIVATE, fd, 0); + if (page->pixmap->samples == MAP_FAILED) { + err (1, "mmap"); } - *(intptr_t *) ptr = val; - return s + i; } -struct page { - int pagenum; - pdf_page *drawpage; - fz_pixmap *pixmap; - GLuint texid; - struct page2 *page2; - struct page *prev; -}; - -struct page2 { - fz_irect bbox; - fz_matrix ctm; - fz_pixmap pixmap; - int pagenum; -}; - -struct { - int sock; - int texid; - pthread_t thread; - pthread_cond_t cond; - pthread_mutex_t mutex; - struct page *pages; - struct page2 *pages2; - int page; - int pagecount; - pdf_xref *xref; - fz_renderer *drawgc; - pdf_page *drawpage; - size_t mapsize; - void *map; - int w, h; - Display *dpy; - GLXContext ctx; - GLXDrawable drawable; -} state = { - .cond = PTHREAD_COND_INITIALIZER, - .mutex = PTHREAD_MUTEX_INITIALIZER -}; - -static char *basename1; - -static void closexref (void); - static void lock (void) { int ret; @@ -198,44 +197,28 @@ static void die(fz_error error) exit(1); } -static void drawloadpage(int pagenum) -{ - fz_error error; - fz_obj *pageobj; - long start; - long end; - long elapsed; - - pageobj = pdf_getpageobject(state.xref, pagenum); - error = pdf_loadpage(&state.drawpage, state.xref, pageobj); - if (error) - die(error); -} - -static void openxref(char *filename, char *password, int dieonbadpass) +void openxref(char *filename, char *password, int dieonbadpass) { - fz_error error; + fz_stream *file; int okay; + int fd; + char *basename; - basename1 = strrchr(filename, '/'); - if (!basename1) - basename1 = filename; + basename = strrchr(filename, '/'); + if (!basename) + basename = filename; else - basename1++; + basename++; - state.xref = pdf_newxref(); - error = pdf_loadxref(state.xref, filename); - if (error) - { - fz_catch(error, "trying to repair"); - error = pdf_repairxref(state.xref, filename); - if (error) - die(error); - } + fd = open(filename, O_BINARY | O_RDONLY, 0666); + if (fd < 0) + die(fz_throw("cannot open file '%s'", filename)); - error = pdf_decryptxref(state.xref); - if (error) - die(error); + file = fz_openfile(fd); + state.xref = pdf_openxref(file); + if (!state.xref) + die(fz_throw("cannot open PDF file '%s'", basename)); + fz_dropstream(file); if (pdf_needspassword(state.xref)) { @@ -246,14 +229,6 @@ static void openxref(char *filename, char *password, int dieonbadpass) die(fz_throw("invalid password")); } - state.xref->root = fz_dictgets(state.xref->trailer, "Root"); - if (state.xref->root) - fz_keepobj(state.xref->root); - - state.xref->info = fz_dictgets(state.xref->trailer, "Info"); - if (state.xref->info) - fz_keepobj(state.xref->info); - state.pagecount = pdf_getpagecount(state.xref); printd (state.sock, "C %d", state.pagecount); } @@ -273,8 +248,6 @@ static void closexref(void) pdf_closexref(state.xref); state.xref = nil; } - - basename1 = nil; } static int readlen (int fd) @@ -290,23 +263,18 @@ static int readlen (int fd) return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; } -static void drawfreepage(void) +static void freepage (struct page *page) { - pdf_droppage(state.drawpage); - state.drawpage = nil; + struct page *p; - flushxref(); - - /* Flush resources between pages. - * TODO: should check memory usage before deciding to do this. - */ - if (state.xref && state.xref->store) - { - /* pdf_debugstore(xref->store); */ - pdf_agestoreditems(state.xref->store); - pdf_evictageditems(state.xref->store); - fflush(stderr); + fz_droppixmap (page->pixmap); + for (p = state.pages; p; p = p->prev) { + if (p->prev == page) { + p->prev = page->prev; + break; + } } + free (page); } static void *render (int pagenum, int pindex) @@ -317,7 +285,12 @@ static void *render (int pagenum, int pindex) float zoom; struct page *page; struct page2 *page2; + fz_device *idev, *tdev, *mdev; + fz_displaylist *list; + pdf_page *drawpage; + printf ("render %d %d\n", pagenum, pindex); + pdf_flushxref (state.xref, 0); page = calloc (sizeof (*page), 1); if (!page) { err (1, "malloc page %d\n", pagenum); @@ -331,67 +304,60 @@ static void *render (int pagenum, int pindex) if (!pageobj) die (fz_throw ("cannot retrieve info from page %d", pagenum)); - error = pdf_loadpage(&page->drawpage, state.xref, pageobj); + error = pdf_loadpage(&drawpage, state.xref, pageobj); if (error) die(error); - error = fz_newpixmapwithrect (&page->pixmap, page2->bbox, 1); + page->pixmap = fz_newpixmapwithrect (pdf_devicergb, page2->bbox); if (error) die (error); - - error = fz_rendertree (&page->pixmap, state.drawgc, page->drawpage->tree, - page2->ctm, page2->bbox, 1); +#if 0 + fz_free (page->pixmap->samples); + createmmap (page); +#endif + fz_clearpixmap(page->pixmap, 0xFF); + + list = fz_newdisplaylist (); + if (!list) + die (fz_throw ("fz_newdisplaylist failed")); + + mdev = fz_newlistdevice(list); + error = pdf_runcontentstream(mdev, fz_identity(), state.xref, + drawpage->resources, + drawpage->contents); if (error) die (error); + fz_freedevice(mdev); + + idev = fz_newdrawdevice (state.cache, page->pixmap); + if (!idev) + die (fz_throw ("fz_newdrawdevice failed")); + + fz_executedisplaylist(list, idev, page2->ctm); + fz_freedevice(idev); + fz_freedisplaylist(list); + /* fz_debugpixmap (page->pixmap, "haha"); */ - pdf_droppage (page->drawpage); + pdf_droppage (drawpage); page->page2 = page2; page->pagenum = pagenum; return page; } -static void createmmap (void) -{ - int fd, ret; - long pagesize; - - pagesize = sysconf (_SC_PAGESIZE); - if (pagesize == -1) { - err (1, "sysconf"); - } - fd = open ("pdfmap", O_CREAT|O_TRUNC|O_RDWR); - if (fd == -1) { - err (1, "open"); - } - ret = unlink ("pdfmap"); - if (ret) { - err (1, "unlink"); - } - state.mapsize = (state.mapsize + pagesize - 1) & ~(pagesize - 1); - ret = ftruncate (fd, state.mapsize); - if (ret) { - err (1, "ftruncate"); - } - state.map = mmap (NULL, state.mapsize, PROT_READ|PROT_WRITE, - MAP_PRIVATE, fd, 0); - if (state.map == MAP_FAILED) { - err (1, "mmap"); - } -} - static void layout1 (void) { int pagenum; double a, b; int prevrotate; fz_rect prevbox; - int i, pindex; + int i, pindex, h; asize_t size; int64 mapsize; struct page2 *p; size = 0; + h = 0; pindex = 0; mapsize = 0; a = now (); @@ -403,7 +369,7 @@ static void layout1 (void) fz_rect box; fz_rect box2; fz_matrix ctm; - fz_irect bbox; + fz_bbox bbox; fz_error error; fz_obj *pageobj; @@ -411,11 +377,13 @@ static void layout1 (void) if (!pageobj) die (fz_throw ("cannot retrieve info from page %d", pagenum)); - obj = fz_dictgets (pageobj, "MediaBox"); - if (!fz_isarray (obj)) - die (fz_throw ("cannot find page bounds %d (%d R)", - fz_tonum (obj), fz_togen (obj))); - + obj = fz_dictgets (pageobj, "CropBox"); + if (!fz_isarray(obj)) { + obj = fz_dictgets (pageobj, "MediaBox"); + if (!fz_isarray (obj)) + die (fz_throw ("cannot find page bounds %d (%d R)", + fz_tonum (obj), fz_togen (obj))); + } box = pdf_torect (obj); obj = fz_dictgets (pageobj, "Rotate"); @@ -426,8 +394,10 @@ static void layout1 (void) if (pagenum != 1 && (prevrotate == rotate - && !memcmp (&prevbox, &box, sizeof (box)))) + && !memcmp (&prevbox, &box, sizeof (box)))) { + h += p->pixmap.h; continue; + } memcpy (&prevbox, &box, sizeof (box)); prevrotate = rotate; @@ -440,7 +410,7 @@ static void layout1 (void) ctm = fz_identity (); ctm = fz_concat (ctm, fz_translate (0, -box.y1)); ctm = fz_concat (ctm, fz_rotate (rotate)); - box2 = fz_transformaabb (ctm, box); + box2 = fz_transformrect (ctm, box); w = box2.x1 - box2.x0; zoom = state.w / w; @@ -448,7 +418,7 @@ static void layout1 (void) ctm = fz_concat (ctm, fz_translate (0, -box.y1)); ctm = fz_concat (ctm, fz_scale (zoom, -zoom)); ctm = fz_concat (ctm, fz_rotate (rotate)); - bbox = fz_roundrect (fz_transformaabb (ctm, box)); + bbox = fz_roundrect (fz_transformrect (ctm, box)); size += sizeof (*state.pages2); state.pages2 = caml_stat_resize (state.pages2, size); @@ -463,6 +433,7 @@ static void layout1 (void) p->pixmap.w = bbox.x1 - bbox.x0; p->pixmap.h = bbox.y1 - bbox.y0; p->pixmap.n = 4; + h += p->pixmap.h; } for (i = pindex - 1; i >= 0; --i) { @@ -475,6 +446,7 @@ static void layout1 (void) b = now (); printf ("layout1 took %f sec\n", b - a); printd (state.sock, "C %d", state.pagecount); + printd (state.sock, "m %d", h); } static void *mainloop (void *unused) @@ -503,6 +475,12 @@ static void *mainloop (void *unused) openxref (filename, NULL, 1); } + else if (!strncmp ("free", p, 4)) { + void *ptr; + + ret = sscanf(p + 4, " %p", &ptr); + freepage (ptr); + } else if (!strncmp ("layout", p, 6)) { int y; @@ -519,15 +497,19 @@ static void *mainloop (void *unused) if (ret != 2) { errx (1, "malformed geometry `%.*s' ret=%d", len, p, ret); } - state.w = w; state.h = h; - for (page = state.pages; page; page = page->prev) { - page->texid = 0; + if (w != state.w) { + state.w = w; + for (page = state.pages; page; page = page->prev) { + page->texid = 0; + } } layout1 (); } else if (!strncmp ("render", p, 6)) { int pagenum, pindex, w, h, ret; + struct page *page; + unsigned char *pix; ret = sscanf (p + 6, " %d %d %d %d", &pagenum, &pindex, &w, &h); @@ -535,11 +517,12 @@ static void *mainloop (void *unused) errx (1, "bad render line `%.*s' ret=%d", len, p, ret); } - printd (state.sock, "r %d %d %d %llx\n", + page = render (pagenum, pindex); + printd (state.sock, "r %d %d %d %p\n", pagenum, state.w, state.h, - (unsigned long long) (intptr_t) render (pagenum, pindex)); + page); } else { errx (1, "unknown command %.*s", len, p); @@ -551,6 +534,7 @@ static void *mainloop (void *unused) static void upload (struct page *page, const char *cap) { int w, h, subimage = 0; + double start, end; w = page->page2->bbox.x1 - page->page2->bbox.x0; @@ -558,10 +542,13 @@ static void upload (struct page *page, const char *cap) glPixelStorei(GL_UNPACK_ROW_LENGTH, w); if (page->texid) { + GLboolean v = 0; + + glAreTexturesResident (1, &page->texid, &v); + printf ("resident %d %d\n", page->pagenum, v); glBindTexture (GL_TEXTURE_RECTANGLE_ARB, page->texid); } else { - double start, end; struct page *p; int texid = (state.texid++ % 10) + 1; @@ -597,18 +584,21 @@ static void upload (struct page *page, const char *cap) page->pixmap->samples ); else - glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, - 0, - GL_RGBA8, - w, - h, - 0, -/* GL_BGRA_EXT, */ -/* GL_UNSIGNED_INT_8_8_8_8_REV, */ - GL_ABGR_EXT, - GL_UNSIGNED_BYTE, /* INT_8_8_8_8, */ - page->pixmap->samples - ); + glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, + 0, + GL_RGBA8, + w, + h, + 0, +#ifndef _ARCH_PPC + GL_BGRA_EXT, + GL_UNSIGNED_INT_8_8_8_8, +#else + GL_ABGR_EXT, + GL_UNSIGNED_BYTE, /* INT_8_8_8_8, */ +#endif + page->pixmap->samples + ); end = now (); printf ("%s(%s) %d took %f sec\n", cap, @@ -619,19 +609,16 @@ static void upload (struct page *page, const char *cap) CAMLprim value ml_preload (value ptr_v) { + int ret; + void *ptr; CAMLparam1 (ptr_v); - struct page *page; char *s = String_val (ptr_v); - const char *r; - void *ptr; - r = parsepointer (s, caml_string_length (ptr_v), &ptr); - if (r == s || *r != 0) { - errx (1, "cannot parse pointer `%s r=%p s=%p [0]=%d'", - s, r, s, r[0]); + ret = sscanf (s, "%p", &ptr); + if (ret != 1) { + errx (1, "cannot parse pointer `%s'", s); } - page = ptr; - upload (page, "preload"); + upload (ptr, "preload"); CAMLreturn (Val_unit); } @@ -644,14 +631,14 @@ CAMLprim value ml_draw (value dispy_v, value w_v, value h_v, int h = Int_val (h_v); int py = Int_val (py_v); char *s = String_val (ptr_v); + int ret; const char *r; void *ptr; struct page *page; - r = parsepointer (s, caml_string_length (ptr_v), &ptr); - if (r == s || *r != 0) { - errx (1, "cannot parse pointer `%s r=%p s=%p [0]=%d'", - s, r, s, r[0]); + ret = sscanf (s, "%p", &ptr); + if (ret != 1) { + errx (1, "cannot parse pointer `%s'", s); } page = ptr; @@ -668,7 +655,9 @@ CAMLprim value ml_draw (value dispy_v, value w_v, value h_v, upload (page, "upload"); glEnable (GL_TEXTURE_RECTANGLE_ARB); +#ifdef _ARCH_PPC glEnable (GL_FRAGMENT_SHADER_ATI); +#endif glBegin (GL_QUADS); { glTexCoord2i (0, py); @@ -685,9 +674,9 @@ CAMLprim value ml_draw (value dispy_v, value w_v, value h_v, } glEnd (); glDisable (GL_TEXTURE_RECTANGLE_ARB); +#ifdef _ARCH_PPC glDisable (GL_FRAGMENT_SHADER_ATI); - glFlush (); - glFinish (); +#endif CAMLreturn (Val_unit); } @@ -706,6 +695,7 @@ static void initgl (void) die (fz_throw ("glXGetCurrentDrawable")); } +#ifdef _ARCH_PPC glBindFragmentShaderATI (1); glBeginFragmentShaderATI (); { @@ -724,20 +714,24 @@ static void initgl (void) ); } glEndFragmentShaderATI (); +#endif } -CAMLprim value ml_init (value sock_v, value texid_v) +CAMLprim value ml_init (value sock_v) { int ret; fz_error error; - CAMLparam2 (sock_v, texid_v); + CAMLparam1 (sock_v); + + pagesize = sysconf (_SC_PAGESIZE); + if (pagesize == -1) { + err (1, "sysconf"); + } state.sock = Int_val (sock_v); initgl (); - error = fz_newrenderer (&state.drawgc, pdf_devicergb, 0, 1024 * 512); - if (error) - die (error); + state.cache = fz_newglyphcache (); ret = pthread_create (&state.thread, NULL, mainloop, NULL); if (ret) { diff --git a/main.ml b/main.ml index 8d9ee13..12fe7f8 100644 --- a/main.ml +++ b/main.ml @@ -1,5 +1,5 @@ open Format;; -external init : Unix.file_descr -> GlTex.texture_id -> unit = "ml_init";; +external init : Unix.file_descr -> unit = "ml_init";; external draw : int -> int -> int -> int -> string -> unit = "ml_draw";; external preload : string -> unit = "ml_preload";; (* external layout : int -> unit = "ml_layout";; *) @@ -10,13 +10,13 @@ type ('a, 'b, 'c) g = ; mutable w : int ; mutable h : int ; mutable y : int - ; mutable s : float ; mutable maxy : int - ; mutable texs : GlTex.texture_id array ; mutable layout : (int * int * int * int * int * int * int) list - ; pixcache : ((int * int * int), (string * bool)) Hashtbl.t + ; pixcache : ((int * int * int), string) Hashtbl.t ; mutable pages : 'a list ; mutable pagecount : int + ; lru : string array + ; mutable lruidx : int } ;; @@ -26,13 +26,13 @@ let state = ; w = 0 ; h = 0 ; y = 0 - ; s = 1.0 - ; texs = [||] ; layout = [] ; maxy = max_int ; pixcache = Hashtbl.create 10 ; pages = [] ; pagecount = 0 + ; lru = Array.create 12 "" + ; lruidx = 0 } ;; @@ -125,7 +125,7 @@ let layout y sh = in let accu = f 0 ~-1 (0,0,0) y 0 0 state.pages [] in (* log ""; *) - accu + List.rev accu ;; let reshape ~w ~h = @@ -164,7 +164,22 @@ let act cmd = Scanf.sscanf cmd "r %d %d %d %s" (fun n w h p -> (n, w, h, p)) in - Hashtbl.add state.pixcache (n, w, h) (p, false); + Hashtbl.replace state.pixcache (n, w, h) p; + let idx = state.lruidx mod (Array.length state.lru) in + let s = state.lru.(idx) in + if String.length s != 0 + then begin + log "free %s" s; + wcmd "free" [`s s]; + let l = Hashtbl.fold (fun k s' a -> + if s = s' then k :: a else a) state.pixcache [] + in + List.iter (fun k -> + let n,w,h = k in + Hashtbl.remove state.pixcache k) l; + end; + state.lru.(idx) <- p; + state.lruidx <- state.lruidx + 1; Glut.postRedisplay (); | 'm' -> @@ -173,8 +188,8 @@ let act cmd = | 'u' -> let n = Scanf.sscanf cmd "u %d" (fun n -> n) in - let (s, _) = Hashtbl.find state.pixcache (n, state.w, state.h) in - Hashtbl.replace state.pixcache (n, state.w, state.h) (s, true) + let s = Hashtbl.find state.pixcache (n, state.w, state.h) in + Hashtbl.replace state.pixcache (n, state.w, state.h) s | 'l' -> let (n, w, h) as pagelayout = @@ -192,16 +207,17 @@ let preload ((pageno, pindex, pagewidth, pageheight, screeny, pageyoffset, screenheight) as page) = let key = (pageno + 1, state.w, state.h) in begin try - let pixmap, texready = Hashtbl.find state.pixcache key in + let pixmap = Hashtbl.find state.pixcache key in if String.length pixmap = 0 then () else ( - preload pixmap + (* preload pixmap *) ); with Not_found -> - Hashtbl.add state.pixcache key ("", false); + log "preload render %d" pageno; + Hashtbl.add state.pixcache key ""; wcmd "render" [`i (pageno + 1) ;`i pindex ;`i pagewidth @@ -214,9 +230,9 @@ let idle () = begin match r with | [] -> - begin + if false then begin let h = state.h in - let pages = layout state.y (state.h * 5) in + let pages = layout (state.y + state.h) h in List.iter preload pages; end @@ -240,7 +256,7 @@ let keyboard ~key ~x ~y = begin match List.rev state.layout with | [] -> () | (_, _, _, h, _, pyo, sh) :: _ -> - log"%d %d" h pyo; + log "%d %d" h pyo; clamp (h-pyo); let pages = layout state.y state.h in state.layout <- pages; @@ -299,7 +315,7 @@ let colors = let drawplaceholder (pageno, pindex, pagewidth, pageheight, screeny, pageyoffset, screenheight) = - GlDraw.color (0.7, 0.7, 0.7); + GlDraw.color (0.0, 0.0, 0.0); GlDraw.begins `quads; GlDraw.vertex2 (0.0, float screeny); GlDraw.vertex2 (float pagewidth, float screeny); @@ -308,29 +324,30 @@ let drawplaceholder (pageno, pindex, pagewidth, pageheight, GlDraw.ends (); ;; +let now () = Unix.gettimeofday ();; + let drawpage i ((pageno, pindex, pagewidth, pageheight, screeny, pageyoffset, screenheight) as page) = let key = (pageno + 1, state.w, state.h) in begin try - let pixmap, texready = Hashtbl.find state.pixcache key in + let pixmap = Hashtbl.find state.pixcache key in if - (* true || *) String.length pixmap = 0 then drawplaceholder page else ( GlDraw.color (1.0, 1.0, 1.0); - if texready || true - then ( - draw screeny pagewidth screenheight pageyoffset pixmap; - ) - else ( - drawplaceholder page; - wcmd "upload" [`i pageno; `s pixmap]; - ); + let a = now () in + draw screeny pagewidth screenheight pageyoffset pixmap; + let b = now () in + let d = b-.a in + if d > 0.000405 + then + log "draw %f sec" d + ; ); with Not_found -> - Hashtbl.add state.pixcache key ("", false); + Hashtbl.add state.pixcache key ""; drawplaceholder page; wcmd "render" [`i (pageno + 1) ;`i pindex @@ -342,9 +359,10 @@ let drawpage i let display () = GlClear.color (0.5, 0.5, 0.5) ~alpha:0.0; - (* GlClear.clear [`color]; *) + GlClear.clear [`color]; GlDraw.color (0.0, 0.0, 0.0); - ignore (List.fold_left drawpage 0 (List.rev state.layout)); + ignore (List.fold_left drawpage 0 (state.layout)); + Gl.finish (); Glut.swapBuffers (); ;; @@ -362,8 +380,7 @@ let () = let _ = Glut.createWindow "lpdf (press 'h' to get help)" in let csock, ssock = Unix.socketpair Unix.PF_UNIX Unix.SOCK_STREAM 0 in - state.texs <- GlTex.gen_textures 1; - init ssock state.texs.(0); + init ssock; state.w <- w; state.h <- h; state.csock <- csock; diff --git a/tbs b/tbs index 86cbb4f..e9ba038 100644 --- a/tbs +++ b/tbs @@ -23,10 +23,14 @@ if ! md5sum --status -c $d; then fi mupdf=/home/malc/x/bld/mupdf +mupdf=/home/malc/x/rcs/darcs/mupdf/mupdf/ cc=gcc ccopt="-Wall -Werror -I$mupdf -Wno-unused-function -Wno-unused" -targets="lpdf test testgl" +targets="lpdf" #test testgl + +lpath=$mupdf/build/linux-ppc-release/ +lpath=/home/malc/x/rcs/darcs/mupdf/mupdf/build/release ./b -O src:$h -r -O ccopt:"$ccopt" -O cc:"$cc" \ --O mupdflibpath:"$mupdf/build/linux-ppc-release/" \ +-O "mupdflibpath:$lpath" \ $* $targets -- 2.11.4.GIT