This commit is contained in:
John Whitington 2022-10-04 16:09:20 +01:00
parent dcd3242ad2
commit 22f6f34686
3 changed files with 24 additions and 23 deletions

View File

@ -48,11 +48,7 @@ let embed_truetype pdf ~fontfile ~fontname ~codepoints ~encoding =
let glyphlist_table = Pdfglyphlist.reverse_glyph_hashes () in
let encoding_table = Pdftext.reverse_table_of_encoding encoding in
let accepted_unicodepoints =
map
(fun u ->
(u, pdfcode_of_unicode_codepoint encoding_table glyphlist_table u))
(calc_accepted_unicodepoints
encoding_table glyphlist_table codepoints)
calc_accepted_unicodepoints encoding_table glyphlist_table codepoints
in
let f = Cpdftruetype.parse ~subset:accepted_unicodepoints fontfile ~encoding in
let name_1 = basename () in

View File

@ -131,18 +131,24 @@ let read_loca_table indexToLocFormat numGlyphs b =
| 1 -> Array.init (numGlyphs + 1) (function _ -> read_ulong b)
| _ -> raise (Pdf.PDFError "Unknown indexToLocFormat in read_loca_table")
let write_loca_table indexToLocFormat bs arr =
Array.iter
(fun x ->
match indexToLocFormat with
| 0 ->
Printf.printf "%li\n" (i32div x 2l);
putval bs 16 (i32div x 2l)
| 1 ->
Printf.printf "%li\n" x;
putval bs 32 x
| _ -> raise (Pdf.PDFError "Unknown indexToLocFormat in write_loca_table"))
arr
let write_loca_table subset encoding cmap indexToLocFormat bs arr =
let missing_char_glyph_loca = arr.(0) in
let is_included u =
true
in
Array.iter
(fun x ->
match indexToLocFormat with
| 0 ->
if is_included x
then putval bs 16 (i32div x 2l)
else putval bs 16 (i32div missing_char_glyph_loca 2l)
| 1 ->
if is_included x
then putval bs 32 x
else putval bs 32 missing_char_glyph_loca
| _ -> raise (Pdf.PDFError "Unknown indexToLocFormat in write_loca_table"))
arr
let read_os2_table unitsPerEm b blength =
let version = read_ushort b in
@ -198,7 +204,7 @@ let unicode_codepoint_of_pdfcode encoding_table glyphlist_table p =
let calculate_widths unitsPerEm encoding firstchar lastchar subset cmapdata hmtxdata =
if lastchar < firstchar then failwith "lastchar < firschar" else
if !dbg then List.iter (fun (a, b) -> Printf.printf "%i -> %i\n" a b) (sort compare (list_of_hashtbl cmapdata));
(*if !dbg then List.iter (fun (a, b) -> Printf.printf "%i -> %i\n" a b) (sort compare (list_of_hashtbl cmapdata));*)
let encoding_table = Pdftext.table_of_encoding encoding in
let glyphlist_table = Pdfglyphlist.glyph_hashes () in
Array.init
@ -220,7 +226,7 @@ let calculate_widths unitsPerEm encoding firstchar lastchar subset cmapdata hmtx
let calculate_maxwidth unitsPerEm hmtxdata =
pdf_unit unitsPerEm (hd (sort (fun a b -> compare b a) (Array.to_list hmtxdata)))
let remove_unneeded_tables major minor tables indexToLocFormat loca data =
let remove_unneeded_tables major minor tables indexToLocFormat subset encoding cmap loca data =
let tables = Array.of_list (sort (fun (_, _, o, _) (_, _, o', _) -> compare o o') tables) in
let tablesout = ref [] in
let cut = ref 0l in
@ -288,7 +294,7 @@ let remove_unneeded_tables major minor tables indexToLocFormat loca data =
(fun (tag, _, _, _) ->
if !dbg then Printf.printf "Writing %s table\n" (string_of_tag tag);
if string_of_tag tag = "loca" then
write_loca_table indexToLocFormat bs loca
write_loca_table subset encoding cmap indexToLocFormat bs loca
else
match findtag tag with
| (og_off, Some len) ->
@ -309,7 +315,6 @@ let remove_unneeded_tables major minor tables indexToLocFormat loca data =
bytes
let parse ?(subset=[]) data ~encoding =
let subset = map fst subset in
let mk_b byte_offset = bitbytes_of_input (let i = input_of_bytes data in i.seek_in byte_offset; i) in
let b = mk_b 0 in
let major, minor = read_fixed b in
@ -429,7 +434,7 @@ let parse ?(subset=[]) data ~encoding =
let stemv = calculate_stemv () in
let b = mk_b (i32toi locaoffset) in
let loca = read_loca_table indexToLocFormat numGlyphs b in
let subset = remove_unneeded_tables major minor !tables indexToLocFormat loca data in
let subset = remove_unneeded_tables major minor !tables indexToLocFormat subset encoding !glyphcodes loca data in
{flags; minx; miny; maxx; maxy; italicangle; ascent; descent;
capheight; stemv; xheight; avgwidth; maxwidth; firstchar; lastchar;
widths; subset}

View File

@ -21,4 +21,4 @@ type t =
(* Parse the font, given the list of Unicode codepoints required for the subset
and optionally their PDF codepoint too. Returns the information required for
embedding this font in a PDF. *)
val parse : ?subset:(int * int option) list -> Pdfio.bytes -> encoding:Pdftext.encoding -> t
val parse : ?subset:int list -> Pdfio.bytes -> encoding:Pdftext.encoding -> t