open TTFData
exception Abort
let gen_hxswfml_debug fontname =
let xml = "
"
in
Std.output_file (fontname ^ ".fxml") xml;
if Sys.command "haxe -main Main -swf main.swf" <> 0 then failwith "Error while executing haxe";
if Sys.command ("hxswfml xml2swf \"" ^ fontname ^ ".fxml\" \"" ^ fontname ^ ".swf\" -no-strict") <> 0 then failwith "Error while executing hxswfml";
Unix.unlink (fontname ^ ".fxml");
Unix.unlink "main.swf"
let normalize_path p =
let l = String.length p in
if l = 0 then
"./"
else begin
let p = String.concat "/" (ExtString.String.nsplit p "\\") in
match p.[l-1] with
| '/' -> p
| _ -> p ^ "/"
end
let mk_dir_rec dir =
let dir = normalize_path dir in
let parts = ExtString.String.nsplit dir "/" in
let rec create acc = function
| [] -> ()
| "" :: [] -> ()
| d :: l ->
let dir = String.concat "/" (List.rev (d :: acc)) in
if not (Sys.file_exists dir) then Unix.mkdir dir 0o755;
create (d :: acc) l
in
create [] parts
let exit msg =
prerr_endline msg;
raise Abort
let process args =
let fonts = ref [] in
let range_str = ref "" in
let targets = ref [] in
let debug_hxswfml = ref false in
let args_callback s = fonts := s :: !fonts in
let usage = Printf.sprintf
"Ttf (-swf|-canvas)"
in
let basic_args = [
("-range",Arg.String (fun str ->
range_str := str;
)," : specifies the character range");
("-swf",Arg.String (fun dir ->
mk_dir_rec dir;
let f ttf range_str =
let config = {
ttfc_range_str = range_str;
ttfc_font_name = None;
ttfc_font_weight = TFWRegular;
ttfc_font_posture = TFPNormal;
} in
let f2 = TTFSwfWriter.to_swf ttf config in
let ch = IO.output_channel (open_out_bin (dir ^ "/" ^ ttf.ttf_font_name ^ ".dat")) in
let b = IO.output_bits ch in
IO.write_i16 ch 1;
TTFSwfWriter.write_font2 ch b f2;
IO.close_out ch;
if !debug_hxswfml then begin
if not (Sys.file_exists "Main.hx") then failwith "Could not find Main.hx required for -hxswfml-debug";
let main = Std.input_file "Main.hx" in
let old = Sys.getcwd () in
Sys.chdir dir;
Std.output_file ~filename:"Main.hx" ~text:main;
gen_hxswfml_debug ttf.ttf_font_name;
Unix.unlink "Main.hx";
Sys.chdir old;
end
in
targets := f :: !targets;
)," : generate swf tag data to ");
("-canvas", Arg.String (fun dir ->
mk_dir_rec dir;
let f ttf range_str =
let glyphs = TTFCanvasWriter.to_canvas ttf range_str in
let ch = IO.output_channel (open_out_bin (dir ^ "/" ^ ttf.ttf_font_name ^ ".js")) in
TTFCanvasWriter.write_font ch ttf glyphs;
IO.close_out ch;
in
targets := f :: !targets;
)," : generate canvas draw commands to ");
("-json", Arg.String (fun dir ->
mk_dir_rec dir;
let f ttf range_str =
let glyphs = TTFJsonWriter.to_json ttf range_str in
let ch = IO.output_channel (open_out_bin (dir ^ "/" ^ ttf.ttf_font_name ^ ".js")) in
TTFJsonWriter.write_font ch ttf glyphs;
IO.close_out ch;
in
targets := f :: !targets;
)," : generate json-encoded glyph information to ");
("-hxswfml-debug", Arg.Unit (fun () ->
debug_hxswfml := true;
),": generate debug swf with hxswfml")
] in
if Array.length Sys.argv = 1 then
Arg.usage basic_args usage
else begin
Arg.parse basic_args args_callback usage;
match !fonts,!targets with
| [],_ ->
prerr_endline "Missing font argument";
Arg.usage basic_args usage
| _,[] ->
prerr_endline "No targets specified (-swf|-canvas|-json)";
Arg.usage basic_args usage
| fonts,targets ->
List.iter (fun font ->
let ch = try open_in_bin font with _ -> exit ("No such file: " ^ font) in
let ttf = TTFParser.parse ch in
List.iter (fun target ->
target ttf !range_str
) targets;
close_in ch;
) fonts;
end
;;
try
process Sys.argv;
with Abort ->
()