Removal or commenting of unused code
This commit is contained in:
parent
e305db72f5
commit
24c8b63808
|
@ -23,12 +23,6 @@ let charcodes_of_utf8 font s =
|
||||||
in
|
in
|
||||||
implode (map char_of_int charcodes)
|
implode (map char_of_int charcodes)
|
||||||
|
|
||||||
let unicode_codepoint_of_pdfcode encoding_table glyphlist_table p =
|
|
||||||
try
|
|
||||||
hd (Hashtbl.find glyphlist_table (Hashtbl.find encoding_table p))
|
|
||||||
with
|
|
||||||
Not_found -> 0
|
|
||||||
|
|
||||||
(* Get the width of some text in the given font *)
|
(* Get the width of some text in the given font *)
|
||||||
let width_of_text font text =
|
let width_of_text font text =
|
||||||
match font with
|
match font with
|
||||||
|
@ -121,33 +115,6 @@ let extract_num header s =
|
||||||
| [Pdfgenlex.LexReal f] -> Pdf.Real f
|
| [Pdfgenlex.LexReal f] -> Pdf.Real f
|
||||||
| _ -> raise (Failure ("extract_num: " ^ s))
|
| _ -> raise (Failure ("extract_num: " ^ s))
|
||||||
|
|
||||||
let extract_fontbbox header s =
|
|
||||||
let num = function
|
|
||||||
Pdfgenlex.LexInt i -> Pdf.Integer i
|
|
||||||
| Pdfgenlex.LexReal f -> Pdf.Real f
|
|
||||||
| _ -> raise (Failure "extract_fontbbox")
|
|
||||||
in
|
|
||||||
match Pdfgenlex.lex_string (Hashtbl.find header s) with
|
|
||||||
[a; b; c; d] -> [num a; num b; num c; num d]
|
|
||||||
| _ -> raise (Failure "extract_fontbbox")
|
|
||||||
|
|
||||||
let remove_slash s =
|
|
||||||
match explode s with
|
|
||||||
'/'::x -> implode x
|
|
||||||
| _ -> raise (Failure "remove_slash")
|
|
||||||
|
|
||||||
let extract_widths chars_and_widths =
|
|
||||||
let win_to_name = map (fun (x, y) -> (y, x)) Pdfglyphlist.name_to_win in
|
|
||||||
map
|
|
||||||
(fun x ->
|
|
||||||
try
|
|
||||||
let name = List.assoc x win_to_name in
|
|
||||||
let width = List.assoc (remove_slash name) chars_and_widths in
|
|
||||||
width
|
|
||||||
with
|
|
||||||
_ -> 0)
|
|
||||||
(ilist 0 255)
|
|
||||||
|
|
||||||
(* For finding the height for URL links, we try to find the Cap Height for the
|
(* For finding the height for URL links, we try to find the Cap Height for the
|
||||||
font. We fall back to using the font size alone if we cannot get the cap
|
font. We fall back to using the font size alone if we cannot get the cap
|
||||||
height. *)
|
height. *)
|
||||||
|
|
|
@ -1,17 +1,6 @@
|
||||||
open Pdfutil
|
open Pdfutil
|
||||||
open Cpdferror
|
open Cpdferror
|
||||||
|
|
||||||
(* Add bookmarks *)
|
|
||||||
let read_lines input =
|
|
||||||
let lines = ref [] in
|
|
||||||
try
|
|
||||||
while true do
|
|
||||||
let c = read_line input in
|
|
||||||
lines =| c
|
|
||||||
done; []
|
|
||||||
with
|
|
||||||
_ -> rev !lines
|
|
||||||
|
|
||||||
(* Verify a list of bookmarks. Positive jumps of > 1 not allowed, no numbers
|
(* Verify a list of bookmarks. Positive jumps of > 1 not allowed, no numbers
|
||||||
smaller than 0. *)
|
smaller than 0. *)
|
||||||
let rec verify_bookmarks pdf lastlevel fastrefnums endpage = function
|
let rec verify_bookmarks pdf lastlevel fastrefnums endpage = function
|
||||||
|
@ -41,9 +30,6 @@ let rec fixup_characters prev = function
|
||||||
| '\\'::'n'::t -> fixup_characters ('\n'::prev) t
|
| '\\'::'n'::t -> fixup_characters ('\n'::prev) t
|
||||||
| h::t -> fixup_characters (h::prev) t
|
| h::t -> fixup_characters (h::prev) t
|
||||||
|
|
||||||
let debug_bookmark_string s =
|
|
||||||
Printf.printf "STR: %s\n" s
|
|
||||||
|
|
||||||
(* If optionaldest = [Pdfgenlex.LexString s], we parse the string, convert the
|
(* If optionaldest = [Pdfgenlex.LexString s], we parse the string, convert the
|
||||||
* integer to an indirect of the real page target, and then put it in. *)
|
* integer to an indirect of the real page target, and then put it in. *)
|
||||||
let target_of_markfile_obj pdf i' pdfobj =
|
let target_of_markfile_obj pdf i' pdfobj =
|
||||||
|
@ -68,6 +54,9 @@ let target_of_markfile_target pdf i' = function
|
||||||
target_of_markfile_obj pdf i' pdfobj
|
target_of_markfile_obj pdf i' pdfobj
|
||||||
| _ -> Pdfpage.target_of_pagenumber pdf i'
|
| _ -> Pdfpage.target_of_pagenumber pdf i'
|
||||||
|
|
||||||
|
(*let debug_bookmark_string s =
|
||||||
|
Printf.printf "STR: %s\n" s*)
|
||||||
|
|
||||||
let bookmark_of_data pdf i s i' isopen optionaldest =
|
let bookmark_of_data pdf i s i' isopen optionaldest =
|
||||||
(*debug_bookmark_string s;
|
(*debug_bookmark_string s;
|
||||||
debug_bookmark_string (implode (fixup_characters [] (explode s)));
|
debug_bookmark_string (implode (fixup_characters [] (explode s)));
|
||||||
|
@ -267,31 +256,6 @@ let get_bookmarks_json pdf =
|
||||||
list_bookmarks ~json:true Cpdfmetadata.UTF8 (ilist 1 (Pdfpage.endpage pdf)) pdf o;
|
list_bookmarks ~json:true Cpdfmetadata.UTF8 (ilist 1 (Pdfpage.endpage pdf)) pdf o;
|
||||||
Pdfio.extract_bytes_from_input_output o br
|
Pdfio.extract_bytes_from_input_output o br
|
||||||
|
|
||||||
(* Split at bookmarks *)
|
|
||||||
|
|
||||||
let get_bookmark_name pdf marks splitlevel n _ =
|
|
||||||
let refnums = Pdf.page_reference_numbers pdf in
|
|
||||||
let fastrefnums = hashtable_of_dictionary (combine refnums (indx refnums)) in
|
|
||||||
match keep (function m -> n = Pdfpage.pagenumber_of_target ~fastrefnums pdf m.Pdfmarks.target && m.Pdfmarks.level <= splitlevel) marks with
|
|
||||||
| {Pdfmarks.text = title}::_ -> Cpdfattach.remove_unsafe_characters Cpdfmetadata.UTF8 title
|
|
||||||
| _ -> ""
|
|
||||||
|
|
||||||
(* Return list, in order, a *set* of page numbers of bookmarks at a given level *)
|
|
||||||
let bookmark_pages level pdf =
|
|
||||||
let refnums = Pdf.page_reference_numbers pdf in
|
|
||||||
let fastrefnums = hashtable_of_dictionary (combine refnums (indx refnums)) in
|
|
||||||
setify_preserving_order
|
|
||||||
(option_map
|
|
||||||
(function l when l.Pdfmarks.level = level -> Some (Pdfpage.pagenumber_of_target ~fastrefnums pdf l.Pdfmarks.target) | _ -> None)
|
|
||||||
(Pdfmarks.read_bookmarks pdf))
|
|
||||||
|
|
||||||
(* Called from cpdflib.ml - different from above *)
|
|
||||||
let split_on_bookmarks pdf level =
|
|
||||||
let points = lose (eq 0) (map pred (bookmark_pages level pdf))
|
|
||||||
in let pdf_pages = Pdfpage.pages_of_pagetree pdf in
|
|
||||||
let ranges = splitat points (indx pdf_pages) in
|
|
||||||
map (fun rs -> Pdfpage.pdf_of_pages pdf rs) ranges
|
|
||||||
|
|
||||||
let get_bookmark_name encoding pdf marks splitlevel n _ =
|
let get_bookmark_name encoding pdf marks splitlevel n _ =
|
||||||
let refnums = Pdf.page_reference_numbers pdf in
|
let refnums = Pdf.page_reference_numbers pdf in
|
||||||
let fastrefnums = hashtable_of_dictionary (combine refnums (indx refnums)) in
|
let fastrefnums = hashtable_of_dictionary (combine refnums (indx refnums)) in
|
||||||
|
|
|
@ -23,7 +23,6 @@ let null () = ()
|
||||||
let initial_file_size = ref 0
|
let initial_file_size = ref 0
|
||||||
|
|
||||||
let empty = Pdf.empty ()
|
let empty = Pdf.empty ()
|
||||||
let emptypage = Pdfpage.blankpage Pdfpaper.a4
|
|
||||||
|
|
||||||
let fontnames =
|
let fontnames =
|
||||||
[(Pdftext.TimesRoman, ["NimbusRoman-Regular.ttf"]);
|
[(Pdftext.TimesRoman, ["NimbusRoman-Regular.ttf"]);
|
||||||
|
@ -1345,11 +1344,6 @@ let setbatesrange n =
|
||||||
in
|
in
|
||||||
args.bates <- n + 1 - first_page
|
args.bates <- n + 1 - first_page
|
||||||
|
|
||||||
let setpagerotation r =
|
|
||||||
match r with
|
|
||||||
| 90 | 270 -> args.pagerotation <- r
|
|
||||||
| _ -> error "Bad Page rotation. Try 90 or 270."
|
|
||||||
|
|
||||||
let set_input s =
|
let set_input s =
|
||||||
args.original_filename <- s;
|
args.original_filename <- s;
|
||||||
args.inputs <- (InFile s, "all", "", "", ref false, None)::args.inputs
|
args.inputs <- (InFile s, "all", "", "", ref false, None)::args.inputs
|
||||||
|
@ -1692,15 +1686,6 @@ let setidironlypdfs () =
|
||||||
let setnowarnrotate () =
|
let setnowarnrotate () =
|
||||||
args.no_warn_rotate <- true
|
args.no_warn_rotate <- true
|
||||||
|
|
||||||
(* Unused for now *)
|
|
||||||
let setfontttfencoding s =
|
|
||||||
args.fontencoding <-
|
|
||||||
match s with
|
|
||||||
| "MacRomanEncoding" -> Pdftext.MacRomanEncoding
|
|
||||||
| "WinAnsiEncoding" -> Pdftext.WinAnsiEncoding
|
|
||||||
| "StandardEncoding" -> Pdftext.StandardEncoding
|
|
||||||
| _ -> error "Unknown encoding"
|
|
||||||
|
|
||||||
let whingemalformed () =
|
let whingemalformed () =
|
||||||
Pdfe.log "Command line must be of exactly the form\ncpdf <infile> -gs <path> -gs-malformed-force -o <outfile>\n";
|
Pdfe.log "Command line must be of exactly the form\ncpdf <infile> -gs <path> -gs-malformed-force -o <outfile>\n";
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -2970,9 +2955,6 @@ let rec get_single_pdf ?(decrypt=true) ?(fail=false) op read_lazy =
|
||||||
| _ ->
|
| _ ->
|
||||||
raise (Arg.Bad "cpdf: No input specified.\n")
|
raise (Arg.Bad "cpdf: No input specified.\n")
|
||||||
|
|
||||||
let get_single_pdf_nodecrypt read_lazy =
|
|
||||||
get_single_pdf ~decrypt:false None read_lazy
|
|
||||||
|
|
||||||
let filenames = null_hash ()
|
let filenames = null_hash ()
|
||||||
|
|
||||||
let squeeze_logto filename x =
|
let squeeze_logto filename x =
|
||||||
|
@ -3333,19 +3315,6 @@ let getencryption pdf =
|
||||||
| Some (Pdfwrite.AES256bitISO true) -> "256bit AES ISO, Metadata encrypted"
|
| Some (Pdfwrite.AES256bitISO true) -> "256bit AES ISO, Metadata encrypted"
|
||||||
| Some (Pdfwrite.AES256bitISO false) -> "256bit AES ISO, Metadata not encrypted"
|
| Some (Pdfwrite.AES256bitISO false) -> "256bit AES ISO, Metadata not encrypted"
|
||||||
|
|
||||||
(* If pages in stamp < pages in main, extend stamp by repeating its last page. If pages in stamp more, chop stamp *)
|
|
||||||
let equalize_pages_extend main stamp =
|
|
||||||
let length_stamp = Pdfpage.endpage stamp
|
|
||||||
in let length_main = Pdfpage.endpage main
|
|
||||||
in let extend_lastpage lastpage page len =
|
|
||||||
Pdfpage.change_pages true page (Pdfpage.pages_of_pagetree page @ (many lastpage len))
|
|
||||||
in let chop pdf n =
|
|
||||||
Pdfpage.change_pages true pdf (take (Pdfpage.pages_of_pagetree pdf) n)
|
|
||||||
in
|
|
||||||
if length_stamp > length_main
|
|
||||||
then chop stamp length_main
|
|
||||||
else extend_lastpage (last (Pdfpage.pages_of_pagetree stamp)) stamp (length_main - length_stamp)
|
|
||||||
|
|
||||||
let write_json output pdf =
|
let write_json output pdf =
|
||||||
match output with
|
match output with
|
||||||
| NoOutputSpecified ->
|
| NoOutputSpecified ->
|
||||||
|
|
|
@ -51,7 +51,7 @@ type drawops =
|
||||||
| RenderMode of int
|
| RenderMode of int
|
||||||
| Rise of float
|
| Rise of float
|
||||||
|
|
||||||
let rec string_of_drawop = function
|
(*let rec string_of_drawop = function
|
||||||
| Qq o -> "Qq (" ^ string_of_drawops o ^ ")"
|
| Qq o -> "Qq (" ^ string_of_drawops o ^ ")"
|
||||||
| FormXObject (_, _, _, _, _, o) -> "FormXObject (" ^ string_of_drawops o ^ ")"
|
| FormXObject (_, _, _, _, _, o) -> "FormXObject (" ^ string_of_drawops o ^ ")"
|
||||||
| TextSection o -> "TextSection (" ^ string_of_drawops o ^ ")"
|
| TextSection o -> "TextSection (" ^ string_of_drawops o ^ ")"
|
||||||
|
@ -72,7 +72,7 @@ let rec string_of_drawop = function
|
||||||
| RenderMode _ -> "RenderMode" | Rise _ -> "Rise"
|
| RenderMode _ -> "RenderMode" | Rise _ -> "Rise"
|
||||||
|
|
||||||
and string_of_drawops l =
|
and string_of_drawops l =
|
||||||
fold_left (fun x y -> x ^ " " ^ y) "" (map string_of_drawop l)
|
fold_left (fun x y -> x ^ " " ^ y) "" (map string_of_drawop l)*)
|
||||||
|
|
||||||
(* Per page / xobject resources *)
|
(* Per page / xobject resources *)
|
||||||
type res =
|
type res =
|
||||||
|
|
|
@ -313,7 +313,7 @@ let bytes_of_xmltree t =
|
||||||
Cpdfxmlm.output_doc_tree frag o t;
|
Cpdfxmlm.output_doc_tree frag o t;
|
||||||
bytes_of_string (Buffer.contents buf)
|
bytes_of_string (Buffer.contents buf)
|
||||||
|
|
||||||
let rec string_of_xmltree = function
|
(*let rec string_of_xmltree = function
|
||||||
D d ->
|
D d ->
|
||||||
Printf.sprintf "DATA {%s}" d
|
Printf.sprintf "DATA {%s}" d
|
||||||
| E (tag, trees) ->
|
| E (tag, trees) ->
|
||||||
|
@ -335,7 +335,7 @@ and string_of_attributes attrs =
|
||||||
|
|
||||||
and string_of_xmltrees trees =
|
and string_of_xmltrees trees =
|
||||||
fold_left
|
fold_left
|
||||||
(fun a b -> a ^ " " ^ b) "" (map string_of_xmltree trees)
|
(fun a b -> a ^ " " ^ b) "" (map string_of_xmltree trees)*)
|
||||||
|
|
||||||
let adobe = "http://ns.adobe.com/pdf/1.3/"
|
let adobe = "http://ns.adobe.com/pdf/1.3/"
|
||||||
let xmp = "http://ns.adobe.com/xap/1.0/"
|
let xmp = "http://ns.adobe.com/xap/1.0/"
|
||||||
|
|
|
@ -23,9 +23,6 @@ let rec insert_after_many_changes isbefore padsize offset range = function
|
||||||
else
|
else
|
||||||
item::insert_after_many_changes isbefore padsize offset range t
|
item::insert_after_many_changes isbefore padsize offset range t
|
||||||
|
|
||||||
let print_changes =
|
|
||||||
iter (fun (f, t) -> Printf.printf "%i --> %i\n" f t)
|
|
||||||
|
|
||||||
let pad_with_pdf (range : int list) (pdf : Pdf.t) (isbefore : bool) (padfile : Pdf.t) =
|
let pad_with_pdf (range : int list) (pdf : Pdf.t) (isbefore : bool) (padfile : Pdf.t) =
|
||||||
let range = sort compare (setify range) in
|
let range = sort compare (setify range) in
|
||||||
let merged =
|
let merged =
|
||||||
|
|
|
@ -260,5 +260,5 @@ let string_of_pagespec pdf = function
|
||||||
in
|
in
|
||||||
fold_left ( ^ ) "" (interleave "," rangestrings)
|
fold_left ( ^ ) "" (interleave "," rangestrings)
|
||||||
|
|
||||||
let string_of_range r =
|
(*let string_of_range r =
|
||||||
fold_left (fun a b -> a ^ " " ^ b) "" (map string_of_int r)
|
fold_left (fun a b -> a ^ " " ^ b) "" (map string_of_int r)*)
|
||||||
|
|
|
@ -13,7 +13,7 @@ type t =
|
||||||
idat : bytes}
|
idat : bytes}
|
||||||
|
|
||||||
(* Writing *)
|
(* Writing *)
|
||||||
let tbl =
|
(*let tbl =
|
||||||
ref ([||] : int32 array)
|
ref ([||] : int32 array)
|
||||||
|
|
||||||
let mktbl () =
|
let mktbl () =
|
||||||
|
@ -80,7 +80,7 @@ let write_png png o =
|
||||||
Bytes.set ihdr 12 (char_of_int 0); (* interlace method *)
|
Bytes.set ihdr 12 (char_of_int 0); (* interlace method *)
|
||||||
write_chunk o "IHDR" ihdr;
|
write_chunk o "IHDR" ihdr;
|
||||||
write_chunk o "IDAT" (Bytes.unsafe_of_string (string_of_bytes png.idat));
|
write_chunk o "IDAT" (Bytes.unsafe_of_string (string_of_bytes png.idat));
|
||||||
write_chunk o "IEND" (Bytes.create 0)
|
write_chunk o "IEND" (Bytes.create 0)*)
|
||||||
|
|
||||||
(* Reading *)
|
(* Reading *)
|
||||||
let string_of_tag t =
|
let string_of_tag t =
|
||||||
|
|
76
cpdfshape.ml
76
cpdfshape.ml
|
@ -1,4 +1,4 @@
|
||||||
(* \chaptertitle{Shapes}{Stroking lines and making shapes} *)
|
(* Stroking lines and making shapes *)
|
||||||
|
|
||||||
(* This module provides for the stroking of lines, and production of shape
|
(* This module provides for the stroking of lines, and production of shape
|
||||||
primitives (circles, regular polygons etc). *)
|
primitives (circles, regular polygons etc). *)
|
||||||
|
@ -30,22 +30,6 @@ control lines when approximating quarter arcs to make semicircles and circles.
|
||||||
*)
|
*)
|
||||||
let kappa = ((sqrt 2. -. 1.) /. 3.) *. 4.
|
let kappa = ((sqrt 2. -. 1.) /. 3.) *. 4.
|
||||||
|
|
||||||
(* Calculate rotation from [p] to [p'] about [c] with the shorter arc-length.
|
|
||||||
When arc-lengths are equal, the result may be either. *)
|
|
||||||
let rotation (cx, cy) (px, py) (px', py') =
|
|
||||||
let px = px -. cx and py = py -. cy
|
|
||||||
and px' = px' -. cx and py' = py' -. cy in
|
|
||||||
let a = px *. py' -. py *. px'
|
|
||||||
and b = px *. px' +. py *. py' in
|
|
||||||
atan2 a b
|
|
||||||
|
|
||||||
(* The absolute angle to a point [p] from a centre [c]. The angle is the
|
|
||||||
rotation clockwise (i.e the first quadrant encountered has positive [x] and [y]
|
|
||||||
values) from East. When the point is [(0, 0)], the result is [0].*)
|
|
||||||
let angle_to (cx, cy) (px, py) =
|
|
||||||
let r = atan2 (py -. cy) (px -. cx) in
|
|
||||||
if r < 0. then r +. 2. *. pi else r
|
|
||||||
|
|
||||||
(* Restrict an angle [a] to one of those at $s, 2s, 3s\ldots$. We find the two
|
(* Restrict an angle [a] to one of those at $s, 2s, 3s\ldots$. We find the two
|
||||||
candidate angles, and see which [a] is numerically closer to. The candidate
|
candidate angles, and see which [a] is numerically closer to. The candidate
|
||||||
points are taken modulo $2\pi$ for this to work. *)
|
points are taken modulo $2\pi$ for this to work. *)
|
||||||
|
@ -54,7 +38,7 @@ let restrict_angle s a =
|
||||||
let p' = mod_float (p +. s) (2. *. pi) in
|
let p' = mod_float (p +. s) (2. *. pi) in
|
||||||
if abs_float (p -. a) < abs_float (p' -. a) then p else p'
|
if abs_float (p -. a) < abs_float (p' -. a) then p else p'
|
||||||
|
|
||||||
(* \section{Some Useful Shapes} *)
|
(* Some Useful Shapes *)
|
||||||
|
|
||||||
(* Make a quarter-circle from a single bezier curve from [s] to $(s + \pi / 2)
|
(* Make a quarter-circle from a single bezier curve from [s] to $(s + \pi / 2)
|
||||||
\bmod 2\pi$ with centre [c] and radius [r]. We cheat by making the standard
|
\bmod 2\pi$ with centre [c] and radius [r]. We cheat by making the standard
|
||||||
|
@ -74,12 +58,6 @@ let quarter s (cx, cy) r =
|
||||||
| [p; q; r; s] -> Bezier(p, q, r, s)
|
| [p; q; r; s] -> Bezier(p, q, r, s)
|
||||||
| _ -> raise (Pdf.PDFError ("Shapes.quarter: inconsistency"))
|
| _ -> raise (Pdf.PDFError ("Shapes.quarter: inconsistency"))
|
||||||
|
|
||||||
(* The anticlockwise variant. *)
|
|
||||||
let quarter_anticlockwise s c r =
|
|
||||||
match quarter s c r with
|
|
||||||
| Bezier(p, q, r, s) -> Bezier(s, r, q, p)
|
|
||||||
| _ -> raise (Pdf.PDFError "Shapes.quarter_anticlockwise: inconsistency")
|
|
||||||
|
|
||||||
(* Some of the following functions generate what is supposed to be a connected
|
(* Some of the following functions generate what is supposed to be a connected
|
||||||
list of segments. However, since they operate by calculating each segment
|
list of segments. However, since they operate by calculating each segment
|
||||||
seperately, floating point inaccuracies can arise, making the end of one
|
seperately, floating point inaccuracies can arise, making the end of one
|
||||||
|
@ -94,56 +72,6 @@ let rec joinsegs segments =
|
||||||
s::joinsegs (Bezier(d, b', c', d')::rest)
|
s::joinsegs (Bezier(d, b', c', d')::rest)
|
||||||
| _ -> raise (Pdf.PDFError "PDFShapes.joinsegs: Segment not supported")
|
| _ -> raise (Pdf.PDFError "PDFShapes.joinsegs: Segment not supported")
|
||||||
|
|
||||||
(* This version sets the start and end points to p1 and p2 respectively. Used
|
|
||||||
for ensuring round joins join correctly to the rails they connect *)
|
|
||||||
let joinsegs_ends p1 p2 segments =
|
|
||||||
match joinsegs segments with
|
|
||||||
| [] -> []
|
|
||||||
| [Bezier(a, b, c, d)] -> [Bezier(p1, b, c, p2)]
|
|
||||||
| segs ->
|
|
||||||
match extremes_and_middle segs with
|
|
||||||
| Bezier(_, b, c, d), m, Bezier(a', b', c', _) ->
|
|
||||||
Bezier(p1, b, c, d)::m @ [Bezier(a', b', c', p2)]
|
|
||||||
| _ -> raise (Pdf.PDFError "PDFShapes.joinsegs_ends: Segment not supported")
|
|
||||||
|
|
||||||
(* The shorter arc made from bezier curves from [p1] to [p2] with centre [c].
|
|
||||||
The arc is formed from zero or more quarter arcs rotated accordingly, and at
|
|
||||||
most one partial arc produced by truncating a quarter arc, again rotated. If
|
|
||||||
[p1=p2], no segments are produced. If the two curves defined by the arguments
|
|
||||||
are of equal length, the one chosen is undefined. *)
|
|
||||||
(*i let arc p1 p2 c =
|
|
||||||
let ninety = pi /. 2.
|
|
||||||
and angletogo = rotation c p1 p2 (*r signed angle to turn through *)
|
|
||||||
and abs_angle = angle_to c p1 (*r absolute angle to the first point *)
|
|
||||||
and r = distance_between p1 c in (*r radius of the resultant arc *)
|
|
||||||
let quarter, ninety_abs =
|
|
||||||
if angletogo > 0.
|
|
||||||
then quarter, ninety
|
|
||||||
else quarter_anticlockwise, ~-.ninety
|
|
||||||
in
|
|
||||||
let segments = ref []
|
|
||||||
and angletogo = ref (abs_float angletogo) (*r Have dealt with sign. *)
|
|
||||||
and abs_angle = ref abs_angle in
|
|
||||||
while !angletogo > 0. do
|
|
||||||
if !angletogo >= ninety then
|
|
||||||
begin
|
|
||||||
angletogo := !angletogo -. ninety;
|
|
||||||
segments := (quarter !abs_angle c r)::!segments;
|
|
||||||
abs_angle := mod_float (!abs_angle +. ninety_abs) (2. *. pi)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
(* Calculate a partial arc to finish, if required. *)
|
|
||||||
if !angletogo > 0. then
|
|
||||||
begin
|
|
||||||
let q = quarter !abs_angle c r in
|
|
||||||
let portion_needed = !angletogo /. ninety in
|
|
||||||
let portion, _ = Polygon.bezier_split portion_needed q in
|
|
||||||
segments := portion::!segments;
|
|
||||||
angletogo := 0.
|
|
||||||
end;
|
|
||||||
done;
|
|
||||||
joinsegs_ends p1 p2 (rev !segments) i*)
|
|
||||||
|
|
||||||
(* Approximate a circle using four bezier curves.*)
|
(* Approximate a circle using four bezier curves.*)
|
||||||
let circle x y r =
|
let circle x y r =
|
||||||
NonZero,
|
NonZero,
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
open Pdfutil
|
open Pdfutil
|
||||||
|
|
||||||
let print_spot_colour n s =
|
|
||||||
Printf.printf "%i %s\n" n s
|
|
||||||
|
|
||||||
let list_spot_colours pdf =
|
let list_spot_colours pdf =
|
||||||
Pdf.objiter
|
Pdf.objiter
|
||||||
(fun _ obj ->
|
(fun _ obj ->
|
||||||
|
@ -14,4 +11,3 @@ let list_spot_colours pdf =
|
||||||
end
|
end
|
||||||
| _ -> ())
|
| _ -> ())
|
||||||
pdf
|
pdf
|
||||||
|
|
||||||
|
|
|
@ -2,14 +2,14 @@ open Pdfutil
|
||||||
open Pdfio
|
open Pdfio
|
||||||
|
|
||||||
(* For debugging *)
|
(* For debugging *)
|
||||||
let report_pdf_size pdf =
|
(*let report_pdf_size pdf =
|
||||||
Pdf.remove_unreferenced pdf;
|
Pdf.remove_unreferenced pdf;
|
||||||
Pdfwrite.pdf_to_file_options ~preserve_objstm:false ~generate_objstm:false
|
Pdfwrite.pdf_to_file_options ~preserve_objstm:false ~generate_objstm:false
|
||||||
~compress_objstm:false None false pdf "temp.pdf";
|
~compress_objstm:false None false pdf "temp.pdf";
|
||||||
let fh = open_in_bin "temp.pdf" in
|
let fh = open_in_bin "temp.pdf" in
|
||||||
Printf.printf "Size %i bytes\n" (in_channel_length fh);
|
Printf.printf "Size %i bytes\n" (in_channel_length fh);
|
||||||
flush stdout;
|
flush stdout;
|
||||||
close_in fh
|
close_in fh*)
|
||||||
|
|
||||||
(* Recompress anything which isn't compressed, unless it's metadata. *)
|
(* Recompress anything which isn't compressed, unless it's metadata. *)
|
||||||
let recompress_stream pdf = function
|
let recompress_stream pdf = function
|
||||||
|
|
|
@ -111,11 +111,6 @@ let contents_of_file filename =
|
||||||
s
|
s
|
||||||
|
|
||||||
(* Platform-independent current time and date with no Unix module *)
|
(* Platform-independent current time and date with no Unix module *)
|
||||||
let debug_str s =
|
|
||||||
for x = 0 to String.length s - 1 do
|
|
||||||
Printf.printf "%i\t%C\n" x s.[x]
|
|
||||||
done
|
|
||||||
|
|
||||||
let utf8_of_utf16le s =
|
let utf8_of_utf16le s =
|
||||||
implode (drop_evens (tl (tl (explode s))))
|
implode (drop_evens (tl (tl (explode s))))
|
||||||
|
|
||||||
|
|
|
@ -66,9 +66,9 @@ let read_byte b = getval_31 b 8
|
||||||
|
|
||||||
let read_short b = sign_extend 16 (getval_31 b 16)
|
let read_short b = sign_extend 16 (getval_31 b 16)
|
||||||
|
|
||||||
let read_f2dot14 b =
|
(*let read_f2dot14 b =
|
||||||
let v = read_ushort b in
|
let v = read_ushort b in
|
||||||
float_of_int (sign_extend 2 (v lsr 14)) +. (float_of_int (v land 0x3FFF) /. 16384.)
|
float_of_int (sign_extend 2 (v lsr 14)) +. (float_of_int (v land 0x3FFF) /. 16384.)*)
|
||||||
|
|
||||||
let discard_bytes b n =
|
let discard_bytes b n =
|
||||||
for x = 1 to n do ignore (getval_31 b 8) done
|
for x = 1 to n do ignore (getval_31 b 8) done
|
||||||
|
@ -129,7 +129,7 @@ let read_format_4_encoding_table b =
|
||||||
done;
|
done;
|
||||||
t
|
t
|
||||||
|
|
||||||
let print_encoding_table fmt table =
|
(*let print_encoding_table fmt table =
|
||||||
let unicodedata = Cpdfunicodedata.unicodedata () in
|
let unicodedata = Cpdfunicodedata.unicodedata () in
|
||||||
let unicodetable = Hashtbl.create 16000 in
|
let unicodetable = Hashtbl.create 16000 in
|
||||||
iter
|
iter
|
||||||
|
@ -144,7 +144,7 @@ let print_encoding_table fmt table =
|
||||||
if !dbg then
|
if !dbg then
|
||||||
Printf.printf "Char %s (%s) is at glyph index %i\n"
|
Printf.printf "Char %s (%s) is at glyph index %i\n"
|
||||||
str (try Hashtbl.find unicodetable str with Not_found -> "Not_found") gi)
|
str (try Hashtbl.find unicodetable str with Not_found -> "Not_found") gi)
|
||||||
l
|
l*)
|
||||||
|
|
||||||
let read_encoding_table fmt length version b =
|
let read_encoding_table fmt length version b =
|
||||||
if !dbg then Printf.printf "********** format %i table has length, version %i, %i\n" fmt length version;
|
if !dbg then Printf.printf "********** format %i table has length, version %i, %i\n" fmt length version;
|
||||||
|
@ -375,10 +375,6 @@ let calculate_width_higher unitsPerEm firstchar lastchar subset cmapdata hmtxdat
|
||||||
let calculate_maxwidth unitsPerEm hmtxdata =
|
let calculate_maxwidth unitsPerEm hmtxdata =
|
||||||
pdf_unit unitsPerEm (hd (sort (fun a b -> compare b a) (Array.to_list hmtxdata)))
|
pdf_unit unitsPerEm (hd (sort (fun a b -> compare b a) (Array.to_list hmtxdata)))
|
||||||
|
|
||||||
let fonumr = ref (-1)
|
|
||||||
|
|
||||||
let fonum () = fonumr += 1; !fonumr
|
|
||||||
|
|
||||||
let subset_font major minor tables indexToLocFormat subset encoding cmap loca mk_b glyfoffset data =
|
let subset_font major minor tables indexToLocFormat subset encoding cmap loca mk_b glyfoffset data =
|
||||||
let tables = Array.of_list (sort (fun (_, _, o, _) (_, _, o', _) -> compare o o') tables) in
|
let tables = Array.of_list (sort (fun (_, _, o, _) (_, _, o', _) -> compare o o') tables) in
|
||||||
let tablesout = ref [] in
|
let tablesout = ref [] in
|
||||||
|
|
|
@ -110,25 +110,6 @@ let rec parse_unicodedata a i =
|
||||||
then rev a
|
then rev a
|
||||||
else parse_unicodedata (parse_entry i::a) i
|
else parse_unicodedata (parse_entry i::a) i
|
||||||
|
|
||||||
let print_entry e =
|
|
||||||
Printf.printf
|
|
||||||
"{{%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s}}\n"
|
|
||||||
e.code_value
|
|
||||||
e.character_name
|
|
||||||
e.general_category
|
|
||||||
e.canonical_combining_classes
|
|
||||||
e.bidirectional_category
|
|
||||||
e.character_decomposition_mapping
|
|
||||||
e.decimal_digit_value
|
|
||||||
e.digit_value
|
|
||||||
e.numeric_value
|
|
||||||
e.mirrored
|
|
||||||
e.unicode_10_name
|
|
||||||
e.iso_10646_comment_field
|
|
||||||
e.uppercase_mapping
|
|
||||||
e.lowercase_mapping
|
|
||||||
e.titlecase_mapping
|
|
||||||
|
|
||||||
let unicodedata =
|
let unicodedata =
|
||||||
memoize
|
memoize
|
||||||
(fun () ->
|
(fun () ->
|
||||||
|
|
|
@ -110,25 +110,6 @@ let rec parse_unicodedata a i =
|
||||||
then rev a
|
then rev a
|
||||||
else parse_unicodedata (parse_entry i::a) i
|
else parse_unicodedata (parse_entry i::a) i
|
||||||
|
|
||||||
let print_entry e =
|
|
||||||
Printf.printf
|
|
||||||
"{{%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s}}\n"
|
|
||||||
e.code_value
|
|
||||||
e.character_name
|
|
||||||
e.general_category
|
|
||||||
e.canonical_combining_classes
|
|
||||||
e.bidirectional_category
|
|
||||||
e.character_decomposition_mapping
|
|
||||||
e.decimal_digit_value
|
|
||||||
e.digit_value
|
|
||||||
e.numeric_value
|
|
||||||
e.mirrored
|
|
||||||
e.unicode_10_name
|
|
||||||
e.iso_10646_comment_field
|
|
||||||
e.uppercase_mapping
|
|
||||||
e.lowercase_mapping
|
|
||||||
e.titlecase_mapping
|
|
||||||
|
|
||||||
let unicodedata =
|
let unicodedata =
|
||||||
memoize
|
memoize
|
||||||
(fun () ->
|
(fun () ->
|
||||||
|
|
Loading…
Reference in New Issue