diff options
author | Jens Arnold <amiconn@rockbox.org> | 2006-02-26 13:37:42 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2006-02-26 13:37:42 +0000 |
commit | 6a972e02497d3015236189f72931c3d59fa51755 (patch) | |
tree | 0c0185dd66b47d7d1ee2d91e4a3ffb6dbabcc7d1 /uisimulator | |
parent | 14fe89aa8d2ef05595bdba0e0b78f021f3e8d087 (diff) |
Finally - grayscale library support for the simulators. Currently SDL only, win32 and x11 won't link anymore due to missing simulator functions.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8845 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator')
-rw-r--r-- | uisimulator/sdl/lcd-bitmap.c | 89 | ||||
-rw-r--r-- | uisimulator/sdl/lcd-bitmap.h | 4 | ||||
-rw-r--r-- | uisimulator/sdl/lcd-charcell.c | 9 | ||||
-rw-r--r-- | uisimulator/sdl/lcd-remote.c | 19 | ||||
-rw-r--r-- | uisimulator/sdl/lcd-sdl.c | 36 | ||||
-rw-r--r-- | uisimulator/sdl/lcd-sdl.h | 9 |
6 files changed, 128 insertions, 38 deletions
diff --git a/uisimulator/sdl/lcd-bitmap.c b/uisimulator/sdl/lcd-bitmap.c index 2fd7576ecc..788a5f662d 100644 --- a/uisimulator/sdl/lcd-bitmap.c +++ b/uisimulator/sdl/lcd-bitmap.c @@ -22,6 +22,7 @@ #include "lcd-sdl.h" SDL_Surface* lcd_surface; +int lcd_backlight_val; #if LCD_DEPTH <= 8 SDL_Color lcd_color_zero = {UI_LCD_BGCOLOR, 0}; @@ -29,22 +30,27 @@ SDL_Color lcd_backlight_color_zero = {UI_LCD_BGCOLORLIGHT, 0}; SDL_Color lcd_color_max = {0, 0, 0, 0}; #endif -static inline Uint32 get_lcd_pixel(int x, int y) +#if LCD_DEPTH < 8 +int lcd_ex_shades = 0; +unsigned long (*lcd_ex_getpixel)(int, int) = NULL; +#endif + +static unsigned long get_lcd_pixel(int x, int y) { #if LCD_DEPTH == 1 - return ((lcd_framebuffer[y/8][x] >> (y & 7)) & 1); + return ((lcd_framebuffer[y/8][x] >> (y & 7)) & 1); #elif LCD_DEPTH == 2 #if LCD_PIXELFORMAT == HORIZONTAL_PACKING - return ((lcd_framebuffer[y][x/4] >> (2 * (x & 3))) & 3); + return ((lcd_framebuffer[y][x/4] >> (2 * (x & 3))) & 3); #else - return ((lcd_framebuffer[y/4][x] >> (2 * (y & 3))) & 3); + return ((lcd_framebuffer[y/4][x] >> (2 * (y & 3))) & 3); #endif #elif LCD_DEPTH == 16 #if LCD_PIXELFORMAT == RGB565SWAPPED - unsigned bits = lcd_framebuffer[y][x]; - return (bits >> 8) | (bits << 8); + unsigned bits = lcd_framebuffer[y][x]; + return (bits >> 8) | (bits << 8); #else - return lcd_framebuffer[y][x]; + return lcd_framebuffer[y][x]; #endif #endif } @@ -57,22 +63,41 @@ void lcd_update(void) void lcd_update_rect(int x_start, int y_start, int width, int height) { - sdl_update_rect(lcd_surface, x_start, y_start, width, height, LCD_WIDTH, LCD_HEIGHT, - background ? UI_LCD_POSX : 0, background? UI_LCD_POSY : 0, - get_lcd_pixel); + sdl_update_rect(lcd_surface, x_start, y_start, width, height, LCD_WIDTH, + LCD_HEIGHT, get_lcd_pixel); + sdl_gui_update(lcd_surface, x_start, y_start, width, height, LCD_WIDTH, + LCD_HEIGHT, background ? UI_LCD_POSX : 0, background? UI_LCD_POSY : 0); } #ifdef CONFIG_BACKLIGHT void sim_backlight(int value) { + lcd_backlight_val = value; + #if LCD_DEPTH <= 8 if (value > 0) { - sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, + &lcd_color_max, 0, (1<<LCD_DEPTH)); } else { - sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, + 0, (1<<LCD_DEPTH)); } - - lcd_update(); +#if LCD_DEPTH < 8 + if (lcd_ex_shades) { + if (value > 0) { + sdl_set_gradient(lcd_surface, &lcd_color_max, + &lcd_backlight_color_zero, (1<<LCD_DEPTH), + lcd_ex_shades); + } else { + sdl_set_gradient(lcd_surface, &lcd_color_max, &lcd_color_zero, + (1<<LCD_DEPTH), lcd_ex_shades); + } + } +#endif + + sdl_gui_update(lcd_surface, 0, 0, LCD_WIDTH, LCD_HEIGHT, LCD_WIDTH, + LCD_HEIGHT, background ? UI_LCD_POSX : 0, background? UI_LCD_POSY : 0); + #else DEBUGF("backlight: %s\n", (value > 0) ? "on" : "off"); #endif @@ -91,7 +116,41 @@ void sim_lcd_init(void) #endif #if LCD_DEPTH <= 8 - sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, &lcd_color_max, + 0, (1<<LCD_DEPTH)); +#endif +} + +#if LCD_DEPTH < 8 +void sim_lcd_ex_init(int shades, unsigned long (*getpixel)(int, int)) +{ + lcd_ex_shades = shades; + lcd_ex_getpixel = getpixel; + if (shades) { +#ifdef CONFIG_BACKLIGHT + if (lcd_backlight_val > 0) { + sdl_set_gradient(lcd_surface, &lcd_color_max, + &lcd_backlight_color_zero, (1<<LCD_DEPTH), + shades); + } + else #endif + { + sdl_set_gradient(lcd_surface, &lcd_color_max, &lcd_color_zero, + (1<<LCD_DEPTH), shades); + } + } } +void sim_lcd_ex_update_rect(int x_start, int y_start, int width, int height) +{ + if (lcd_ex_getpixel) { + sdl_update_rect(lcd_surface, x_start, y_start, width, height, + LCD_WIDTH, LCD_HEIGHT, lcd_ex_getpixel); + sdl_gui_update(lcd_surface, x_start, y_start, width, height, LCD_WIDTH, + LCD_HEIGHT, background ? UI_LCD_POSX : 0, + background? UI_LCD_POSY : 0); + } +} +#endif + diff --git a/uisimulator/sdl/lcd-bitmap.h b/uisimulator/sdl/lcd-bitmap.h index 514c4d3ffb..31403385b9 100644 --- a/uisimulator/sdl/lcd-bitmap.h +++ b/uisimulator/sdl/lcd-bitmap.h @@ -24,6 +24,10 @@ #include "SDL.h" void sim_lcd_init(void); +#if LCD_DEPTH < 8 +void sim_lcd_ex_init(int shades, unsigned long (*getpixel)(int, int)); +void sim_lcd_ex_update_rect(int x, int y, int width, int height); +#endif #endif // #ifndef __LCDBITMAP_H__ diff --git a/uisimulator/sdl/lcd-charcell.c b/uisimulator/sdl/lcd-charcell.c index 2ef86d0baf..89c46f7738 100644 --- a/uisimulator/sdl/lcd-charcell.c +++ b/uisimulator/sdl/lcd-charcell.c @@ -109,9 +109,11 @@ void drawrectangles(int color, struct rectangle *points, int count) void sim_backlight(int value) { if (value > 0) { - sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, &lcd_color_max, + 0, (1<<LCD_DEPTH)); } else { - sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, + 0, (1<<LCD_DEPTH)); } lcd_update(); @@ -124,6 +126,7 @@ void sim_lcd_init(void) lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, LCD_WIDTH * display_zoom, LCD_HEIGHT * display_zoom, 8, 0, 0, 0, 0); - sdl_set_gradient(lcd_surface, &lcd_color_zero, &lcd_color_max, (1<<LCD_DEPTH)); + sdl_set_gradient(lcd_surface, &lcd_backlight_color_zero, &lcd_color_max, + 0, (1<<LCD_DEPTH)); } diff --git a/uisimulator/sdl/lcd-remote.c b/uisimulator/sdl/lcd-remote.c index 64b641ad6d..f1d04b33f8 100644 --- a/uisimulator/sdl/lcd-remote.c +++ b/uisimulator/sdl/lcd-remote.c @@ -41,19 +41,26 @@ void lcd_remote_update (void) void lcd_remote_update_rect(int x_start, int y_start, int width, int height) { sdl_update_rect(remote_surface, x_start, y_start, width, height, + LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT, get_lcd_remote_pixel); + sdl_gui_update(remote_surface, x_start, y_start, width, height, LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT, background ? UI_REMOTE_POSX : 0, - (background ? UI_REMOTE_POSY : LCD_HEIGHT), get_lcd_remote_pixel); + background ? UI_REMOTE_POSY : LCD_HEIGHT); } void sim_remote_backlight(int value) { if (value > 0) { - sdl_set_gradient(remote_surface, &remote_backlight_color_zero, &remote_color_max, (1<<LCD_REMOTE_DEPTH)); + sdl_set_gradient(remote_surface, &remote_backlight_color_zero, + &remote_color_max, 0, (1<<LCD_REMOTE_DEPTH)); } else { - sdl_set_gradient(remote_surface, &remote_color_zero, &remote_color_max, (1<<LCD_REMOTE_DEPTH)); + sdl_set_gradient(remote_surface, &remote_color_zero, &remote_color_max, + 0, (1<<LCD_REMOTE_DEPTH)); } - lcd_remote_update(); + sdl_gui_update(remote_surface, 0, 0, LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT, + LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT, + background ? UI_REMOTE_POSX : 0, + background? UI_REMOTE_POSY : LCD_HEIGHT); } /* initialise simulator lcd remote driver */ @@ -63,7 +70,7 @@ void sim_lcd_remote_init(void) LCD_REMOTE_WIDTH * display_zoom, LCD_REMOTE_HEIGHT * display_zoom, 8, 0, 0, 0, 0); - sdl_set_gradient(remote_surface, &remote_color_zero, &remote_color_max, - (1<<LCD_REMOTE_DEPTH)); + sdl_set_gradient(remote_surface, &remote_backlight_color_zero, + &remote_color_max, 0, (1<<LCD_REMOTE_DEPTH)); } diff --git a/uisimulator/sdl/lcd-sdl.c b/uisimulator/sdl/lcd-sdl.c index 3327dd8350..be10b468cb 100644 --- a/uisimulator/sdl/lcd-sdl.c +++ b/uisimulator/sdl/lcd-sdl.c @@ -23,8 +23,8 @@ int display_zoom = 1; void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width, - int height, int max_x, int max_y, int ui_x, int ui_y, - Uint32 (*getpixel)(int, int)) + int height, int max_x, int max_y, + unsigned long (*getpixel)(int, int)) { int x, y; int xmax, ymax; @@ -49,25 +49,39 @@ void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width, for (y = y_start; y < ymax; y++) { dest.y = y * display_zoom; - SDL_FillRect(surface, &dest, getpixel(x, y)); + SDL_FillRect(surface, &dest, (Uint32)getpixel(x, y)); } } SDL_UnlockSurface(surface); +} + +void sdl_gui_update(SDL_Surface *surface, int x_start, int y_start, int width, + int height, int max_x, int max_y, int ui_x, int ui_y) +{ + int xmax, ymax; + + ymax = y_start + height; + xmax = x_start + width; + + if(xmax > max_x) + xmax = max_x; + if(ymax >= max_y) + ymax = max_y; + + SDL_Rect src = {x_start * display_zoom, y_start * display_zoom, + xmax * display_zoom, ymax * display_zoom}; + SDL_Rect dest= {(ui_x + x_start) * display_zoom, (ui_y + y_start) * display_zoom, + xmax * display_zoom, ymax * display_zoom}; - SDL_Rect src = {x_start * display_zoom, y_start * display_zoom, xmax * display_zoom, ymax * display_zoom}; - dest.x = (ui_x + x_start) * display_zoom; - dest.y = (ui_y + y_start) * display_zoom;; - dest.w = xmax * display_zoom; - dest.h = ymax * display_zoom; - SDL_BlitSurface(surface, &src, gui_surface, &dest); SDL_UpdateRect(gui_surface, dest.x, dest.y, dest.w, dest.h); SDL_Flip(gui_surface); } /* set a range of bitmap indices to a gradient from startcolour to endcolour */ -void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end, int steps) +void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end, + int first, int steps) { int i; SDL_Color palette[steps]; @@ -78,6 +92,6 @@ void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end, in palette[i].b = start->b + (end->b - start->b) * i / (steps - 1); } - SDL_SetPalette(surface, SDL_LOGPAL|SDL_PHYSPAL, palette, 0, steps); + SDL_SetPalette(surface, SDL_LOGPAL|SDL_PHYSPAL, palette, first, steps); } diff --git a/uisimulator/sdl/lcd-sdl.h b/uisimulator/sdl/lcd-sdl.h index d371639a64..10c2ea74b5 100644 --- a/uisimulator/sdl/lcd-sdl.h +++ b/uisimulator/sdl/lcd-sdl.h @@ -27,11 +27,14 @@ extern int display_zoom; void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width, - int height, int max_x, int max_y, int ui_x, int ui_y, - Uint32 (*getpixel)(int, int)); + int height, int max_x, int max_y, + unsigned long (*getpixel)(int, int)); + +void sdl_gui_update(SDL_Surface *surface, int x_start, int y_start, int width, + int height, int max_x, int max_y, int ui_x, int ui_y); void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end, - int steps); + int first, int steps); #endif // #ifndef __LCDSDL_H__ |