swf_emitter/
basic_data_types.rs

1use 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
11/// Emits a null-terminated string.
12pub 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}