51
51
much space anyway. */
52
52
#define RASTER_GFX_MSK_SIZE 0x100
54
/* A simple convenience type for defining rectangular areas. */
55
struct raster_rectangle_s {
59
typedef struct raster_rectangle_s raster_rectangle_t;
61
/* A simple convenience type for defining screen positions. */
62
struct raster_position_s {
66
typedef struct raster_position_s raster_position_t;
68
/* A simple convenience type for defining a rectangular area on the screen. */
69
struct raster_area_s {
76
typedef struct raster_area_s raster_area_t;
78
54
struct video_canvas_s;
80
struct raster_viewport_s {
82
struct video_canvas_s *canvas;
84
/* Portion of the screen displayed on the output window window.
85
FIXME: We should get this from the canvas. */
86
unsigned int width, height;
88
/* Title for the viewport. FIXME: Duplicated info from the canvas? */
91
/* Offset of the screen on the window. */
92
unsigned int x_offset, y_offset;
94
/* First and last lines shown in the output window. */
95
unsigned int first_line, last_line;
97
/* First pixel in one line of the frame buffer to be shown on the output
102
raster_rectangle_t pixel_size;
104
/* Exposure handler. */
105
void *exposure_handler;
107
/* Only display canvas if this flag is set. */
110
typedef struct raster_viewport_s raster_viewport_t;
112
struct raster_geometry_s {
113
/* Total size of the screen, including borders and unused areas.
114
(SCREEN_WIDTH, SCREEN_HEIGHT) */
115
raster_rectangle_t screen_size;
117
/* Size of the graphics area (i.e. excluding borders and unused areas.
118
(SCREEN_XPIX, SCREEN_YPIX) */
119
raster_rectangle_t gfx_size;
121
/* Size of the text area. (SCREEN_TEXTCOLS) */
122
raster_rectangle_t text_size;
124
/* Position of the graphics area. (SCREEN_BORDERWIDTH,
125
SCREEN_BORDERHEIGHT) */
126
raster_position_t gfx_position;
128
/* If nonzero, `gfx_position' is expected to be moved around when poking
129
to the chip registers. */
132
/* FIXME: Bad names. */
133
unsigned int first_displayed_line, last_displayed_line;
135
unsigned int extra_offscreen_border;
137
typedef struct raster_geometry_s raster_geometry_t;
139
56
struct raster_cache_s;
57
struct raster_canvas_area_s;
58
struct raster_changes_all_s;
140
59
struct raster_modes_s;
60
struct raster_resource_chip_s;
141
61
struct raster_sprite_status_s;
144
raster_viewport_t viewport;
146
raster_geometry_t geometry;
64
struct viewport_s *viewport;
65
struct geometry_s *geometry;
148
67
struct raster_modes_s *modes;
150
69
struct raster_sprite_status_s *sprite_status;
153
raster_changes_t background;
154
raster_changes_t foreground;
155
raster_changes_t border;
156
raster_changes_t next_line;
157
int have_on_this_line;
166
struct video_frame_buffer_s *frame_buffer;
167
PIXEL *frame_buffer_ptr;
169
/* This is a temporary frame buffer line used for sprite collision
71
struct raster_changes_all_s *changes;
74
struct video_canvas_s *canvas;
77
struct raster_resource_chip_s *raster_resource_chip;
79
/* Pointer to the draw buffer. */
80
BYTE *draw_buffer_ptr;
82
/* This is a temporary draw buffer line used for sprite collision
170
83
checking without drawing to the real frame buffer. */
171
PIXEL *fake_frame_buffer_line;
173
/* Palette used for drawing. */
174
struct palette_s *palette;
176
/* This is a bit mask representing each pixel on the screen (1 =
177
foreground, 0 = background) and is used both for sprite-background
178
collision checking and background sprite drawing. When cache is
179
turned on, a cached mask for each line is used instead (see
180
`raster_cache_t.gfx_msk'). */
181
BYTE gfx_msk[RASTER_GFX_MSK_SIZE];
183
/* This is a temporary graphics mask used for sprite collision checking
184
without drawing to the real frame buffer, and is set up to be always
185
filled with zeroes. */
186
BYTE zero_gfx_msk[RASTER_GFX_MSK_SIZE];
84
BYTE *fake_draw_buffer_line;
188
86
/* Smooth scroll values for the graphics (not the whole screen). */
189
87
int xsmooth, ysmooth;
89
/* Number of pixels at a xsmooth shift to the left. */
90
int xsmooth_shift_left;
92
/* Number of pixels at a xsmooth shift to the right. */
93
int xsmooth_shift_right;
191
95
/* If nonzero, we should skip the next frame. (used for automatic refresh
242
155
unsigned int num_cached_lines;
244
157
/* Area to update. */
245
raster_area_t update_area;
247
unsigned int do_double_scan;
249
/* Function to call when internal tables have to be refreshed after a
250
mode change. E.g. vicii::init_drawing_tables(). NULL allowed */
251
void (*refresh_tables)(void);
158
struct raster_canvas_area_s *update_area;
160
/* This is a bit mask representing each pixel on the screen (1 =
161
foreground, 0 = background) and is used both for sprite-background
162
collision checking and background sprite drawing. When cache is
163
turned on, a cached mask for each line is used instead (see
164
`raster_cache_t.gfx_msk'). */
165
BYTE gfx_msk[RASTER_GFX_MSK_SIZE];
167
/* This is a temporary graphics mask used for sprite collision checking
168
without drawing to the real frame buffer, and is set up to be always
169
filled with zeroes. */
170
BYTE zero_gfx_msk[RASTER_GFX_MSK_SIZE];
172
int (*line_changes)(struct raster_s *, unsigned int *, unsigned int *);
173
void (*draw_sprites_when_cache_enabled)(struct raster_s *,
174
struct raster_cache_s *);
175
int (*fill_sprite_cache)(struct raster_s *, struct raster_cache_s *,
176
unsigned int *, unsigned int *);
253
180
typedef struct raster_s raster_t;
255
182
struct screenshot_s;
257
#define RASTER_PIXEL(raster, c) (raster)->pixel_table.sing[(c)]
259
/* FIXME: MSDOS does not need double or quad pixel.
260
`ifdef' them out once all video chips actually honour this. */
262
#define RASTER_PIXEL2(raster, c) (raster)->pixel_table.doub[(c)]
263
#define RASTER_PIXEL4(raster, c) (raster)->pixel_table.quad[(c)]
265
extern int raster_init(raster_t *raster, unsigned int num_modes,
266
unsigned int num_sprites);
184
extern int raster_init(raster_t *raster, unsigned int num_modes);
185
extern void raster_shutdown(raster_t *raster);
267
186
extern raster_t *raster_new(unsigned int num_modes, unsigned int num_sprites);
268
187
extern void raster_reset(raster_t *raster);
269
188
extern int raster_realize(raster_t *raster);
270
extern void raster_set_exposure_handler(raster_t *raster,
271
void *exposure_handler);
272
extern void raster_set_table_refresh_handler(raster_t *raster,
273
void (*handler)(void));
189
extern void raster_canvas_init(raster_t *raster);
274
190
extern void raster_set_geometry(raster_t *raster,
191
unsigned int canvas_width,
192
unsigned int canvas_height,
275
193
unsigned int screen_width,
276
194
unsigned int screen_height,
277
195
unsigned int gfx_width,
283
201
int gfx_area_moves,
284
202
unsigned int first_displayed_line,
285
203
unsigned int last_displayed_line,
286
unsigned int extra_offscreen_border);
287
extern void raster_invalidate_cache(raster_t *raster,
288
unsigned int screen_height);
289
extern void raster_resize_viewport(raster_t *raster,
290
unsigned int width, unsigned int height);
291
extern void raster_set_pixel_size(raster_t *raster, unsigned int width,
292
unsigned int height, int videorendermode);
293
extern void raster_emulate_line(raster_t *raster);
204
unsigned int extra_offscreen_border_left,
205
unsigned int extra_offscreen_border_right);
206
extern void raster_new_cache(raster_t *raster, unsigned int screen_height);
207
extern void raster_draw_buffer_ptr_update(raster_t *raster);
294
208
extern void raster_force_repaint(raster_t *raster);
295
extern int raster_set_palette(raster_t *raster, struct palette_s *palette);
296
extern void raster_set_title(raster_t *raster, const char *title);
209
extern void raster_set_title(raster_t *raster, const char *name);
297
210
extern void raster_skip_frame(raster_t *raster, int skip);
298
211
extern void raster_enable_cache(raster_t *raster, int enable);
299
extern void raster_enable_double_scan(raster_t *raster, int enable);
300
extern void raster_enable_double_size(raster_t *raster, int enablex, int enabley);
301
212
extern void raster_mode_change(void);
302
extern void raster_rebuild_tables(raster_t *raster);
303
extern void raster_handle_end_of_frame(raster_t *raster);
304
213
extern void raster_set_canvas_refresh(raster_t *raster, int enable);
305
extern int raster_screenshot(raster_t *raster, struct screenshot_s *screenshot);
306
extern void raster_free(raster_t *raster);
214
extern void raster_screenshot(raster_t *raster,
215
struct screenshot_s *screenshot);
216
extern void raster_async_refresh(raster_t *raster,
217
struct canvas_refresh_s *ref);
218
extern int raster_calc_frame_buffer_width(raster_t *raster);
219
extern void raster_line_changes_init(raster_t *raster);
220
extern void raster_line_changes_sprite_init(raster_t *raster);
309
222
/* Inlined functions. These need to be *fast*. */
311
inline static void raster_add_int_change_next_line(raster_t *raster,
315
if (raster->skip_frame)
318
raster_changes_add_int(&raster->changes.next_line, 0, ptr, new_value);
321
inline static void raster_add_ptr_change_next_line(raster_t *raster,
325
if (raster->skip_frame)
328
raster_changes_add_ptr(&raster->changes.next_line, 0, ptr, new_value);
331
inline static void raster_add_int_change_foreground(raster_t *raster,
336
if (raster->skip_frame || char_x <= 0)
338
else if (char_x < (int)raster->geometry.text_size.width) {
339
raster_changes_add_int(&raster->changes.foreground,
340
char_x, ptr, new_value);
341
raster->changes.have_on_this_line = 1;
343
raster_add_int_change_next_line(raster, ptr, new_value);
347
inline static void raster_add_ptr_change_foreground(raster_t *raster,
352
if (raster->skip_frame || char_x <= 0)
354
else if (char_x < (int)raster->geometry.text_size.width) {
355
raster_changes_add_ptr(&raster->changes.foreground,
356
char_x, ptr, new_value);
357
raster->changes.have_on_this_line = 1;
359
raster_add_ptr_change_next_line(raster, ptr, new_value);
363
inline static void raster_add_int_change_background(raster_t *raster,
368
if (raster->skip_frame || raster_x <= 0)
370
else if (raster_x < (int)raster->geometry.screen_size.width) {
371
raster_changes_add_int(&raster->changes.background,
372
raster_x, ptr, new_value);
373
raster->changes.have_on_this_line = 1;
375
raster_add_int_change_next_line(raster, ptr, new_value);
379
inline static void raster_add_ptr_change_background(raster_t *raster,
384
if (raster->skip_frame || raster_x <= 0)
386
else if (raster_x < (int)raster->geometry.screen_size.width) {
387
raster_changes_add_ptr(&raster->changes.background,
388
raster_x, ptr, new_value);
389
raster->changes.have_on_this_line = 1;
391
raster_add_ptr_change_next_line(raster, ptr, new_value);
395
inline static void raster_add_int_change_border(raster_t *raster,
400
if (raster->skip_frame || raster_x <= 0)
402
else if (raster_x < (int)raster->geometry.screen_size.width) {
403
raster_changes_add_int(&raster->changes.border,
404
raster_x, ptr, new_value);
405
raster->changes.have_on_this_line = 1;
407
raster_add_int_change_next_line(raster, ptr, new_value);
411
inline static void vid_memcpy(PIXEL *dst, PIXEL *src, unsigned int count)
413
memcpy(dst, src, count * sizeof(PIXEL));
416
#if VIDEO_DISPLAY_DEPTH > 8
418
inline static void vid_memset(PIXEL *dst, PIXEL value, unsigned int count)
422
for (i = 0; i < count; i++)
428
inline static void vid_memset(PIXEL *dst, PIXEL value, unsigned int count)
430
memset(dst, value, count);
224
inline static void raster_changes_next_line_add_int(raster_t *raster,
228
raster_changes_add_int(raster->changes->next_line, 0, ptr, new_value);
231
inline static void raster_changes_next_line_add_ptr(raster_t *raster,
235
raster_changes_add_ptr(raster->changes->next_line, 0, ptr, new_value);
238
inline static void raster_changes_foreground_add_int(raster_t *raster,
245
else if (char_x < (int)raster->geometry->text_size.width) {
246
raster_changes_add_int(raster->changes->foreground,
247
char_x, ptr, new_value);
248
raster->changes->have_on_this_line = 1;
250
raster_changes_next_line_add_int(raster, ptr, new_value);
254
inline static void raster_changes_foreground_add_ptr(raster_t *raster,
261
else if (char_x < (int)raster->geometry->text_size.width) {
262
raster_changes_add_ptr(raster->changes->foreground,
263
char_x, ptr, new_value);
264
raster->changes->have_on_this_line = 1;
266
raster_changes_next_line_add_ptr(raster, ptr, new_value);
270
inline static void raster_changes_background_add_int(raster_t *raster,
277
else if (raster_x < (int)raster->geometry->screen_size.width) {
278
raster_changes_add_int(raster->changes->background,
279
raster_x, ptr, new_value);
280
raster->changes->have_on_this_line = 1;
282
raster_changes_next_line_add_int(raster, ptr, new_value);
286
inline static void raster_changes_background_add_ptr(raster_t *raster,
293
else if (raster_x < (int)raster->geometry->screen_size.width) {
294
raster_changes_add_ptr(raster->changes->background,
295
raster_x, ptr, new_value);
296
raster->changes->have_on_this_line = 1;
298
raster_changes_next_line_add_ptr(raster, ptr, new_value);
302
inline static void raster_changes_border_add_int(raster_t *raster,
309
else if (raster_x < (int)raster->geometry->screen_size.width) {
310
raster_changes_add_int(raster->changes->border,
311
raster_x, ptr, new_value);
312
raster->changes->have_on_this_line = 1;
314
raster_changes_next_line_add_int(raster, ptr, new_value);
318
inline static void raster_changes_sprites_add_int(raster_t *raster,
323
if (raster_x < -(int)raster->geometry->extra_offscreen_border_left)
325
else if (raster_x < (int)(raster->geometry->screen_size.width
326
+ raster->geometry->extra_offscreen_border_right)) {
327
raster_changes_add_int(raster->changes->sprites,
328
raster_x, ptr, new_value);
329
raster->changes->have_on_this_line = 1;
331
raster_changes_next_line_add_int(raster, ptr, new_value);
435
#endif /* _RASTER_H */