swf_emitter/
basic_data_types.rs1use std::convert::TryInto;
2use std::io;
3
4use swf_fixed::{Sfixed16P16, Sfixed8P8};
5use swf_types as ast;
6
7use crate::bit_count::get_i32_min_bit_count;
8use crate::io_bits::{BitsWriter, WriteBits};
9use crate::primitives::emit_u8;
10
11pub fn emit_c_string<W: io::Write>(writer: &mut W, value: &str) -> io::Result<()> {
13 writer.write_all(value.as_bytes())?;
14 writer.write_all(&[0])
15}
16
17pub fn emit_leb128_u32<W: io::Write>(writer: &mut W, mut value: u32) -> io::Result<()> {
18 if value == 0 {
19 return emit_u8(writer, 0);
20 }
21 while value != 0 {
22 let mut next_byte: u8 = (value & 0x7f).try_into().unwrap();
23 value >>= 7;
24 if value != 0 {
25 next_byte |= 0x80;
26 }
27 emit_u8(writer, next_byte)?;
28 }
29 Ok(())
30}
31
32pub fn emit_rect<W: io::Write>(writer: &mut W, value: &ast::Rect) -> io::Result<()> {
33 let mut bits_writer = BitsWriter::new(Vec::new());
34 emit_rect_bits(&mut bits_writer, value)?;
35 writer.write_all(&bits_writer.into_inner()?)
36}
37
38pub fn emit_rect_bits<W: WriteBits>(writer: &mut W, value: &ast::Rect) -> io::Result<()> {
39 let bits = get_i32_min_bit_count(vec![value.x_min, value.x_max, value.y_min, value.y_max].into_iter());
40 writer.write_u32_bits(5, bits)?;
41 writer.write_i32_bits(bits, value.x_min)?;
42 writer.write_i32_bits(bits, value.x_max)?;
43 writer.write_i32_bits(bits, value.y_min)?;
44 writer.write_i32_bits(bits, value.y_max)
45}
46
47pub fn emit_s_rgb8<W: io::Write + ?Sized>(writer: &mut W, value: ast::SRgb8) -> io::Result<()> {
48 emit_u8(writer, value.r)?;
49 emit_u8(writer, value.g)?;
50 emit_u8(writer, value.b)
51}
52
53pub fn emit_straight_s_rgba8<W: io::Write + ?Sized>(writer: &mut W, value: ast::StraightSRgba8) -> io::Result<()> {
54 emit_u8(writer, value.r)?;
55 emit_u8(writer, value.g)?;
56 emit_u8(writer, value.b)?;
57 emit_u8(writer, value.a)
58}
59
60pub fn emit_matrix<W: io::Write + ?Sized>(writer: &mut W, value: &ast::Matrix) -> io::Result<()> {
61 let mut bits_writer = BitsWriter::new(Vec::new());
62 emit_matrix_bits(&mut bits_writer, value)?;
63 writer.write_all(&bits_writer.into_inner()?)
64}
65
66pub fn emit_matrix_bits<W: WriteBits>(writer: &mut W, value: &ast::Matrix) -> io::Result<()> {
67 if value.scale_x == Sfixed16P16::ONE && value.scale_y == Sfixed16P16::ONE {
68 writer.write_bool_bits(false)?;
69 } else {
70 writer.write_bool_bits(true)?;
71 let bits = get_i32_min_bit_count(vec![value.scale_x.epsilons, value.scale_y.epsilons].into_iter());
72 writer.write_u32_bits(5, bits)?;
73 writer.write_i32_bits(bits, value.scale_x.epsilons)?;
74 writer.write_i32_bits(bits, value.scale_y.epsilons)?;
75 }
76
77 if value.rotate_skew0 == Sfixed16P16::ZERO && value.rotate_skew1 == Sfixed16P16::ZERO {
78 writer.write_bool_bits(false)?;
79 } else {
80 writer.write_bool_bits(true)?;
81 let bits = get_i32_min_bit_count(vec![value.rotate_skew0.epsilons, value.rotate_skew1.epsilons].into_iter());
82 writer.write_u32_bits(5, bits)?;
83 writer.write_i32_bits(bits, value.rotate_skew0.epsilons)?;
84 writer.write_i32_bits(bits, value.rotate_skew1.epsilons)?;
85 }
86
87 {
88 let bits = get_i32_min_bit_count(vec![value.translate_x, value.translate_y].into_iter());
89 writer.write_u32_bits(5, bits)?;
90 writer.write_i32_bits(bits, value.translate_x)?;
91 writer.write_i32_bits(bits, value.translate_y)?;
92 }
93
94 Ok(())
95}
96
97pub fn emit_color_transform<W: io::Write>(writer: &mut W, value: &ast::ColorTransform) -> io::Result<()> {
98 let mut bits_writer = BitsWriter::new(Vec::new());
99 emit_color_transform_bits(&mut bits_writer, value)?;
100 writer.write_all(&bits_writer.into_inner()?)
101}
102
103pub fn emit_color_transform_bits<W: WriteBits>(writer: &mut W, value: &ast::ColorTransform) -> io::Result<()> {
104 let has_add = value.red_add != 0 || value.green_add != 0 || value.blue_add != 0;
105 let has_mult =
106 value.red_mult != Sfixed8P8::ONE || value.green_mult != Sfixed8P8::ONE || value.blue_mult != Sfixed8P8::ONE;
107
108 let mut to_write: Vec<i32> = Vec::new();
109 if has_mult {
110 to_write.extend_from_slice(&[
111 value.red_mult.epsilons.into(),
112 value.green_mult.epsilons.into(),
113 value.blue_mult.epsilons.into(),
114 ]);
115 }
116 if has_add {
117 to_write.extend_from_slice(&[value.red_add.into(), value.green_add.into(), value.blue_add.into()]);
118 }
119
120 let bits = get_i32_min_bit_count(to_write.clone().into_iter());
121
122 writer.write_bool_bits(has_add)?;
123 writer.write_bool_bits(has_mult)?;
124 writer.write_u32_bits(4, bits)?;
125
126 for value in to_write {
127 writer.write_i32_bits(bits, value)?;
128 }
129
130 Ok(())
131}
132
133pub fn emit_color_transform_with_alpha<W: io::Write>(
134 writer: &mut W,
135 value: &ast::ColorTransformWithAlpha,
136) -> io::Result<()> {
137 let mut bits_writer = BitsWriter::new(Vec::new());
138 emit_color_transform_with_alpha_bits(&mut bits_writer, value)?;
139 writer.write_all(&bits_writer.into_inner()?)
140}
141
142pub fn emit_color_transform_with_alpha_bits<W: WriteBits>(
143 writer: &mut W,
144 value: &ast::ColorTransformWithAlpha,
145) -> io::Result<()> {
146 let has_add = value.red_add != 0 || value.green_add != 0 || value.blue_add != 0 || value.alpha_add != 0;
147 let has_mult = value.red_mult != Sfixed8P8::ONE
148 || value.green_mult != Sfixed8P8::ONE
149 || value.blue_mult != Sfixed8P8::ONE
150 || value.alpha_mult != Sfixed8P8::ONE;
151
152 let mut to_write: Vec<i32> = Vec::new();
153 if has_mult {
154 to_write.extend_from_slice(&[
155 value.red_mult.epsilons.into(),
156 value.green_mult.epsilons.into(),
157 value.blue_mult.epsilons.into(),
158 value.alpha_mult.epsilons.into(),
159 ]);
160 }
161 if has_add {
162 to_write.extend_from_slice(&[
163 value.red_add.into(),
164 value.green_add.into(),
165 value.blue_add.into(),
166 value.alpha_add.into(),
167 ]);
168 }
169
170 let bits = get_i32_min_bit_count(to_write.clone().into_iter());
171
172 writer.write_bool_bits(has_add)?;
173 writer.write_bool_bits(has_mult)?;
174 writer.write_u32_bits(4, bits)?;
175
176 for value in to_write {
177 writer.write_i32_bits(bits, value)?;
178 }
179
180 Ok(())
181}