From c82921e9657af56fe05c9cf46fbb64dfdf0ae0fd Mon Sep 17 00:00:00 2001 From: malc Date: Thu, 28 Oct 2010 02:19:47 +0400 Subject: [PATCH] Change the way outlines/bookmarks are stored --- link.c | 13 +++++++++---- main.ml | 48 ++++++++++++++++++++++-------------------------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/link.c b/link.c index 855f94a..72e32d7 100644 --- a/link.c +++ b/link.c @@ -166,6 +166,7 @@ struct { } *texowners; int rotate; + int needoutline; #ifdef _WIN32 HANDLE thread; @@ -598,8 +599,8 @@ static void recurse_outline (pdf_outline *outline, int level) while (outline) { int i; fz_obj *obj; - int top = 0; int pageno = -1; + int top = 0, h = 0; if (!outline->link) goto next; @@ -632,16 +633,16 @@ static void recurse_outline (pdf_outline *outline, int level) p.y = fz_toint (fz_arrayget (obj, 3)); p = fz_transformpoint (pagedim->ctm, p); top = p.y; + h = pagedim->bbox.y1 - pagedim->bbox.y0; } } else { pageno = pdf_findpageobject (state.xref, outline->link->dest) - 1; - top = 0; } lprintf ("%*c%s %d\n", level, ' ', outline->title, pageno); - printd (state.sock, "o %d %d %d %s", - level, pageno, top, outline->title); + printd (state.sock, "o %d %d %d %d %s", + level, pageno, top, h, outline->title); next: if (outline->child) { recurse_outline (outline->child, level + 1); @@ -654,6 +655,9 @@ static void process_outline (void) { pdf_outline *outline; + if (!state.needoutline) return; + + state.needoutline = 0; outline = pdf_loadoutline (state.xref); if (outline) { recurse_outline (outline, 0); @@ -898,6 +902,7 @@ mainloop (void *unused) printd (state.sock, "t %s", pdf_toutf8 (obj)); } } + state.needoutline = 1; } else if (!strncmp ("free", p, 4)) { void *ptr; diff --git a/main.ml b/main.ml index 6f38a50..986d9ae 100644 --- a/main.ml +++ b/main.ml @@ -99,7 +99,7 @@ type conf = } ;; -type outline = string * int * int * int;; +type outline = string * int * int * float;; type outlines = | Oarray of outline array | Olist of outline list @@ -282,23 +282,25 @@ let calcheight () = fh; ;; -let getpagey pageno = +let getpageyh pageno = let rec f pn ph y l = match l with | (n, _, h) :: rest -> if n >= pageno then - y + (pageno - pn) * ph + y + (pageno - pn) * ph, h else let y = y + (n - pn) * ph in f n h y rest | [] -> - y + (pageno - pn) * ph + y + (pageno - pn) * ph, ph in f 0 0 0 state.pages; ;; +let getpagey pageno = fst (getpageyh pageno);; + let layout y sh = let rec f pageno pdimno prev vy py dy l cacheleft accu = if pageno = state.pagecount || cacheleft = 0 @@ -446,6 +448,12 @@ let getnav () = ;; let gotopage n top = + let y, h = getpageyh n in + addnav (); + gotoy (y + (truncate (top *. float h))); +;; + +let gotopage1 n top = let y = getpagey n in addnav (); gotoy (y + top); @@ -466,11 +474,6 @@ let scalecolor c = let reshape ~w ~h = let ratio = float w /. float state.w in - let fixbookmark (s, l, pageno, pagey) = - let pagey = truncate (float pagey *. ratio) in - (s, l, pageno, pagey) - in - state.bookmarks <- List.map fixbookmark state.bookmarks; state.w <- w; state.h <- h; GlDraw.viewport 0 0 w h; @@ -535,7 +538,6 @@ let act cmd = match cmd.[0] with | 'c' -> state.pages <- []; - state.outlines <- Olist [] | 'D' -> state.rects <- state.rects1; @@ -635,11 +637,11 @@ let act cmd = state.pages <- pagelayout :: state.pages | 'o' -> - let (l, n, t, pos) = - Scanf.sscanf cmd "o %d %d %d %n" (fun l n t pos -> l, n, t, pos) + let (l, n, t, h, pos) = + Scanf.sscanf cmd "o %d %d %d %d %n" (fun l n t h pos -> l, n, t, h, pos) in let s = String.sub cmd pos (String.length cmd - pos) in - let outline = (s, l, n, t) in + let outline = (s, l, n, float t /. float h) in let outlines = match state.outlines with | Olist outlines -> Olist (outline :: outlines) @@ -870,7 +872,7 @@ let quickbookmark ?title () = | Some title -> title in state.bookmarks <- - (title, 0, l.pageno, l.pagey) :: state.bookmarks + (title, 0, l.pageno, float l.pagey /. float l.pageh) :: state.bookmarks ;; let doreshape w h = @@ -1050,7 +1052,9 @@ let viewkeyboard ~key ~x ~y = let ondone s = match state.layout with | l :: _ -> - state.bookmarks <- (s, 0, l.pageno, l.pagey) :: state.bookmarks + state.bookmarks <- + (s, 0, l.pageno, float l.pagey /. float l.pageh) + :: state.bookmarks | _ -> () in enttext (Some ('~', "", None, textentry, ondone)) @@ -1631,7 +1635,7 @@ let mouse ~button ~bstate ~x ~y = | Ulinkgoto (pageno, top) -> if pageno >= 0 then - gotopage pageno top + gotopage1 pageno top | Ulinkuri s -> print_endline s @@ -1736,11 +1740,7 @@ let () = | None -> state.w, state.h | Some wh -> wh in - let bookmarks = List.map (fun (t, l, n, y) -> - let y = float y *. float state.w in - (t, l, n, truncate y)) state.bookmarks - in - Hashtbl.replace pstate state.path (bookmarks, w, h); + Hashtbl.replace pstate state.path (state.bookmarks, w, h); let oc = open_out_bin statepath in output_value oc pstate with exn -> @@ -1752,13 +1752,9 @@ let () = let setstate () = try let statebookmarks, statew, stateh = Hashtbl.find pstate state.path in - let bookmarks = List.map (fun (t, l, n, y) -> - let y = float y /. float statew in - (t, l, n, truncate y)) statebookmarks - in state.w <- statew; state.h <- stateh; - state.bookmarks <- bookmarks; + state.bookmarks <- statebookmarks; with Not_found -> () | exn -> prerr_endline ("Error setting state " ^ Printexc.to_string exn) -- 2.11.4.GIT