~ubuntu-branches/ubuntu/maverick/vice/maverick

« back to all changes in this revision

Viewing changes to src/raster/raster-line.c

  • Committer: Bazaar Package Importer
  • Author(s): Zed Pobre
  • Date: 2005-02-01 11:30:26 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20050201113026-3eyakzsmmheclvjg
Tags: 1.16-1
* New upstream version
* Fixes crash on 64-bit architectures (closes: #287640)
* x128 working again (closes: #286767)
* Works fine with /dev/dsp in use (not in the main changelog, but tested
  on my local machine as working).  Presumably, this also takes care of
  the issue with dsp being held.  I'm not sure if this is because I'm
  testing it on a 2.6 kernel now -- if you are still having problems
  with /dev/dsp, please reopen the bugs. (closes: #152952, #207942)
* Don't kill Makefile.in on clean

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
#include "raster-sprite-status.h"
38
38
#include "raster-sprite.h"
39
39
#include "raster.h"
 
40
#include "viewport.h"
40
41
 
41
42
 
42
43
unsigned int raster_line_get_real_mode(raster_t *raster)
238
239
    }
239
240
}
240
241
 
241
 
static int check_for_major_changes_and_update(raster_t *raster,
242
 
                                              unsigned int *changed_start,
243
 
                                              unsigned int *changed_end)
244
 
{
245
 
    raster_cache_t *cache;
246
 
    unsigned int video_mode;
247
 
    int line;
248
 
 
249
 
    video_mode = raster_line_get_real_mode(raster);
250
 
 
251
 
    cache = &(raster->cache)[raster->current_line];
252
 
    line = raster->current_line - raster->geometry->gfx_position.y
253
 
           - raster->ysmooth - 1;
254
 
 
255
 
    if (cache->is_dirty
256
 
        || raster->dont_cache
257
 
        || cache->n != line
258
 
        || cache->xsmooth != raster->xsmooth
259
 
        || cache->video_mode != video_mode
260
 
        || cache->blank
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) {
270
 
 
271
 
        unsigned int changed_start_char, changed_end_char;
272
 
        int r;
273
 
 
274
 
        cache->n = line;
275
 
        cache->xsmooth = raster->xsmooth;
276
 
        cache->video_mode = video_mode;
277
 
        cache->blank = 0;
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;
286
 
 
287
 
        /* Fill the space between the border and the graphics with the
288
 
           background color (necessary if `xsmooth' is != 0).  */
289
 
 
290
 
        fill_background(raster);
291
 
 
292
 
        if (raster->sprite_status != NULL)
293
 
            (raster->fill_sprite_cache)(raster, cache,
294
 
                                        &changed_start_char,
295
 
                                        &changed_end_char);
296
 
 
297
 
        r = raster_modes_fill_cache(raster->modes,
298
 
                                    video_mode,
299
 
                                    cache,
300
 
                                    &changed_start_char,
301
 
                                    &changed_end_char, 1);
302
 
 
303
 
        /* [ `changed_start' ; `changed_end' ] now covers the whole line, as
304
 
           we have called fill_cache() with `1' as the last parameter (no
305
 
           check).  */
306
 
        raster_modes_draw_line_cached(raster->modes, video_mode,
307
 
                                      cache,
308
 
                                      changed_start_char,
309
 
                                      changed_end_char);
310
 
 
311
 
        if (raster->sprite_status != NULL)
312
 
            (raster->draw_sprites_when_cache_enabled)(raster, cache);
313
 
 
314
 
        *changed_start = 0;
315
 
        *changed_end = raster->geometry->screen_size.width - 1;
316
 
 
317
 
        raster_line_draw_borders(raster);
318
 
 
319
 
        return 1;
320
 
    } else {
321
 
        return 0;
322
 
    }
323
 
}
324
 
 
325
 
 
326
 
inline static void handle_visible_line_with_cache(raster_t *raster)
 
242
static void handle_visible_line_with_cache(raster_t *raster)
327
243
{
328
244
    int needs_update;
329
245
    unsigned int changed_start, changed_end;
333
249
 
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,
337
 
                                                      &changed_start,
338
 
                                                      &changed_end);
 
252
    /* check_for_major_changes_and_update() is embedded here because of some
 
253
       VAC++ bug.  */
 
254
    {
 
255
        unsigned int video_mode;
 
256
        int line;
 
257
 
 
258
        video_mode = raster_line_get_real_mode(raster);
 
259
 
 
260
        line = raster->current_line - raster->geometry->gfx_position.y
 
261
            - raster->ysmooth - 1;
 
262
 
 
263
        if (cache->is_dirty
 
264
            || raster->dont_cache
 
265
            || cache->n != line
 
266
            || cache->xsmooth != raster->xsmooth
 
267
            || cache->video_mode != video_mode
 
268
            || cache->blank
 
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) {
 
278
 
 
279
            unsigned int changed_start_char, changed_end_char;
 
280
            int r;
 
281
 
 
282
            cache->n = line;
 
283
            cache->xsmooth = raster->xsmooth;
 
284
            cache->video_mode = video_mode;
 
285
            cache->blank = 0;
 
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;
 
294
 
 
295
            /* Fill the space between the border and the graphics with the
 
296
             background color (necessary if `xsmooth' is != 0).  */
 
297
 
 
298
            fill_background(raster);
 
299
 
 
300
            if (raster->sprite_status != NULL)
 
301
                (raster->fill_sprite_cache)(raster, cache,
 
302
                                            &changed_start_char,
 
303
                                            &changed_end_char);
 
304
 
 
305
            r = raster_modes_fill_cache(raster->modes,
 
306
                                        video_mode,
 
307
                                        cache,
 
308
                                        &changed_start_char,
 
309
                                        &changed_end_char, 1);
 
310
 
 
311
            /* [ `changed_start' ; `changed_end' ] now covers the whole line, as
 
312
             we have called fill_cache() with `1' as the last parameter (no
 
313
             check).  */
 
314
            raster_modes_draw_line_cached(raster->modes, video_mode,
 
315
                                          cache,
 
316
                                          changed_start_char,
 
317
                                          changed_end_char);
 
318
 
 
319
            if (raster->sprite_status != NULL)
 
320
                (raster->draw_sprites_when_cache_enabled)(raster, cache);
 
321
 
 
322
            changed_start = 0;
 
323
            changed_end = raster->geometry->screen_size.width - 1;
 
324
 
 
325
            raster_line_draw_borders(raster);
 
326
 
 
327
            needs_update = 1;
 
328
        } else {
 
329
            needs_update = 0;
 
330
        }
 
331
    }
 
332
 
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,
475
469
        }
476
470
        raster_changes_apply(changes->sprites, i);
477
471
    }
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);
482
476
#endif
483
477