summaryrefslogtreecommitdiffstats
path: root/apps/plugins/zxbox/zxvid_16bpp.c
blob: 235efcbcb214b2884d201c6f4a36e06cff71bd56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "zxvid_com.h"

#if LCD_DEPTH > 4
/* screen routines for color targets */

/*
use for slightly different colors
#define N0 0x04
#define N1 0x34

#define B0 0x08
#define B1 0x3F
*/

#define N0 0x00
#define N1 0xAA

#define B0 0x55
#define B1 0xFF
struct rgb norm_colors[COLORNUM]={
  {0,0,0},{N0,N0,N1},{N1,N0,N0},{N1,N0,N1},
  {N0,N1,N0},{N0,N1,N1},{N1,N1,N0},{N1,N1,N1},

  {0x15,0x15,0x15},{B0,B0,B1},{B1,B0,B0},{B1,B0,B1},
  {B0,B1,B0},{B0,B1,B1},{B1,B1,B0},{B1,B1,B1}
};


/* since emulator uses array of bytes for screen representation
 * short 16b colors won't fit there */
short _16bpp_colors[16] IBSS_ATTR; 

void init_spect_scr(void)
{
    int i;

    for(i = 0; i < 16; i++) 
        sp_colors[i] = i;
    for(i = 0; i < 16; i++) 
        _16bpp_colors[i] = LCD_RGBPACK(norm_colors[i].r,norm_colors[i].g,norm_colors[i].b);
    if ( settings.invert_colors ){
        for ( i = 0 ; i < 16 ; i++ )
            _16bpp_colors[i] = 0xFFFFFF - _16bpp_colors[i];
    }
    sp_image = (char *) &image_array;
    spscr_init_mask_color();
    spscr_init_line_pointers(HEIGHT);

}

void update_screen(void)
{
    char str[80];
    fb_data *frameb;
  
    int y=0;
   
#if LCD_HEIGHT >= ZX_HEIGHT && LCD_WIDTH >= ZX_WIDTH
    byte *scrptr;
    scrptr = (byte *) SPNM(image);
    frameb = rb->lcd_framebuffer;
    for ( y = 0 ; y < HEIGHT*WIDTH; y++ ){
        frameb[y] = _16bpp_colors[(unsigned)sp_image[y]];
    }

#else
    int x=0;
    int srcx, srcy=0;     /* x / y coordinates in source image */
    unsigned char* image;
    image = sp_image + ( (Y_OFF)*(WIDTH) ) + X_OFF;
    frameb = rb->lcd_framebuffer;
    for(y = 0; y < LCD_HEIGHT; y++)
    {
        srcx = 0;           /* reset our x counter before each row... */
        for(x = 0; x < LCD_WIDTH; x++)
        {
            *frameb = _16bpp_colors[image[srcx>>16]];
            srcx += X_STEP;    /* move through source image */
            frameb++;
        }
        srcy += Y_STEP;      /* move through the source image... */
        image += (srcy>>16)*WIDTH;   /* and possibly to the next row. */
        srcy &= 0xffff;     /* set up the y-coordinate between 0 and 1 */
    }

#endif
    if ( settings.showfps ) {
        int percent=0;
        int TPF = HZ/50;/* ticks per frame */
        if ((*rb->current_tick-start_time) > TPF )
            percent = 100*video_frames/((*rb->current_tick-start_time)/TPF);
        rb->snprintf(str,sizeof(str),"%d %%",percent);
        rb->lcd_putsxy(0,0,str);
    }
    rb -> lcd_update();
}


#endif /* HAVE_LCD_COLOR */