Initial implementation of composite glyph expansion
This commit is contained in:
parent
ccec42aa36
commit
41cc4f00a8
|
@ -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 =
|
||||||
|
|
Loading…
Reference in New Issue