diff options
author | Jens Arnold <amiconn@rockbox.org> | 2009-02-09 00:32:59 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2009-02-09 00:32:59 +0000 |
commit | 0d935ce75e1408dfd9832ae7dbb7d84df50a645d (patch) | |
tree | 9ddcc5d21dcd0e576d0fa824e74c58755fa9d1a0 /uisimulator/sdl/lcd-bitmap.c | |
parent | 94537f954e67d44fdd9703c062c4ee53599e0e74 (diff) | |
download | rockbox-0d935ce75e1408dfd9832ae7dbb7d84df50a645d.tar.gz rockbox-0d935ce75e1408dfd9832ae7dbb7d84df50a645d.zip |
Put the display colours for monochrome and greyscale targets into the target config files, and use them both for the simulator UI and screendumps. The Clip now shows the split display properly in screendumps and simulator. A side effect is that screendumps of ordinary monochrome targets are now 4-bit BMP files (saves an alternate code path, and might be more compatible with some gfx programs). * Simplify the simulation of split display, and also simplify greylib simulation. The simulator now always calculates 129 shades (2*128 for a Clip sim), and just uses 2 (or 4) of those for native display simulation. * Centralised the simulator LCD dimension definition.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19950 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator/sdl/lcd-bitmap.c')
-rw-r--r-- | uisimulator/sdl/lcd-bitmap.c | 230 |
1 files changed, 94 insertions, 136 deletions
diff --git a/uisimulator/sdl/lcd-bitmap.c b/uisimulator/sdl/lcd-bitmap.c index bc2a4c46f4..6faa5eb0b2 100644 --- a/uisimulator/sdl/lcd-bitmap.c +++ b/uisimulator/sdl/lcd-bitmap.c | |||
@@ -22,45 +22,74 @@ | |||
22 | #include "debug.h" | 22 | #include "debug.h" |
23 | #include "uisdl.h" | 23 | #include "uisdl.h" |
24 | #include "lcd-sdl.h" | 24 | #include "lcd-sdl.h" |
25 | #include "misc.h" | ||
25 | 26 | ||
26 | SDL_Surface* lcd_surface; | 27 | SDL_Surface* lcd_surface; |
27 | #ifdef UI_LCD_SPLIT | ||
28 | SDL_Surface* lcd_real_surface; /* the surface which represents the real screen */ | ||
29 | #endif | ||
30 | int lcd_backlight_val; | ||
31 | 28 | ||
32 | #if LCD_DEPTH <= 8 | 29 | #if LCD_DEPTH <= 8 |
33 | #ifdef HAVE_BACKLIGHT | 30 | #ifdef HAVE_BACKLIGHT |
34 | SDL_Color lcd_backlight_color_zero = {UI_LCD_BGCOLORLIGHT, 0}; | 31 | SDL_Color lcd_bl_color_dark = {RED_CMP(LCD_BL_DARKCOLOR), |
35 | SDL_Color lcd_backlight_color_max = {UI_LCD_FGCOLORLIGHT, 0}; | 32 | GREEN_CMP(LCD_BL_DARKCOLOR), |
36 | #ifdef UI_LCD_SPLIT | 33 | BLUE_CMP(LCD_BL_DARKCOLOR), 0}; |
37 | SDL_Color lcd_backlight_color_split= {UI_LCD_SPLIT_FGCOLORLIGHT, 0}; | 34 | SDL_Color lcd_bl_color_bright = {RED_CMP(LCD_BL_BRIGHTCOLOR), |
38 | #endif | 35 | GREEN_CMP(LCD_BL_BRIGHTCOLOR), |
39 | #endif | 36 | BLUE_CMP(LCD_BL_BRIGHTCOLOR), 0}; |
40 | SDL_Color lcd_color_zero = {UI_LCD_BGCOLOR, 0}; | 37 | #ifdef HAVE_LCD_SPLIT |
41 | SDL_Color lcd_color_max = {UI_LCD_FGCOLOR, 0}; | 38 | SDL_Color lcd_bl_color2_dark = {RED_CMP(LCD_BL_DARKCOLOR_2), |
42 | #ifdef UI_LCD_SPLIT | 39 | GREEN_CMP(LCD_BL_DARKCOLOR_2), |
43 | SDL_Color lcd_color_split= {UI_LCD_SPLIT_FGCOLOR, 0}; | 40 | BLUE_CMP(LCD_BL_DARKCOLOR_2), 0}; |
44 | #endif | 41 | SDL_Color lcd_bl_color2_bright = {RED_CMP(LCD_BL_BRIGHTCOLOR_2), |
42 | GREEN_CMP(LCD_BL_BRIGHTCOLOR_2), | ||
43 | BLUE_CMP(LCD_BL_BRIGHTCOLOR_2), 0}; | ||
44 | #endif | ||
45 | #endif /* HAVE_BACKLIGHT */ | ||
46 | SDL_Color lcd_color_dark = {RED_CMP(LCD_DARKCOLOR), | ||
47 | GREEN_CMP(LCD_DARKCOLOR), | ||
48 | BLUE_CMP(LCD_DARKCOLOR), 0}; | ||
49 | SDL_Color lcd_color_bright = {RED_CMP(LCD_BRIGHTCOLOR), | ||
50 | GREEN_CMP(LCD_BRIGHTCOLOR), | ||
51 | BLUE_CMP(LCD_BRIGHTCOLOR), 0}; | ||
52 | #ifdef HAVE_LCD_SPLIT | ||
53 | SDL_Color lcd_color2_dark = {RED_CMP(LCD_DARKCOLOR_2), | ||
54 | GREEN_CMP(LCD_DARKCOLOR_2), | ||
55 | BLUE_CMP(LCD_DARKCOLOR_2), 0}; | ||
56 | SDL_Color lcd_color2_bright = {RED_CMP(LCD_BRIGHTCOLOR_2), | ||
57 | GREEN_CMP(LCD_BRIGHTCOLOR_2), | ||
58 | BLUE_CMP(LCD_BRIGHTCOLOR_2), 0}; | ||
59 | #endif | ||
60 | |||
61 | #ifdef HAVE_LCD_SPLIT | ||
62 | #define GRADIENT_MAX 127 | ||
63 | #else | ||
64 | #define GRADIENT_MAX 128 | ||
45 | #endif | 65 | #endif |
66 | #endif /* LCD_DEPTH <= 8 */ | ||
46 | 67 | ||
47 | #if LCD_DEPTH < 8 | 68 | #if LCD_DEPTH < 8 |
48 | int lcd_ex_shades = 0; | ||
49 | unsigned long (*lcd_ex_getpixel)(int, int) = NULL; | 69 | unsigned long (*lcd_ex_getpixel)(int, int) = NULL; |
70 | #endif /* LCD_DEPTH < 8 */ | ||
71 | |||
72 | #if LCD_DEPTH == 2 | ||
73 | /* Only defined for positive, non-split LCD for now */ | ||
74 | static const unsigned char colorindex[4] = {128, 85, 43, 0}; | ||
50 | #endif | 75 | #endif |
51 | 76 | ||
52 | static unsigned long get_lcd_pixel(int x, int y) | 77 | static unsigned long get_lcd_pixel(int x, int y) |
53 | { | 78 | { |
54 | #if LCD_DEPTH == 1 | 79 | #if LCD_DEPTH == 1 |
55 | return ((lcd_framebuffer[y/8][x] >> (y & 7)) & 1); | 80 | #ifdef HAVE_NEGATIVE_LCD |
81 | return (lcd_framebuffer[y/8][x] & (1 << (y & 7))) ? GRADIENT_MAX : 0; | ||
82 | #else | ||
83 | return (lcd_framebuffer[y/8][x] & (1 << (y & 7))) ? 0 : GRADIENT_MAX; | ||
84 | #endif | ||
56 | #elif LCD_DEPTH == 2 | 85 | #elif LCD_DEPTH == 2 |
57 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING | 86 | #if LCD_PIXELFORMAT == HORIZONTAL_PACKING |
58 | return ((lcd_framebuffer[y][x/4] >> (2 * (~x & 3))) & 3); | 87 | return colorindex[(lcd_framebuffer[y][x/4] >> (2 * (~x & 3))) & 3]; |
59 | #elif LCD_PIXELFORMAT == VERTICAL_PACKING | 88 | #elif LCD_PIXELFORMAT == VERTICAL_PACKING |
60 | return ((lcd_framebuffer[y/4][x] >> (2 * (y & 3))) & 3); | 89 | return colorindex[(lcd_framebuffer[y/4][x] >> (2 * (y & 3))) & 3]; |
61 | #elif LCD_PIXELFORMAT == VERTICAL_INTERLEAVED | 90 | #elif LCD_PIXELFORMAT == VERTICAL_INTERLEAVED |
62 | unsigned bits = (lcd_framebuffer[y/8][x] >> (y & 7)) & 0x0101; | 91 | unsigned bits = (lcd_framebuffer[y/8][x] >> (y & 7)) & 0x0101; |
63 | return (bits | (bits >> 7)) & 3; | 92 | return colorindex[(bits | (bits >> 7)) & 3]; |
64 | #endif | 93 | #endif |
65 | #elif LCD_DEPTH == 16 | 94 | #elif LCD_DEPTH == 16 |
66 | #if LCD_PIXELFORMAT == RGB565SWAPPED | 95 | #if LCD_PIXELFORMAT == RGB565SWAPPED |
@@ -80,148 +109,77 @@ void lcd_update(void) | |||
80 | 109 | ||
81 | void lcd_update_rect(int x_start, int y_start, int width, int height) | 110 | void lcd_update_rect(int x_start, int y_start, int width, int height) |
82 | { | 111 | { |
83 | sdl_update_rect(lcd_surface, x_start, y_start, width, height, LCD_WIDTH, | 112 | sdl_update_rect(lcd_surface, x_start, y_start, width, height, |
84 | LCD_HEIGHT, get_lcd_pixel); | 113 | LCD_WIDTH, LCD_HEIGHT, get_lcd_pixel); |
85 | sdl_gui_update(lcd_surface, IFSPLIT(lcd_real_surface,) x_start, y_start, | 114 | sdl_gui_update(lcd_surface, x_start, y_start, width, |
86 | width, height, LCD_WIDTH, LCD_HEIGHT, | 115 | height + LCD_SPLIT_LINES, SIM_LCD_WIDTH, SIM_LCD_HEIGHT, |
87 | background ? UI_LCD_POSX : 0, background? UI_LCD_POSY : 0); | 116 | background ? UI_LCD_POSX : 0, background? UI_LCD_POSY : 0); |
88 | } | 117 | } |
89 | 118 | ||
90 | #ifdef HAVE_BACKLIGHT | 119 | #ifdef HAVE_BACKLIGHT |
91 | void sim_backlight(int value) | 120 | void sim_backlight(int value) |
92 | { | 121 | { |
93 | lcd_backlight_val = value; | ||
94 | |||
95 | #if LCD_DEPTH <= 8 | 122 | #if LCD_DEPTH <= 8 |
96 | if (value > 0) { | 123 | if (value > 0) { |
97 | #ifdef UI_LCD_SPLIT | 124 | sdl_set_gradient(lcd_surface, &lcd_bl_color_dark, |
98 | sdl_set_gradient(lcd_real_surface, &lcd_backlight_color_zero, | 125 | &lcd_bl_color_bright, 0, GRADIENT_MAX+1); |
99 | &lcd_backlight_color_max, &lcd_backlight_color_zero, | 126 | #ifdef HAVE_LCD_SPLIT |
100 | &lcd_backlight_color_split, 0, (1<<LCD_DEPTH)); | 127 | sdl_set_gradient(lcd_surface, &lcd_bl_color2_dark, |
101 | #else | 128 | &lcd_bl_color2_bright, GRADIENT_MAX+1, GRADIENT_MAX+1); |
102 | sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, | ||
103 | &lcd_backlight_color_max, 0, (1<<LCD_DEPTH)); | ||
104 | #endif | 129 | #endif |
105 | } else { | 130 | } else { |
106 | #ifdef UI_LCD_SPLIT | 131 | sdl_set_gradient(lcd_surface, &lcd_color_dark, |
107 | sdl_set_gradient(lcd_real_surface, &lcd_color_zero, &lcd_color_max, | 132 | &lcd_color_bright, 0, GRADIENT_MAX+1); |
108 | &lcd_color_zero, &lcd_color_split, 0, (1<<LCD_DEPTH)); | 133 | #ifdef HAVE_LCD_SPLIT |
109 | #else | 134 | sdl_set_gradient(lcd_surface, &lcd_color2_dark, |
110 | sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, 0, | 135 | &lcd_color2_bright, GRADIENT_MAX+1, GRADIENT_MAX+1); |
111 | (1<<LCD_DEPTH)); | ||
112 | #endif | ||
113 | } | ||
114 | #if LCD_DEPTH < 8 | ||
115 | if (lcd_ex_shades) { | ||
116 | if (value > 0) { | ||
117 | #ifdef UI_LCD_SPLIT | ||
118 | sdl_set_gradient(lcd_real_surface, &lcd_backlight_color_max, | ||
119 | &lcd_backlight_color_zero, &lcd_backlight_color_split, | ||
120 | &lcd_backlight_color_zero, | ||
121 | (1<<LCD_DEPTH), lcd_ex_shades); | ||
122 | #elif defined MROBE_100 | ||
123 | /* quick fix, a proper fix needs to compare brightnesses */ | ||
124 | sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, | ||
125 | &lcd_backlight_color_max, (1<<LCD_DEPTH), lcd_ex_shades); | ||
126 | #else | ||
127 | sdl_set_gradient(lcd_surface, &lcd_backlight_color_max, | ||
128 | &lcd_backlight_color_zero, (1<<LCD_DEPTH), lcd_ex_shades); | ||
129 | #endif | 136 | #endif |
130 | } else { | ||
131 | #ifdef UI_LCD_SPLIT | ||
132 | sdl_set_gradient(lcd_real_surface, &lcd_color_max, &lcd_color_zero, | ||
133 | &lcd_color_split, &lcd_color_zero, (1<<LCD_DEPTH), | ||
134 | lcd_ex_shades); | ||
135 | #elif defined MROBE_100 | ||
136 | /* quick fix, a proper fix needs to compare brightnesses */ | ||
137 | sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, | ||
138 | (1<<LCD_DEPTH), lcd_ex_shades); | ||
139 | #else | ||
140 | sdl_set_gradient(lcd_surface, &lcd_color_max, &lcd_color_zero, | ||
141 | (1<<LCD_DEPTH), lcd_ex_shades); | ||
142 | #endif | ||
143 | } | ||
144 | } | 137 | } |
145 | #endif | 138 | sdl_gui_update(lcd_surface, 0, 0, SIM_LCD_WIDTH, SIM_LCD_HEIGHT, |
146 | 139 | SIM_LCD_WIDTH, SIM_LCD_HEIGHT, | |
147 | sdl_gui_update(lcd_surface, IFSPLIT(lcd_real_surface,) 0, 0, LCD_WIDTH, | ||
148 | LCD_HEIGHT, LCD_WIDTH, LCD_HEIGHT, | ||
149 | background ? UI_LCD_POSX : 0, background? UI_LCD_POSY : 0); | 140 | background ? UI_LCD_POSX : 0, background? UI_LCD_POSY : 0); |
150 | 141 | #endif /* LCD_DEPTH <= 8 */ | |
151 | #endif | ||
152 | } | 142 | } |
153 | #endif | 143 | #endif /* HAVE_BACKLIGHT */ |
154 | 144 | ||
155 | /* initialise simulator lcd driver */ | 145 | /* initialise simulator lcd driver */ |
156 | void sim_lcd_init(void) | 146 | void sim_lcd_init(void) |
157 | { | 147 | { |
158 | #if LCD_DEPTH == 16 | 148 | #if LCD_DEPTH == 16 |
159 | lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, LCD_WIDTH * display_zoom, | 149 | lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, |
160 | LCD_HEIGHT * display_zoom, LCD_DEPTH, 0, 0, 0, 0); | 150 | SIM_LCD_WIDTH * display_zoom, |
151 | SIM_LCD_HEIGHT * display_zoom, | ||
152 | LCD_DEPTH, 0, 0, 0, 0); | ||
161 | #else | 153 | #else |
162 | lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, LCD_WIDTH * display_zoom, | 154 | lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, |
163 | LCD_HEIGHT * display_zoom, 8, 0, 0, 0, 0); | 155 | SIM_LCD_WIDTH * display_zoom, |
164 | #ifdef UI_LCD_SPLIT | 156 | SIM_LCD_HEIGHT * display_zoom, |
165 | lcd_real_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, | 157 | 8, 0, 0, 0, 0); |
166 | LCD_WIDTH * display_zoom, | ||
167 | (LCD_HEIGHT+UI_LCD_SPLIT_BLACK_LINES) * display_zoom, 8, 0, 0, 0, 0); | ||
168 | #endif | ||
169 | #endif | 158 | #endif |
170 | 159 | ||
171 | #if LCD_DEPTH <= 8 | 160 | #if LCD_DEPTH <= 8 |
172 | #ifdef HAVE_BACKLIGHT | 161 | #ifdef HAVE_BACKLIGHT |
173 | #ifdef UI_LCD_SPLIT | 162 | sdl_set_gradient(lcd_surface, &lcd_bl_color_dark, |
174 | sdl_set_gradient(lcd_real_surface, &lcd_backlight_color_zero, | 163 | &lcd_bl_color_bright, 0, GRADIENT_MAX+1); |
175 | &lcd_backlight_color_max, &lcd_backlight_color_zero, | 164 | #ifdef HAVE_LCD_SPLIT |
176 | &lcd_backlight_color_split, 0, (1<<LCD_DEPTH)); | 165 | sdl_set_gradient(lcd_surface, &lcd_bl_color2_dark, |
177 | #else | 166 | &lcd_bl_color2_bright, GRADIENT_MAX+1, GRADIENT_MAX+1); |
178 | sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, | 167 | #endif |
179 | &lcd_backlight_color_max, 0, (1<<LCD_DEPTH)); | 168 | #else /* !HAVE_BACKLIGHT */ |
180 | #endif | 169 | sdl_set_gradient(lcd_surface, &lcd_color_dark, |
181 | #else | 170 | &lcd_color_bright, 0, GRADIENT_MAX+1); |
182 | sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, 0, | 171 | #ifdef HAVE_LCD_SPLIT |
183 | (1<<LCD_DEPTH)); | 172 | sdl_set_gradient(lcd_surface, &lcd_color2_dark, |
184 | #endif | 173 | &lcd_color2_bright, GRADIENT_MAX+1, GRADIENT_MAX+1); |
185 | #endif | 174 | #endif |
175 | #endif /* !HAVE_BACKLIGHT */ | ||
176 | #endif /* LCD_DEPTH < 8 */ | ||
186 | } | 177 | } |
187 | 178 | ||
188 | #if LCD_DEPTH < 8 | 179 | #if LCD_DEPTH < 8 |
189 | void sim_lcd_ex_init(int shades, unsigned long (*getpixel)(int, int)) | 180 | void sim_lcd_ex_init(unsigned long (*getpixel)(int, int)) |
190 | { | 181 | { |
191 | lcd_ex_shades = shades; | ||
192 | lcd_ex_getpixel = getpixel; | 182 | lcd_ex_getpixel = getpixel; |
193 | if (shades) { | ||
194 | #ifdef HAVE_BACKLIGHT | ||
195 | if (lcd_backlight_val > 0) { | ||
196 | #ifdef UI_LCD_SPLIT | ||
197 | sdl_set_gradient(lcd_real_surface, &lcd_backlight_color_max, | ||
198 | &lcd_backlight_color_zero, &lcd_backlight_color_split, | ||
199 | &lcd_backlight_color_zero, (1<<LCD_DEPTH), shades); | ||
200 | #elif defined MROBE_100 | ||
201 | /* quick fix, a proper fix needs to compare brightnesses */ | ||
202 | sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, | ||
203 | &lcd_backlight_color_max, (1<<LCD_DEPTH), shades); | ||
204 | #else | ||
205 | sdl_set_gradient(lcd_surface, &lcd_backlight_color_max, | ||
206 | &lcd_backlight_color_zero, (1<<LCD_DEPTH), shades); | ||
207 | #endif | ||
208 | } | ||
209 | else | ||
210 | #endif | ||
211 | { | ||
212 | #ifdef UI_LCD_SPLIT | ||
213 | sdl_set_gradient(lcd_real_surface, &lcd_color_max, &lcd_color_zero, | ||
214 | &lcd_color_split, &lcd_color_zero, (1<<LCD_DEPTH), shades); | ||
215 | #elif defined MROBE_100 | ||
216 | /* quick fix, a proper fix needs to compare brightnesses */ | ||
217 | sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, | ||
218 | (1<<LCD_DEPTH), shades); | ||
219 | #else | ||
220 | sdl_set_gradient(lcd_surface, &lcd_color_max, &lcd_color_zero, | ||
221 | (1<<LCD_DEPTH), shades); | ||
222 | #endif | ||
223 | } | ||
224 | } | ||
225 | } | 183 | } |
226 | 184 | ||
227 | void sim_lcd_ex_update_rect(int x_start, int y_start, int width, int height) | 185 | void sim_lcd_ex_update_rect(int x_start, int y_start, int width, int height) |
@@ -229,10 +187,10 @@ void sim_lcd_ex_update_rect(int x_start, int y_start, int width, int height) | |||
229 | if (lcd_ex_getpixel) { | 187 | if (lcd_ex_getpixel) { |
230 | sdl_update_rect(lcd_surface, x_start, y_start, width, height, | 188 | sdl_update_rect(lcd_surface, x_start, y_start, width, height, |
231 | LCD_WIDTH, LCD_HEIGHT, lcd_ex_getpixel); | 189 | LCD_WIDTH, LCD_HEIGHT, lcd_ex_getpixel); |
232 | sdl_gui_update(lcd_surface, IFSPLIT(lcd_real_surface,) x_start, y_start, | 190 | sdl_gui_update(lcd_surface, x_start, y_start, width, |
233 | width, height, LCD_WIDTH, LCD_HEIGHT, | 191 | height + LCD_SPLIT_LINES, SIM_LCD_WIDTH, SIM_LCD_HEIGHT, |
234 | background ? UI_LCD_POSX : 0, | 192 | background ? UI_LCD_POSX : 0, |
235 | background? UI_LCD_POSY : 0); | 193 | background ? UI_LCD_POSY : 0); |
236 | } | 194 | } |
237 | } | 195 | } |
238 | #endif | 196 | #endif |