revList
abc
bitsOut
+ tagOut
swfBaseOut
swfType
swfOut
OUnitTest(cpool , cpool revList)
OUnitTest(swfOut, swfOut swfBaseOut bitsOut)
+OUnitTest(tagOut, tagOut)
OUnitTest(swfBaseOut, swfBaseOut bitsOut)
OUnitTest(bitsOut, bitsOut)
--- /dev/null
+open Base
+open SwfType
+open SwfOut
+
+module M = SwfOut.Make(TagOut)
+open M
+
+let swf = {
+ version = 1;
+ frame_size = { top=0; bottom=10000; left=0; right=20000 };
+ frame_rate = 24.0;
+ frame_count = 1;
+ tags = [
+ `SetBackgroundColor(0xFF,0xFF,0xFF);
+ `ShowFrame;
+ `End;
+ ]
+}
+let _ =
+ let bytes =
+ to_base swf
+ +> SwfBaseOut.to_list in
+ open_out_with "test.swf" begin fun ch ->
+ List.iter (output_byte ch) bytes
+ end
| `Fixed8 of float
| `Float32 of float
| `Float64 of float
-| `Rect of int*int*int*int
+| `Rect of int * int * int * int
+| `RGB of int * int * int
+| `RGBA of int * int * int * int
]
type backpatch = [
[`Bits [UB(5, w);
SB(w, x_min); SB(w, x_max);
SB(w, y_min); SB(w, y_max)]]
+ | `RGB(r,g,b) ->
+ [`Ui8 r; `Ui8 g; `Ui8 b]
+ | `RGBA(r,g,b,a) ->
+ [`Ui8 r; `Ui8 g; `Ui8 b; `Ui8 a]
let backpatch xs =
let (f,size) =
| `EUi32 of int32
| `Bits of bit list
| `Rect of int*int*int*int
+| `RGB of int * int * int
+| `RGBA of int * int * int * int
| `Ui32Size
]
"size" >:: begin fun () ->
ok_b [`Ui32 4l] [`Ui32Size];
ok_b [`Ui32 6l; `EUi32 0xFFl] [`Ui32Size; `EUi32 0xFFl;];
+ end;
+ "rgb" >:: begin fun () ->
+ ok_b [`Ui8 1; `Ui8 2; `Ui8 3] [`RGB (1,2,3)];
+ ok_b [`Ui8 1; `Ui8 2; `Ui8 3; `Ui8 4] [`RGBA (1,2,3,4)]
end
] end +> run_test_tt_main
module type TagType = sig
type t
- val to_base : t -> SwfBaseOut.t list
+ val to_base : t -> int * SwfBaseOut.t list
end
module Make(Tag : TagType) = struct
let of_rect {top; bottom; left; right} =
`Rect(left,right,top,bottom)
- let of_tag {tag; data} =
+ let of_tag tag =
let make_type t size =
`Ui16 ((t lsl 6) lor size) in
- let data' =
- Tag.to_base data in
+ let tag,data' =
+ Tag.to_base tag in
let size =
- List.length data' in
+ List.length @@ SwfBaseOut.to_list data' in
if size < 0x3F then
make_type tag size :: data'
else
`Fixed8 t.frame_rate;
(* frame count *)
`Ui16 t.frame_count
- ]
+ ] @ HList.concat_map of_tag t.tags
end
module type TagType = sig
type t
- val to_base : t -> SwfBaseOut.t list
+ val to_base : t -> int * SwfBaseOut.t list
end
val to_base : Tag.t SwfType.t -> SwfBaseOut.t list
(* for debug *)
- val of_tag : Tag.t SwfType.tag -> SwfBaseOut.t list
+ val of_tag : Tag.t -> SwfBaseOut.t list
end
open OUnit
module M = SwfOut.Make(struct
- type t = SwfBaseOut.t list
+ type t = int * SwfBaseOut.t list
let to_base x = x
end)
open M
]
end;
"tag" >:: begin fun () ->
- ok ~msg:"size < 64" of_tag {tag=1; data=[`Ui8 1;`Ui8 2; `Ui8 3]}
+ ok ~msg:"size < 64" of_tag (1, [`Ui8 1;`Ui8 2; `Ui8 3])
[ `Ui16 0b0000000001_000011; `Ui8 1; `Ui8 2; `Ui8 3 ];
(* size >= 64*)
- ok ~msg:"size > 64" of_tag {tag=1; data = HList.replicate 64 (`Ui8 1)} @@
+ ok ~msg:"size > 64" of_tag (1, HList.replicate 64 (`Ui8 1)) @@
[ `Ui16 0b0000000001_111111; `Si32 64l ] @ HList.replicate 64 (`Ui8 1)
end
] end +> run_test_tt_main
bottom : int;
}
-type 'a tag = {
- tag : int;
- data : 'a;
-}
-
type 'a t = {
version: int;
frame_size: rect;
frame_rate: float;
frame_count: int;
- tags : 'a tag list
+ tags : 'a list
}
--- /dev/null
+open Base
+
+type t = [
+ `End
+| `SetBackgroundColor of int * int * int
+| `ShowFrame
+]
+let to_base = function
+ `End ->
+ (0,[])
+ | `ShowFrame ->
+ (1,[])
+ | `SetBackgroundColor(r,g,b) ->
+ (9,[`RGB(r,g,b)])
--- /dev/null
+open Base
+open OUnit
+open TagOut
+
+let ok x y =
+ assert_equal x @@ to_base y
+
+let _ = begin "tagOut.ml" >::: [
+ "End" >:: begin fun () ->
+ ok (0,[]) `End
+ end;
+ "SetBackgroundColor" >:: begin fun () ->
+ ok (9,[`RGB(0,1,2)]) (`SetBackgroundColor (0,1,2))
+ end
+] end +> run_test_tt_main
+
+