ScummVM API documentation
sprite.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef MADS_CORE_SPRITE_H
23 #define MADS_CORE_SPRITE_H
24 
25 #include "common/stream.h"
26 #include "mads/core/color.h"
27 #include "mads/core/loader.h"
28 
29 namespace MADS {
30 
31 #define misc_largest_block misc[0]
32 /* LONG ... uses misc[1] also */
33 #define misc_is_a_walker misc[2]
34 
35 /* Flags to be passed to sprite_series_load(). Note that all of the */
36 /* PAL_MAP_... flags can also be passed to this routine (see pal.mac). */
37 
38 #define SPRITE_LOAD_TRANSLATE 0x0001 /* Translate to 16 colors */
39 #define SPRITE_LOAD_HEADER_ONLY 0x0002 /* Load nothing but header */
40 #define SPRITE_LOAD_WALKER_INFO 0x0004 /* Load walker information */
41 #define SPRITE_LOAD_SPINNING_OBJECT 0x0008 /* Load spinning object */
42 
43 
44 /* Sprite ID masking values for mirroring */
45 
46 #define SPRITE_MASK 0x7fff /* Sprite ID mask */
47 #define MIRROR_MASK 0x8000 /* Sprite mirror mask */
48 
49 #define HALF_MIRROR_MASK 0x80 /* Mirror mask for bytes */
50 #define HALF_SPRITE_MASK 0x7f /* Sprite mask for bytes */
51 
52 
53 /* Sprite line packing types: */
54 #define SS_DUMP 251 /* Defines a line as DUMP type */
55 #define SS_RLE 253 /* Defines a line as RLE type */
56 #define SS_IRLE 254 /* Defines a line as IRLE type */
57 #define SS_LASTVALID 252 /* Last valid non-macro byte value */
58 
59 /* Control characters: */
60 #define SS_EOI 252 /* End Of Image */
61 #define SS_EOL 255 /* End of line */
62 #define SS_RUN 254 /* Marks begining of a run in IRLE */
63 #define SS_SKIP 253 /* Used as SKIP color */
64  /* -- Never set SS_SKIP to 255! -- (RBR) */
65  /* -- Would explode color list crap -- */
66  /* -- SS_SKIP must not = COLOR_TRANSPARENT */
67 
68 #define SPRITE_COLOR_TABLE_SIZE 252
69 
70 #define MAX_SECONDARY 16 /* Maximum secondary walker sequences */
71 
72 /* Legal values for x->source_type */
73 #define SS_LBM 1 /* Source file is one frame LBM */
74 #define SS_LBM_MULT 2 /* Source file is several LBMs */
75 #define SS_ANM 3 /* Source file is an .ANM file */
76 #define SS_FLI 4 /* Source file is a .FLI file */
77 
78 /* Legal values for x->base_mode */
79 #define SS_FIRSTFRAME 1 /* If relative to first frame of ANM */
80 #define SS_STATICLBM 2 /* If relative to an LBM */
81 #define SS_BACKCOL 3 /* If relative to background color */
82 #define SS_INDIVIDUAL 4 /* Individual frames relative to first */
83 #define SS_PANNING_ANM 5 /* Relative to panning ANM */
84 #define SS_PANNING_FLI 6 /* Relative to panning FLI */
85 
86 /* STRUCTURES FOR ALL SPRITE LEVELS */
87 struct WalkerInfo {
88  uint16 num_primary; /* Number of primary sequence frames */
89  uint16 num_secondary; /* Number of secondary sequences */
90  uint16 sequence_start[MAX_SECONDARY]; /* Secondary sequence start frames */
91  uint16 sequence_stop[MAX_SECONDARY]; /* Secondary sequence stop frames */
92  uint16 sequence_chance[MAX_SECONDARY];/* Secondary sequence probability */
93 
94  int16 velocity; /* Pixel velocity for walker */
95  byte frame_rate; /* Frame rate for walker */
96  byte center_of_gravity; /* Center of gravity displacement */
97 
98  static constexpr size_t SIZE = 2 + 2 + (2 + 2 + 2) * MAX_SECONDARY + 2 + 1 + 1;
99  void load(Load &load_handle);
100  void load(Common::SeekableReadStream *src);
101 };
102 
103 typedef WalkerInfo *WalkerInfoPtr;
104 
105 
106 /* DEVELOP TIME STRUCTURES (.DSS Files) */
107 
108 /* Develop-time definition of a single sprite */
109 
110 struct HagSprite {
111  char name[9]; /* Sprite name */
112  int x, y; /* Sprite location */
113  int xs, ys; /* Size of sprite */
114 };
115 
116 typedef HagSprite *HagSpritePtr;
117 
118 
119 /* Develop-time definition of a sprite series */
120 
121 struct HagSeries {
122  char name[80]; /* Name */
123  char desc[80]; /* Description */
124 
125  int source_type; /* Type of source data (see above) */
126  char source_name[80]; /* Filename of source file (LBM or ANM) */
127 
128  int delta_series; /* Boolean: delta vice absolute */
129 
130  int base_mode; /* Sprites relative to what? (see above) */
131  char base_lbm[80]; /* Name of LBM if base_mode==SS_STATICLBM */
132 
133  int pack_by_sprite; /* Packed by sprite vice series? */
134 
135  WalkerInfo walker; /* Walker information. */
136 
137  int offset_x_view; /* View offsets for sprites intended */
138  int offset_y_view; /* for extra-wide screen animations */
139 
140  int series_is_font; /* Flag if series is a font */
141 
142  int misc[16]; /* 16 words of miscellaneous data */
143 
144  int num_sprites; /* Number of sprites in series */
145 
146  byte transparent; /* Transparent color */
147  byte border; /* Border color */
148 
149  int num_translated; /* Number of colors translated */
150  int color_list_valid; /* Color list is valid flag */
151 
152  ColorList color_list; /* Series master color list */
153 
154  HagSprite index[1]; /* Sprites */
155 };
156 
157 typedef HagSeries *HagSeriesPtr;
158 
159 
160 /* LOADABLE FILE STRUCTURES (.SS files) */
161 
165 struct FileSprite {
166  uint32 file_offset; /* Location of sprite data in file */
167  uint32 memory_needed; /* Memory needed to hold sprite data */
168  int16 x, y;
169  int16 xs, ys;
170 
171  static constexpr size_t SIZE = 4 + 4 + 2 + 2 + 2 + 2;
172  void load(Common::SeekableReadStream *src);
173 };
174 
175 typedef FileSprite *FileSpritePtr;
176 
177 
181 struct FileSeries {
182  byte pack_by_sprite; /* Overall series packing strategy */
183  byte compression; /* Type of compression */
184  uint16 delta_series; /* Flag if series is a delta series */
185  uint16 base_mode; /* Base mode optimization type */
186 
187  uint16 misc[16]; /* Miscellaneous data for updates */
188 
189  uint16 num_sprites; /* Number of sprites in series */
190 
191  WalkerInfo walker; /* Walker information */
192 
193  uint16 offset_x_view; /* View offsets for sprites intended */
194  uint16 offset_y_view; /* for extra-wide animations */
195 
196  uint32 total_data_size; /* Total uncompressed data size */
197  FileSprite index[1]; /* Sprite records begin here */
198 
199  static constexpr int HEADER_SIZE = 1 + 1 + 2 + 2 + 2 * 16 + 2 +
200  WalkerInfo::SIZE + 2 + 2 + 4;
201  bool loadHeader(Load &load_handle);
202 };
203 
204 typedef FileSeries *FileSeriesPtr;
205 
206 
207 /* RUNTIME STRUCTURES -- MEMORY */
208 
209 /* Global paging information for a stream-loaded sprite series */
210 
212  byte paging_source; /* Is source EMS, XMS, or hard disk? */
213  byte packing_mode; /* Type of compression involved */
214  Common::SeekableReadStream *handle; /* File handle for hard disk load */
215  long base_sprite_offset; /* Base file offset for sprite data */
216 };
217 
219 
220 
221 /* Sprite-specific paging informatio for stream-loaded series */
222 
224  long file_offset; /* Offset in file for sprite's data */
225  long memory_needed; /* Amount of memory needed for sprite */
226 };
227 
229 
230 
231 /* Runtime memory structure for an individual sprite */
232 
233 struct Sprite {
234  byte *data; /* Pointer to sprite's actual data */
235  int x, y; /* Home position on screen */
236  int xs, ys; /* Sprite box size */
237 };
238 
239 typedef Sprite *SpritePtr;
240 
241 
242 /* Runtime memory structure for a sprite series */
243 
244 struct Series {
245  int delta_series; /* Flag if series is a delta series */
246  int base_mode; /* Series base mode optimization scheme */
247 
248  int num_sprites; /* Number of sprites in series */
249 
250  int color_handle; /* Palette handle for loaded colors */
251  int misc[16]; /* Miscellaneous data for future updates */
252 
253  int offset_x_view; /* View offsets for sprites intended for */
254  int offset_y_view; /* ... extra wide background pictures. */
255 
256  byte pack_by_sprite; /* Overall sprite packing strategy */
257  SpritePageInfoPtr page_info; /* Pointer to global paging data, if any */
258  SpritePageTablePtr page_table; /* Pointer to sprite paging table,if any */
259  byte *color_table; /* Pointer to sprite color table ,if any */
260  byte *arena; /* Pointer to sprite data load arena,if any */
261 
262  WalkerInfoPtr walker; /* Pointer to walker information ,if any */
263 
264  Sprite index[1]; /* Individual sprite records begin here */
265 };
266 
267 typedef Series *SeriesPtr;
268 
269 #define SS_ERR_OPENFILE -1
270 #define SS_ERR_READFILE -2
271 #define SS_ERR_WRITEFILE -3
272 #define SS_ERR_NOMOREMEMORY -4
273 #define SS_ERR_MAKEDIALOG -5
274 #define SS_ERR_PALETTEMISMATCH -6
275 #define SS_ERR_BOUNDARY -7
276 #define SS_ERR_TOOMANYSPRITES -8
277 #define SS_ERR_TOOMANYCOLORS -9
278 #define SS_ERR_BADDEFINITION -10
279 #define SS_ERR_OLDDEFINITION -11
280 
281 
282 extern byte *sprite_force_memory;
283 extern long sprite_force_size;
284 extern int sprite_error;
285 
286 
287 extern void sprite_draw(SeriesPtr series, int id, Buffer *buf, int target_x, int target_y);
288 extern void sprite_draw_scaled(SeriesPtr series, int id, Buffer *buf,
289  int target_x, int target_y, int scale_factor);
290 extern void sprite_draw_3d_scaled(SeriesPtr series, int id, Buffer *buf, Buffer *attr,
291  int target_x, int target_y, int target_depth, int scale_factor);
292 extern void sprite_draw_3d_big(SeriesPtr series, int id, Buffer *buf, Buffer *attr,
293  int target_x, int target_y, int target_depth, int view_port_x, int view_port_y);
294 extern void sprite_draw_3d_scaled_big(SeriesPtr series, int id, Buffer *buf, Buffer *attr,
295  int target_x, int target_y, int target_depth, int scale_factor,
296  int view_port_x, int view_port_y);
297 extern void sprite_draw_3d_x16(SeriesPtr series, int id, Buffer *buf, Buffer *attr,
298  int target_x, int target_y, int target_depth);
299 extern void sprite_draw_3d_scaled_x16(SeriesPtr series, int id, Buffer *buf, Buffer *attr,
300  int target_x, int target_y, int target_depth, int scale_factor);
301 extern void sprite_draw_3d_big_x16(SeriesPtr series, int id, Buffer *buf, Buffer *attr,
302  int target_x, int target_y, int target_depth, int view_port_x, int view_port_y);
303 extern void sprite_draw_3d_scaled_big_x16(SeriesPtr series, int id, Buffer *buf, Buffer *attr,
304  int target_x, int target_y, int target_depth, int scale_factor,
305  int view_port_x, int view_port_y);
306 extern void sprite_draw_x16(SeriesPtr series, int id, Buffer *buf, int target_x, int target_y);
307 extern void sprite_draw_interface(SeriesPtr series, int id, Buffer *buf, int target_x, int target_y);
308 extern void sprite_draw_3d_scaled_to_attr(SeriesPtr series, int id, Buffer *buf, Buffer *attr,
309  int target_x, int target_y, int target_depth, int scale_factor,
310  int view_port_x, int view_port_y);
311 extern void sprite_draw_3d_scaled_mono(SeriesPtr series, int id, Buffer *buf, Buffer *attr,
312  int target_x, int target_y, int target_depth, int scale_factor, byte color);
313 extern SeriesPtr sprite_series_load(const char *filename, int load_flags);
314 extern void sprite_get_scaled_matte(SeriesPtr series, int id, int target_x, int target_y,
315  int scale_factor, SpritePtr matte);
316 
323 word sprite_pack_line_rle(byte *target, Buffer *source, byte *palette_map, byte transparent,
324  int x1, int x2, int y);
325 
333 word sprite_pack_line_irle(byte *target, Buffer *source,
334  byte *palette_map, byte transparent, int x1, int x2, int y);
335 
336 extern void sprite_set_bounds(HagSpritePtr sprite, int x, int y, int xs, int ys);
337 
342 extern void sprite_merge_background(Buffer *source, Buffer *background, byte transparent);
343 
351 extern void sprite_delta_compute(HagSpritePtr sprite, Buffer *source, Buffer *delta);
352 
359 extern void sprite_remove_non_delta(Buffer *source, Buffer *delta, byte transparent);
360 
365 long sprite_pack_image(byte *target, FileSpritePtr sprite, Buffer *source,
366  byte *palette_map, byte transparent);
367 
368 extern void sprite_color_translate(SeriesPtr series, ColorListPtr list);
369 extern void sprite_single_color_translate(SeriesPtr series, int id);
370 extern int sprite_data_load(SeriesPtr series, int id, byte *target);
371 
372 extern void dont_frag_the_palette();
373 extern void go_ahead_and_frag_the_palette();
374 extern void sprite_free(SeriesPtr *series, int free_memory);
375 
376 extern void init_sprite();
377 
378 } // namespace MADS
379 
380 #endif
Definition: sprite.h:223
Definition: sprite.h:165
Definition: general.h:57
Definition: sprite.h:110
Definition: stream.h:745
Definition: sprite.h:181
Definition: color.h:78
Definition: sprite.h:244
Definition: loader.h:35
Definition: sprite.h:233
Definition: anim_timer.h:27
Definition: sprite.h:121
Definition: sprite.h:87
Definition: sprite.h:211