summaryrefslogtreecommitdiff
path: root/uisimulator/sdl/lcd-sdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'uisimulator/sdl/lcd-sdl.c')
-rw-r--r--uisimulator/sdl/lcd-sdl.c90
1 files changed, 18 insertions, 72 deletions
diff --git a/uisimulator/sdl/lcd-sdl.c b/uisimulator/sdl/lcd-sdl.c
index 6431c5f39d..373e07ffc0 100644
--- a/uisimulator/sdl/lcd-sdl.c
+++ b/uisimulator/sdl/lcd-sdl.c
@@ -21,11 +21,9 @@
21 21
22#include "lcd-sdl.h" 22#include "lcd-sdl.h"
23#include "uisdl.h" 23#include "uisdl.h"
24#include "system.h" /* for MIN() and MAX() */
24 25
25int display_zoom = 1; 26int display_zoom = 1;
26#ifdef UI_LCD_SPLIT
27static int gradient_steps = 0;
28#endif
29 27
30void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width, 28void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width,
31 int height, int max_x, int max_y, 29 int height, int max_x, int max_y,
@@ -51,18 +49,30 @@ void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width,
51 for (x = x_start; x < xmax; x++) { 49 for (x = x_start; x < xmax; x++) {
52 dest.x = x * display_zoom; 50 dest.x = x * display_zoom;
53 51
52#ifdef HAVE_LCD_SPLIT
53 for (y = y_start; y < MIN(ymax, LCD_SPLIT_POS); y++) {
54 dest.y = y * display_zoom;
55
56 SDL_FillRect(surface, &dest, (Uint32)(getpixel(x, y) | 0x80));
57 }
58 for (y = MAX(y_start, LCD_SPLIT_POS); y < ymax; y++) {
59 dest.y = (y + LCD_SPLIT_LINES) * display_zoom ;
60
61 SDL_FillRect(surface, &dest, (Uint32)getpixel(x, y));
62 }
63#else
54 for (y = y_start; y < ymax; y++) { 64 for (y = y_start; y < ymax; y++) {
55 dest.y = y * display_zoom; 65 dest.y = y * display_zoom;
56 66
57 SDL_FillRect(surface, &dest, (Uint32)getpixel(x, y)); 67 SDL_FillRect(surface, &dest, (Uint32)getpixel(x, y));
58 } 68 }
69#endif
59 } 70 }
60 71
61 SDL_UnlockSurface(surface); 72 SDL_UnlockSurface(surface);
62} 73}
63 74
64void sdl_gui_update(SDL_Surface *surface, IFSPLIT(SDL_Surface *real_surface,) 75void sdl_gui_update(SDL_Surface *surface, int x_start, int y_start, int width,
65 int x_start, int y_start, int width,
66 int height, int max_x, int max_y, int ui_x, int ui_y) 76 int height, int max_x, int max_y, int ui_x, int ui_y)
67{ 77{
68 int xmax, ymax; 78 int xmax, ymax;
@@ -80,73 +90,17 @@ void sdl_gui_update(SDL_Surface *surface, IFSPLIT(SDL_Surface *real_surface,)
80 SDL_Rect dest= {(ui_x + x_start) * display_zoom, (ui_y + y_start) * display_zoom, 90 SDL_Rect dest= {(ui_x + x_start) * display_zoom, (ui_y + y_start) * display_zoom,
81 xmax * display_zoom, ymax * display_zoom}; 91 xmax * display_zoom, ymax * display_zoom};
82 92
83#ifdef UI_LCD_SPLIT
84 /* fix real screen coordinates */
85 if(ymax >= UI_LCD_SPLIT_LINES)
86 src.h += UI_LCD_SPLIT_BLACK_LINES * display_zoom;
87
88 SDL_LockSurface(surface);
89 SDL_LockSurface(real_surface);
90
91 int pixel, npixels;
92
93#if LCD_DEPTH != 1
94#error "Split screen only works for monochrome displays !"
95#endif
96
97 npixels = display_zoom * display_zoom * UI_LCD_SPLIT_LINES * surface->pitch;
98 const unsigned char * pixels_src = (const unsigned char*)surface->pixels;
99 unsigned char * pixels_dst = (unsigned char*)real_surface->pixels;
100 const int start_pixel = UI_LCD_SPLIT_LINES * surface->pitch * display_zoom;
101 const int stop_pixel = (UI_LCD_SPLIT_LINES+UI_LCD_SPLIT_BLACK_LINES)
102 * surface->pitch * display_zoom;
103
104 /* draw top pixels, change the color */
105 for (pixel = 0; pixel < npixels ; pixel++)
106 {
107 int pix = pixels_src[pixel] + gradient_steps;
108 if(pix > 255) pix = 255;
109
110 pixels_dst[pixel] = pix;
111 }
112
113 /* copy bottom pixels */
114 memcpy(&pixels_dst[stop_pixel], &pixels_src[start_pixel],
115 (UI_LCD_HEIGHT - UI_LCD_SPLIT_LINES) * surface->pitch * display_zoom);
116
117 /* separation lines are off */
118 for (pixel = start_pixel; pixel < stop_pixel ; pixel++)
119 pixels_dst[pixel] = 0;
120
121 SDL_UnlockSurface(surface);
122 SDL_UnlockSurface(real_surface);
123
124 SDL_BlitSurface(real_surface, &src, gui_surface, &dest);
125#else
126 SDL_BlitSurface(surface, &src, gui_surface, &dest); 93 SDL_BlitSurface(surface, &src, gui_surface, &dest);
127#endif
128 94
129 SDL_Flip(gui_surface); 95 SDL_Flip(gui_surface);
130} 96}
131 97
132/* set a range of bitmap indices to a gradient from startcolour to endcolour */ 98/* set a range of bitmap indices to a gradient from startcolour to endcolour */
133void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end, 99void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end,
134 IFSPLIT(SDL_Color *split_start,) 100 int first, int steps)
135 IFSPLIT(SDL_Color *split_end ,) int first, int steps)
136{ 101{
137 int i; 102 int i;
138 103 SDL_Color palette[steps];
139#ifdef UI_LCD_SPLIT
140 int tot_steps = steps * 2;
141 if (tot_steps > 256)
142 tot_steps = 256;
143
144 gradient_steps = steps;
145#else
146#define tot_steps steps
147#endif
148
149 SDL_Color palette[tot_steps];
150 104
151 for (i = 0; i < steps; i++) { 105 for (i = 0; i < steps; i++) {
152 palette[i].r = start->r + (end->r - start->r) * i / (steps - 1); 106 palette[i].r = start->r + (end->r - start->r) * i / (steps - 1);
@@ -154,14 +108,6 @@ void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end,
154 palette[i].b = start->b + (end->b - start->b) * i / (steps - 1); 108 palette[i].b = start->b + (end->b - start->b) * i / (steps - 1);
155 } 109 }
156 110
157#ifdef UI_LCD_SPLIT /* extra color */ 111 SDL_SetPalette(surface, SDL_LOGPAL|SDL_PHYSPAL, palette, first, steps);
158 for (i = steps ; i < tot_steps; i++) {
159 palette[i].r = split_start->r + (split_end->r - split_start->r) * (i - steps) / (tot_steps - steps - 1);
160 palette[i].g = split_start->g + (split_end->g - split_start->g) * (i - steps) / (tot_steps - steps - 1);
161 palette[i].b = split_start->b + (split_end->b - split_start->b) * (i - steps) / (tot_steps - steps - 1);
162 }
163#endif
164
165 SDL_SetPalette(surface, SDL_LOGPAL|SDL_PHYSPAL, palette, first, tot_steps);
166} 112}
167 113