diff options
Diffstat (limited to 'uisimulator/x11/lcd-x11.c')
-rw-r--r-- | uisimulator/x11/lcd-x11.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/uisimulator/x11/lcd-x11.c b/uisimulator/x11/lcd-x11.c index 1ee15f9169..d538cee9df 100644 --- a/uisimulator/x11/lcd-x11.c +++ b/uisimulator/x11/lcd-x11.c | |||
@@ -40,11 +40,19 @@ | |||
40 | #include "lcd-x11.h" | 40 | #include "lcd-x11.h" |
41 | #include "lcd-playersim.h" | 41 | #include "lcd-playersim.h" |
42 | 42 | ||
43 | extern unsigned char lcd_framebuffer[LCD_HEIGHT/8][LCD_WIDTH]; | 43 | #if LCD_DEPTH == 2 |
44 | #define YBLOCK 4 | ||
45 | #define BITOFFS 1 /* take the MSB of each pixel */ | ||
46 | #else | ||
47 | #define YBLOCK 8 | ||
48 | #define BITOFFS 0 | ||
49 | #endif | ||
50 | |||
44 | extern void screen_resized(int width, int height); | 51 | extern void screen_resized(int width, int height); |
45 | 52 | ||
46 | #ifdef HAVE_LCD_BITMAP | 53 | #ifdef HAVE_LCD_BITMAP |
47 | unsigned char lcd_framebuffer_copy[LCD_HEIGHT/8][LCD_WIDTH]; | 54 | extern unsigned char lcd_framebuffer[LCD_HEIGHT/YBLOCK][LCD_WIDTH]; |
55 | unsigned char lcd_framebuffer_copy[LCD_HEIGHT/YBLOCK][LCD_WIDTH]; | ||
48 | 56 | ||
49 | void lcd_update (void) | 57 | void lcd_update (void) |
50 | { | 58 | { |
@@ -55,21 +63,21 @@ void lcd_update (void) | |||
55 | int cp=0; | 63 | int cp=0; |
56 | struct coordinate clearpoints[LCD_WIDTH * LCD_HEIGHT]; | 64 | struct coordinate clearpoints[LCD_WIDTH * LCD_HEIGHT]; |
57 | 65 | ||
58 | for(y=0; y<LCD_HEIGHT; y+=8) { | 66 | for(y=0; y<LCD_HEIGHT; y+=YBLOCK) { |
59 | for(x=0; x<LCD_WIDTH; x++) { | 67 | for(x=0; x<LCD_WIDTH; x++) { |
60 | if(lcd_framebuffer[y/8][x] || lcd_framebuffer_copy[y/8][x]) { | 68 | if(lcd_framebuffer[y/YBLOCK][x] || lcd_framebuffer_copy[y/YBLOCK][x]) { |
61 | /* one or more bits/pixels are changed */ | 69 | /* one or more bits/pixels are changed */ |
62 | unsigned char diff = | 70 | unsigned char diff = |
63 | lcd_framebuffer[y/8][x] ^ lcd_framebuffer_copy[y/8][x]; | 71 | lcd_framebuffer[y/YBLOCK][x] ^ lcd_framebuffer_copy[y/YBLOCK][x]; |
64 | 72 | ||
65 | for(bit=0; bit<8; bit++) { | 73 | for(bit=0; bit<YBLOCK; bit++) { |
66 | if(lcd_framebuffer[y/8][x]&(1<<bit)) { | 74 | if(lcd_framebuffer[y/YBLOCK][x]&(1<<(bit*LCD_DEPTH+BITOFFS))) { |
67 | /* set a dot */ | 75 | /* set a dot */ |
68 | points[p].x = x + MARGIN_X; | 76 | points[p].x = x + MARGIN_X; |
69 | points[p].y = y+bit + MARGIN_Y; | 77 | points[p].y = y+bit + MARGIN_Y; |
70 | p++; /* increase the point counter */ | 78 | p++; /* increase the point counter */ |
71 | } | 79 | } |
72 | else if(diff &(1<<bit)) { | 80 | else if(diff &(1<<(bit*LCD_DEPTH+BITOFFS))) { |
73 | /* clear a dot */ | 81 | /* clear a dot */ |
74 | clearpoints[cp].x = x + MARGIN_X; | 82 | clearpoints[cp].x = x + MARGIN_X; |
75 | clearpoints[cp].y = y+bit + MARGIN_Y; | 83 | clearpoints[cp].y = y+bit + MARGIN_Y; |
@@ -110,33 +118,33 @@ void lcd_update_rect(int x_start, int y_start, | |||
110 | fprintf(stderr, "%04d: lcd_update_rect(%d, %d, %d, %d)\n", | 118 | fprintf(stderr, "%04d: lcd_update_rect(%d, %d, %d, %d)\n", |
111 | counter++, x_start, y_start, width, height); | 119 | counter++, x_start, y_start, width, height); |
112 | #endif | 120 | #endif |
113 | /* The Y coordinates have to work on even 8 pixel rows */ | 121 | /* The Y coordinates have to work on even YBLOCK pixel rows */ |
114 | ymax = (yline + height)/8; | 122 | ymax = (yline + height)/YBLOCK; |
115 | yline /= 8; | 123 | yline /= YBLOCK; |
116 | 124 | ||
117 | xmax = x_start + width; | 125 | xmax = x_start + width; |
118 | 126 | ||
119 | if(xmax > LCD_WIDTH) | 127 | if(xmax > LCD_WIDTH) |
120 | xmax = LCD_WIDTH; | 128 | xmax = LCD_WIDTH; |
121 | if(ymax >= LCD_HEIGHT/8) | 129 | if(ymax >= LCD_HEIGHT/YBLOCK) |
122 | ymax = LCD_HEIGHT/8-1; | 130 | ymax = LCD_HEIGHT/YBLOCK-1; |
123 | 131 | ||
124 | for(; yline<=ymax; yline++) { | 132 | for(; yline<=ymax; yline++) { |
125 | y = yline * 8; | 133 | y = yline * YBLOCK; |
126 | for(x=x_start; x<xmax; x++) { | 134 | for(x=x_start; x<xmax; x++) { |
127 | if(lcd_framebuffer[yline][x] || lcd_framebuffer_copy[yline][x]) { | 135 | if(lcd_framebuffer[yline][x] || lcd_framebuffer_copy[yline][x]) { |
128 | /* one or more bits/pixels are changed */ | 136 | /* one or more bits/pixels are changed */ |
129 | unsigned char diff = | 137 | unsigned char diff = |
130 | lcd_framebuffer[yline][x] ^ lcd_framebuffer_copy[yline][x]; | 138 | lcd_framebuffer[yline][x] ^ lcd_framebuffer_copy[yline][x]; |
131 | 139 | ||
132 | for(bit=0; bit<8; bit++) { | 140 | for(bit=0; bit<YBLOCK; bit++) { |
133 | if(lcd_framebuffer[yline][x]&(1<<bit)) { | 141 | if(lcd_framebuffer[yline][x]&(1<<(bit*LCD_DEPTH+BITOFFS))) { |
134 | /* set a dot */ | 142 | /* set a dot */ |
135 | points[p].x = x + MARGIN_X; | 143 | points[p].x = x + MARGIN_X; |
136 | points[p].y = y+bit + MARGIN_Y; | 144 | points[p].y = y+bit + MARGIN_Y; |
137 | p++; /* increase the point counter */ | 145 | p++; /* increase the point counter */ |
138 | } | 146 | } |
139 | else if(diff &(1<<bit)) { | 147 | else if(diff &(1<<(bit*LCD_DEPTH+BITOFFS))) { |
140 | /* clear a dot */ | 148 | /* clear a dot */ |
141 | clearpoints[cp].x = x + MARGIN_X; | 149 | clearpoints[cp].x = x + MARGIN_X; |
142 | clearpoints[cp].y = y+bit + MARGIN_Y; | 150 | clearpoints[cp].y = y+bit + MARGIN_Y; |