241
static int check_for_major_changes_and_update(raster_t *raster,
242
unsigned int *changed_start,
243
unsigned int *changed_end)
245
raster_cache_t *cache;
246
unsigned int video_mode;
249
video_mode = raster_line_get_real_mode(raster);
251
cache = &(raster->cache)[raster->current_line];
252
line = raster->current_line - raster->geometry->gfx_position.y
253
- raster->ysmooth - 1;
256
|| raster->dont_cache
258
|| cache->xsmooth != raster->xsmooth
259
|| cache->video_mode != video_mode
261
|| cache->ycounter != raster->ycounter
262
|| cache->border_color != raster->border_color
263
|| cache->display_xstart != raster->display_xstart
264
|| cache->display_xstop != raster->display_xstop
265
|| (cache->open_right_border && !raster->open_right_border)
266
|| (cache->open_left_border && !raster->open_left_border)
267
|| cache->xsmooth_color != raster->xsmooth_color
268
|| cache->idle_background_color
269
!= raster->idle_background_color) {
271
unsigned int changed_start_char, changed_end_char;
275
cache->xsmooth = raster->xsmooth;
276
cache->video_mode = video_mode;
278
cache->ycounter = raster->ycounter;
279
cache->border_color = raster->border_color;
280
cache->display_xstart = raster->display_xstart;
281
cache->display_xstop = raster->display_xstop;
282
cache->open_right_border = raster->open_right_border;
283
cache->open_left_border = raster->open_left_border;
284
cache->xsmooth_color = raster->xsmooth_color;
285
cache->idle_background_color = raster->idle_background_color;
287
/* Fill the space between the border and the graphics with the
288
background color (necessary if `xsmooth' is != 0). */
290
fill_background(raster);
292
if (raster->sprite_status != NULL)
293
(raster->fill_sprite_cache)(raster, cache,
297
r = raster_modes_fill_cache(raster->modes,
301
&changed_end_char, 1);
303
/* [ `changed_start' ; `changed_end' ] now covers the whole line, as
304
we have called fill_cache() with `1' as the last parameter (no
306
raster_modes_draw_line_cached(raster->modes, video_mode,
311
if (raster->sprite_status != NULL)
312
(raster->draw_sprites_when_cache_enabled)(raster, cache);
315
*changed_end = raster->geometry->screen_size.width - 1;
317
raster_line_draw_borders(raster);
326
inline static void handle_visible_line_with_cache(raster_t *raster)
242
static void handle_visible_line_with_cache(raster_t *raster)
328
244
int needs_update;
329
245
unsigned int changed_start, changed_end;
334
250
/* Check for "major" changes first. If there is any, just write straight
335
251
to the cache without any comparisons and redraw the whole line. */
336
needs_update = check_for_major_changes_and_update(raster,
252
/* check_for_major_changes_and_update() is embedded here because of some
255
unsigned int video_mode;
258
video_mode = raster_line_get_real_mode(raster);
260
line = raster->current_line - raster->geometry->gfx_position.y
261
- raster->ysmooth - 1;
264
|| raster->dont_cache
266
|| cache->xsmooth != raster->xsmooth
267
|| cache->video_mode != video_mode
269
|| cache->ycounter != raster->ycounter
270
|| cache->border_color != raster->border_color
271
|| cache->display_xstart != raster->display_xstart
272
|| cache->display_xstop != raster->display_xstop
273
|| (cache->open_right_border && !raster->open_right_border)
274
|| (cache->open_left_border && !raster->open_left_border)
275
|| cache->xsmooth_color != raster->xsmooth_color
276
|| cache->idle_background_color
277
!= raster->idle_background_color) {
279
unsigned int changed_start_char, changed_end_char;
283
cache->xsmooth = raster->xsmooth;
284
cache->video_mode = video_mode;
286
cache->ycounter = raster->ycounter;
287
cache->border_color = raster->border_color;
288
cache->display_xstart = raster->display_xstart;
289
cache->display_xstop = raster->display_xstop;
290
cache->open_right_border = raster->open_right_border;
291
cache->open_left_border = raster->open_left_border;
292
cache->xsmooth_color = raster->xsmooth_color;
293
cache->idle_background_color = raster->idle_background_color;
295
/* Fill the space between the border and the graphics with the
296
background color (necessary if `xsmooth' is != 0). */
298
fill_background(raster);
300
if (raster->sprite_status != NULL)
301
(raster->fill_sprite_cache)(raster, cache,
305
r = raster_modes_fill_cache(raster->modes,
309
&changed_end_char, 1);
311
/* [ `changed_start' ; `changed_end' ] now covers the whole line, as
312
we have called fill_cache() with `1' as the last parameter (no
314
raster_modes_draw_line_cached(raster->modes, video_mode,
319
if (raster->sprite_status != NULL)
320
(raster->draw_sprites_when_cache_enabled)(raster, cache);
323
changed_end = raster->geometry->screen_size.width - 1;
325
raster_line_draw_borders(raster);
339
333
if (!needs_update) {
340
334
/* There are no `major' changes: try to do some optimization. */
341
335
needs_update = update_for_minor_changes(raster,
476
470
raster_changes_apply(changes->sprites, i);
478
if (xs <= (int)(geometry->screen_size.width
472
if (xs <= (int)(geometry->screen_size.width
479
473
+ geometry->extra_offscreen_border_right) - 1)
480
draw_sprites_partial(raster, xs, geometry->screen_size.width
474
draw_sprites_partial(raster, xs, geometry->screen_size.width
481
475
+ geometry->extra_offscreen_border_right - 1);