Initial implementation of composite glyph expansion

This commit is contained in:
John Whitington 2023-07-11 14:21:33 +01:00
parent ccec42aa36
commit 41cc4f00a8
1 changed files with 36 additions and 4 deletions

View File

@ -245,6 +245,38 @@ let write_loca_table subset cmap indexToLocFormat bs loca =
pairs; pairs;
for x = 1 to padding !len do putval bs 8 0l done for x = 1 to padding !len do putval bs 8 0l done
(* Expand the subset of locations to include composites *)
let expand_composites_one mk_b loca glyfoffset locations =
let rec read_components b =
let componentFlags = read_ushort b in
let glyphIndex = read_ushort b in
(* Skip the rest of this component *)
if componentFlags land 0x0001 > 0 then discard_bytes b 4 else discard_bytes b 2;
(if componentFlags land 0x0008 > 0 then discard_bytes b 2
else if componentFlags land 0x0040 > 0 then discard_bytes b 4
else if componentFlags land 0x0080 > 0 then discard_bytes b 8);
if componentFlags land 0x0020 > 0 then glyphIndex::read_components b else [glyphIndex]
in
let expanded =
map
(fun l ->
let b = mk_b (i32toi (i32add glyfoffset loca.(l))) in
let numberOfContours = read_short b in
if numberOfContours < 0 then
begin
discard_bytes b 8; (* xMin, xMax, yMin, yMax *)
l::read_components b
end
else
[l])
locations
in
sort compare (setify (flatten expanded))
let rec expand_composites mk_b loca glyfoffset locations =
let expanded = expand_composites_one mk_b loca glyfoffset locations in
if expanded = locations then expanded else expand_composites mk_b loca glyfoffset expanded
(* Write the notdef glyf, and any others in the subset *) (* Write the notdef glyf, and any others in the subset *)
let write_glyf_table subset cmap bs mk_b glyfoffset loca = let write_glyf_table subset cmap bs mk_b glyfoffset loca =
if !dbg then Printf.printf "***write_glyf_table\n"; if !dbg then Printf.printf "***write_glyf_table\n";
@ -259,8 +291,8 @@ let write_glyf_table subset cmap bs mk_b glyfoffset loca =
with with
Not_found -> ()) Not_found -> ())
subset; subset;
let locnums = sort compare (map fst (list_of_hashtbl locnums)) in let locnums = expand_composites mk_b loca glyfoffset (sort compare (map fst (list_of_hashtbl locnums))) in
if !dbg then (*if !dbg then*)
(Printf.printf "We want glyfs for locations: "; (Printf.printf "We want glyfs for locations: ";
iter (Printf.printf "%i ") locnums; Printf.printf "\n"); iter (Printf.printf "%i ") locnums; Printf.printf "\n");
let byteranges = map (fun x -> (loca.(x), loca.(x + 1))) locnums in let byteranges = map (fun x -> (loca.(x), loca.(x + 1))) locnums in
@ -645,12 +677,12 @@ let parse ~subset data encoding =
widths; subset_fontfile; subset; tounicode}) widths; subset_fontfile; subset; tounicode})
firstchars_2 lastchars_2 widths_2 seconds_subsets subsets_2 seconds_tounicodes firstchars_2 lastchars_2 widths_2 seconds_subsets subsets_2 seconds_tounicodes
in in
(*Printf.printf "\nMain subset:\n"; Printf.printf "\nMain subset:\n";
debug_t one; debug_t one;
write_font "one.ttf" one.subset_fontfile; write_font "one.ttf" one.subset_fontfile;
Printf.printf "\nHigher subset:\n"; Printf.printf "\nHigher subset:\n";
debug_t (hd twos); debug_t (hd twos);
write_font "two.ttf" (hd twos).subset_fontfile;*) write_font "two.ttf" (hd twos).subset_fontfile;
one::twos one::twos
let parse ~subset data encoding = let parse ~subset data encoding =