wolfrpg_map_parser/command/picture_command/
show.rs

1use crate::byte_utils::{as_u32_le, parse_string};
2use crate::common::u32_or_string::U32OrString;
3use crate::command::picture_command::display_type::DisplayType;
4use crate::command::picture_command::options::Options;
5use crate::byte_utils::parse_optional_string;
6#[cfg(feature = "serde")]
7use serde::{Serialize, Deserialize};
8use state::State;
9
10pub mod state;
11pub mod base;
12pub mod free_transform;
13pub mod delay;
14mod parser;
15pub mod zoom;
16pub mod color_values;
17mod range_fields;
18mod color_values_fields;
19mod zoom_fields;
20mod free_transform_fields;
21mod delay_fields;
22pub mod range;
23mod colors_fields;
24pub mod colors;
25mod parsable_fields;
26
27#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
28#[derive(PartialEq, Clone)]
29pub struct Show {
30    options: Options,
31    picture: u32,
32    process_time: u32,
33    division_width: u32,
34    division_height: u32,
35    pattern: u32,
36    opacity: u32,
37    zoom: u32,
38    angle: u32,
39    state: State,
40    filename: Option<U32OrString>,
41    string: Option<String>,
42}
43
44type StateParser = fn(&[u8], &Options) -> (usize, Option<u32>, State);
45
46impl Show {
47    fn parse(bytes: &[u8], parse_state: StateParser) -> (usize, Self) {
48        let mut offset: usize = 0;
49
50        let options: u32 = as_u32_le(&bytes[offset..offset+4]);
51        let options: Options = Options::new(options);
52        offset += 4;
53
54        let picture: u32 = as_u32_le(&bytes[offset..offset+4]);
55        offset += 4;
56
57        let process_time: u32 = as_u32_le(&bytes[offset..offset+4]);
58        offset += 4;
59
60        let division_width: u32 = as_u32_le(&bytes[offset..offset+4]);
61        offset += 4;
62
63        let division_height: u32 = as_u32_le(&bytes[offset..offset+4]);
64        offset += 4;
65
66        let pattern: u32 = as_u32_le(&bytes[offset..offset+4]);
67        offset += 4;
68
69        let opacity: u32 = as_u32_le(&bytes[offset..offset+4]);
70        offset += 4;
71
72        let zoom: u32 = as_u32_le(&bytes[offset+8..offset+12]);
73        let angle: u32 = as_u32_le(&bytes[offset+12..offset+16]);
74
75        let (bytes_read, filename_variable, state): (usize, Option<u32>, State)
76            = parse_state(&bytes[offset..], &options);
77        offset += bytes_read;
78
79        let (bytes_read, string_value): (usize, Option<String>)
80            = Self::parse_string_value(&bytes[offset..]);
81        offset += bytes_read;
82
83        let (filename, string): (Option<U32OrString>, Option<String>)
84            = Self::make_filename_and_string(string_value, filename_variable, &options);
85
86        offset += 1; // Command end signature
87
88        (offset, Self {
89            options,
90            picture,
91            process_time,
92            division_width,
93            division_height,
94            pattern,
95            opacity,
96            zoom,
97            angle,
98            state,
99            filename,
100            string
101        })
102    }
103    fn parse_string_value(bytes: &[u8]) -> (usize, Option<String>) {
104        let mut offset: usize = 0;
105
106        let is_filename_string: bool = bytes[offset] != 0;
107        offset += 1;
108
109        let string_value: Option<String>
110            = parse_optional_string!(bytes, offset, is_filename_string);
111
112        (offset, string_value)
113    }
114
115    fn make_filename_and_string(string_value: Option<String>, filename_variable: Option<u32>,
116                                    options: &Options) -> (Option<U32OrString>, Option<String>) {
117        let (filename, string): (Option<String>, Option<String>) = match *options.display_type() {
118            DisplayType::StringAsPicture => (None, string_value),
119            _ => (string_value, None)
120        };
121
122        let filename: Option<U32OrString> = match filename {
123            Some(filename) => Some(U32OrString::String(filename)),
124            None => filename_variable.map(U32OrString::U32)
125        };
126
127        (filename, string)
128    }
129
130    pub(crate) fn parse_base(bytes: &[u8]) -> (usize, Self) {
131        Self::parse(bytes, State::parse_base)
132    }
133
134    pub(crate) fn parse_colors(bytes: &[u8]) -> (usize, Self) {
135        Self::parse(bytes, State::parse_colors)
136    }
137
138    pub(crate) fn parse_delay(bytes: &[u8]) -> (usize, Self) {
139        Self::parse(bytes, State::parse_delay)
140    }
141
142    pub(crate) fn parse_range(bytes: &[u8]) -> (usize, Self) {
143        Self::parse(bytes, State::parse_range)
144    }
145
146    pub(crate) fn parse_color_values(bytes: &[u8]) -> (usize, Self) {
147        Self::parse(bytes, State::parse_color_values)
148    }
149
150    pub(crate) fn parse_zoom(bytes: &[u8]) -> (usize, Self) {
151        Self::parse(bytes, State::parse_zoom)
152    }
153
154    pub(crate) fn parse_free_transform(bytes: &[u8]) -> (usize, Self) {
155        Self::parse(bytes, State::parse_free_transform)
156    }
157
158    pub fn options(&self) -> &Options {
159        &self.options
160    }
161
162    pub fn options_mut(&mut self) -> &mut Options {
163        &mut self.options
164    }
165
166    pub fn picture(&self) -> u32 {
167        self.picture
168    }
169
170    pub fn picture_mut(&mut self) -> &mut u32 {
171        &mut self.picture
172    }
173
174    pub fn process_time(&self) -> u32 {
175        self.process_time
176    }
177
178    pub fn process_time_mut(&mut self) -> &mut u32 {
179        &mut self.process_time
180    }
181
182    pub fn division_width(&self) -> u32 {
183        self.division_width
184    }
185
186    pub fn division_width_mut(&mut self) -> &mut u32 {
187        &mut self.division_width
188    }
189
190    pub fn division_height(&self) -> u32 {
191        self.division_height
192    }
193
194    pub fn division_height_mut(&mut self) -> &mut u32 {
195        &mut self.division_height
196    }
197
198    pub fn pattern(&self) -> u32 {
199        self.pattern
200    }
201
202    pub fn pattern_mut(&mut self) -> &mut u32 {
203        &mut self.pattern
204    }
205
206    pub fn opacity(&self) -> u32 {
207        self.opacity
208    }
209
210    pub fn opacity_mut(&mut self) -> &mut u32 {
211        &mut self.opacity
212    }
213
214    pub fn zoom(&self) -> u32 {
215        self.zoom
216    }
217
218    pub fn zoom_mut(&mut self) -> &mut u32 {
219        &mut self.zoom
220    }
221
222    pub fn angle(&self) -> u32 {
223        self.angle
224    }
225
226    pub fn angle_mut(&mut self) -> &mut u32 {
227        &mut self.angle
228    }
229
230    pub fn state(&self) -> &State {
231        &self.state
232    }
233
234    pub fn state_mut(&mut self) -> &mut State {
235        &mut self.state
236    }
237
238    pub fn filename(&self) -> &Option<U32OrString> {
239        &self.filename
240    }
241
242    pub fn filename_mut(&mut self) -> &mut Option<U32OrString> {
243        &mut self.filename
244    }
245
246    pub fn string(&self) -> &Option<String> {
247        &self.string
248    }
249
250    pub fn string_mut(&mut self) -> &mut Option<String> {
251        &mut self.string
252    }
253}