diff options
Diffstat (limited to 'firmware/target/hosted/sdl/lcd-sdl.c')
-rw-r--r-- | firmware/target/hosted/sdl/lcd-sdl.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/firmware/target/hosted/sdl/lcd-sdl.c b/firmware/target/hosted/sdl/lcd-sdl.c new file mode 100644 index 0000000000..15e4ba95c3 --- /dev/null +++ b/firmware/target/hosted/sdl/lcd-sdl.c | |||
@@ -0,0 +1,113 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2006 Dan Everton | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #include <SDL.h> | ||
23 | #include "lcd-sdl.h" | ||
24 | #include "sim-ui-defines.h" | ||
25 | #include "system.h" /* for MIN() and MAX() */ | ||
26 | |||
27 | int display_zoom = 1; | ||
28 | |||
29 | void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width, | ||
30 | int height, int max_x, int max_y, | ||
31 | unsigned long (*getpixel)(int, int)) | ||
32 | { | ||
33 | int x, y; | ||
34 | int xmax, ymax; | ||
35 | SDL_Rect dest; | ||
36 | |||
37 | ymax = y_start + height; | ||
38 | xmax = x_start + width; | ||
39 | |||
40 | if(xmax > max_x) | ||
41 | xmax = max_x; | ||
42 | if(ymax >= max_y) | ||
43 | ymax = max_y; | ||
44 | |||
45 | SDL_LockSurface(surface); | ||
46 | |||
47 | dest.w = display_zoom; | ||
48 | dest.h = display_zoom; | ||
49 | |||
50 | for (x = x_start; x < xmax; x++) { | ||
51 | dest.x = x * display_zoom; | ||
52 | |||
53 | #ifdef HAVE_LCD_SPLIT | ||
54 | for (y = y_start; y < MIN(ymax, LCD_SPLIT_POS); y++) { | ||
55 | dest.y = y * display_zoom; | ||
56 | |||
57 | SDL_FillRect(surface, &dest, (Uint32)(getpixel(x, y) | 0x80)); | ||
58 | } | ||
59 | for (y = MAX(y_start, LCD_SPLIT_POS); y < ymax; y++) { | ||
60 | dest.y = (y + LCD_SPLIT_LINES) * display_zoom ; | ||
61 | |||
62 | SDL_FillRect(surface, &dest, (Uint32)getpixel(x, y)); | ||
63 | } | ||
64 | #else | ||
65 | for (y = y_start; y < ymax; y++) { | ||
66 | dest.y = y * display_zoom; | ||
67 | |||
68 | SDL_FillRect(surface, &dest, (Uint32)getpixel(x, y)); | ||
69 | } | ||
70 | #endif | ||
71 | } | ||
72 | |||
73 | SDL_UnlockSurface(surface); | ||
74 | } | ||
75 | |||
76 | void sdl_gui_update(SDL_Surface *surface, int x_start, int y_start, int width, | ||
77 | int height, int max_x, int max_y, int ui_x, int ui_y) | ||
78 | { | ||
79 | if (x_start + width > max_x) | ||
80 | width = max_x - x_start; | ||
81 | if (y_start + height > max_y) | ||
82 | height = max_y - y_start; | ||
83 | |||
84 | SDL_Rect src = {x_start * display_zoom, y_start * display_zoom, | ||
85 | width * display_zoom, height * display_zoom}; | ||
86 | SDL_Rect dest= {(ui_x + x_start) * display_zoom, | ||
87 | (ui_y + y_start) * display_zoom, | ||
88 | width * display_zoom, height * display_zoom}; | ||
89 | |||
90 | if (surface->flags & SDL_SRCALPHA) /* alpha needs a black background */ | ||
91 | SDL_FillRect(gui_surface, &dest, 0); | ||
92 | |||
93 | SDL_BlitSurface(surface, &src, gui_surface, &dest); | ||
94 | |||
95 | SDL_Flip(gui_surface); | ||
96 | } | ||
97 | |||
98 | /* set a range of bitmap indices to a gradient from startcolour to endcolour */ | ||
99 | void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end, | ||
100 | int first, int steps) | ||
101 | { | ||
102 | int i; | ||
103 | SDL_Color palette[steps]; | ||
104 | |||
105 | for (i = 0; i < steps; i++) { | ||
106 | palette[i].r = start->r + (end->r - start->r) * i / (steps - 1); | ||
107 | palette[i].g = start->g + (end->g - start->g) * i / (steps - 1); | ||
108 | palette[i].b = start->b + (end->b - start->b) * i / (steps - 1); | ||
109 | } | ||
110 | |||
111 | SDL_SetPalette(surface, SDL_LOGPAL|SDL_PHYSPAL, palette, first, steps); | ||
112 | } | ||
113 | |||