|
Packit |
bd2e5d |
(***********************************************************************)
|
|
Packit |
bd2e5d |
(* *)
|
|
Packit |
bd2e5d |
(* MLTk, Tcl/Tk interface of OCaml *)
|
|
Packit |
bd2e5d |
(* *)
|
|
Packit |
bd2e5d |
(* Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis *)
|
|
Packit |
bd2e5d |
(* projet Cristal, INRIA Rocquencourt *)
|
|
Packit |
bd2e5d |
(* Jacques Garrigue, Kyoto University RIMS *)
|
|
Packit |
bd2e5d |
(* *)
|
|
Packit |
bd2e5d |
(* Copyright 2002 Institut National de Recherche en Informatique et *)
|
|
Packit |
bd2e5d |
(* en Automatique and Kyoto University. All rights reserved. *)
|
|
Packit |
bd2e5d |
(* This file is distributed under the terms of the GNU Library *)
|
|
Packit |
bd2e5d |
(* General Public License, with the special exception on linking *)
|
|
Packit |
bd2e5d |
(* described in file LICENSE found in the OCaml source tree. *)
|
|
Packit |
bd2e5d |
(* *)
|
|
Packit |
bd2e5d |
(***********************************************************************)
|
|
Packit |
bd2e5d |
(* Delayed global, a.k.a cache&carry *)
|
|
Packit |
bd2e5d |
let autodef f =
|
|
Packit |
bd2e5d |
let v = ref None in
|
|
Packit |
bd2e5d |
(function () ->
|
|
Packit |
bd2e5d |
match !v with
|
|
Packit |
bd2e5d |
None ->
|
|
Packit |
bd2e5d |
let x = f() in
|
|
Packit |
bd2e5d |
v := Some x;
|
|
Packit |
bd2e5d |
x
|
|
Packit |
bd2e5d |
| Some x -> x)
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
open Camltk
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
(* allows Data in options *)
|
|
Packit |
bd2e5d |
let create_photo options =
|
|
Packit |
bd2e5d |
let hasopt = ref None in
|
|
Packit |
bd2e5d |
(* Check options *)
|
|
Packit |
bd2e5d |
List.iter (function
|
|
Packit |
bd2e5d |
Data s ->
|
|
Packit |
bd2e5d |
begin match !hasopt with
|
|
Packit |
bd2e5d |
None -> hasopt := Some (Data s)
|
|
Packit |
bd2e5d |
| Some _ -> raise (Protocol.TkError "two data sources in options")
|
|
Packit |
bd2e5d |
end
|
|
Packit |
bd2e5d |
| File f ->
|
|
Packit |
bd2e5d |
begin match !hasopt with
|
|
Packit |
bd2e5d |
None -> hasopt := Some (File f)
|
|
Packit |
bd2e5d |
| Some _ -> raise (Protocol.TkError "two data sources in options")
|
|
Packit |
bd2e5d |
end
|
|
Packit |
bd2e5d |
| o -> ())
|
|
Packit |
bd2e5d |
options;
|
|
Packit |
bd2e5d |
match !hasopt with
|
|
Packit |
bd2e5d |
None -> raise (Protocol.TkError "no data source in options")
|
|
Packit |
bd2e5d |
| Some (Data s) ->
|
|
Packit |
bd2e5d |
begin
|
|
Packit |
bd2e5d |
let tmpfile = Filename.temp_file "img" "" in
|
|
Packit |
bd2e5d |
let oc = open_out_bin tmpfile in
|
|
Packit |
bd2e5d |
output_string oc s;
|
|
Packit |
bd2e5d |
close_out oc;
|
|
Packit |
bd2e5d |
let newopts =
|
|
Packit |
bd2e5d |
List.map (function
|
|
Packit |
bd2e5d |
| Data s -> File tmpfile
|
|
Packit |
bd2e5d |
| o -> o)
|
|
Packit |
bd2e5d |
options in
|
|
Packit |
bd2e5d |
try
|
|
Packit |
bd2e5d |
let i = Imagephoto.create newopts in
|
|
Packit |
bd2e5d |
(try Sys.remove tmpfile with Sys_error _ -> ());
|
|
Packit |
bd2e5d |
i
|
|
Packit |
bd2e5d |
with
|
|
Packit |
bd2e5d |
e ->
|
|
Packit |
bd2e5d |
(try Sys.remove tmpfile with Sys_error _ -> ());
|
|
Packit |
bd2e5d |
raise e
|
|
Packit |
bd2e5d |
end
|
|
Packit |
bd2e5d |
| Some (File s) -> Imagephoto.create options
|
|
Packit |
bd2e5d |
| _ -> assert false
|