Fix player and greyscale reds.
[kugel-rb/myfork.git] / apps / gui / viewport.c
blobfbbd4eab5a61401ba1b27243aeca03db7766069e
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2008 by Jonathan Gordon
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.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include <stdlib.h>
23 #include "config.h"
24 #include "lcd.h"
25 #include "lcd-remote.h"
26 #include "font.h"
27 #include "sprintf.h"
28 #include "string.h"
29 #include "settings.h"
30 #include "kernel.h"
31 #include "system.h"
32 #include "misc.h"
33 #include "viewport.h"
34 #include "statusbar.h"
35 #include "screen_access.h"
36 #include "appevents.h"
40 #ifdef HAVE_LCD_COLOR
41 #define LINE_SEL_FROM_SETTINGS(vp) \
42 do { \
43 vp->lss_pattern = global_settings.lss_color; \
44 vp->lse_pattern = global_settings.lse_color; \
45 vp->lst_pattern = global_settings.lst_color; \
46 } while (0)
47 #else
48 #define LINE_SEL_FROM_SETTINGS(vp)
49 #endif
51 #ifdef HAVE_LCD_COLOR
52 #define FG_FALLBACK global_settings.fg_color
53 #define BG_FALLBACK global_settings.bg_color
54 #else
55 #define FG_FALLBACK LCD_DEFAULT_FG
56 #define BG_FALLBACK LCD_DEFAULT_FG
57 #endif
59 static int statusbar_enabled = 0;
61 int viewport_get_nb_lines(struct viewport *vp)
63 #ifdef HAVE_LCD_BITMAP
64 return vp->height/font_get(vp->font)->height;
65 #else
66 (void)vp;
67 return 2;
68 #endif
71 static bool showing_bars(enum screen_type screen)
73 if (statusbar_enabled & VP_SB_ONSCREEN(screen))
75 #ifdef HAVE_LCD_BITMAP
76 bool ignore = statusbar_enabled & VP_SB_IGNORE_SETTING(screen);
77 return ignore || (statusbar_position(screen));
78 #else
79 return true;
80 #endif
82 return false;
85 void viewport_set_defaults(struct viewport *vp, enum screen_type screen)
87 vp->x = 0;
88 vp->width = screens[screen].lcdwidth;
90 #ifdef HAVE_LCD_BITMAP
91 vp->drawmode = DRMODE_SOLID;
92 vp->font = FONT_UI; /* default to UI to discourage SYSFONT use */
94 vp->height = screens[screen].lcdheight;
95 if (statusbar_position(screen) != STATUSBAR_BOTTOM && showing_bars(screen))
96 vp->y = STATUSBAR_HEIGHT;
97 else
98 vp->y = 0;
99 #else
100 vp->y = 0;
101 #endif
102 vp->height = screens[screen].lcdheight - (showing_bars(screen)?STATUSBAR_HEIGHT:0);
104 #if LCD_DEPTH > 1
105 #ifdef HAVE_REMOTE_LCD
106 /* We only need this test if there is a remote LCD */
107 if (screen == SCREEN_MAIN)
108 #endif
110 vp->fg_pattern = FG_FALLBACK;
111 vp->bg_pattern = BG_FALLBACK;
112 LINE_SEL_FROM_SETTINGS(vp);
114 #endif
116 #if defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
117 if (screen == SCREEN_REMOTE)
119 vp->fg_pattern = LCD_REMOTE_DEFAULT_FG;
120 vp->bg_pattern = LCD_REMOTE_DEFAULT_BG;
122 #endif
126 int viewportmanager_set_statusbar(int enabled)
128 int old = statusbar_enabled;
129 statusbar_enabled = enabled;
130 if (enabled)
132 int i;
133 FOR_NB_SCREENS(i)
135 if (showing_bars(i))
136 gui_statusbar_draw(&statusbars.statusbars[i], true);
138 add_event(GUI_EVENT_ACTIONUPDATE, false, viewportmanager_draw_statusbars);
140 else
142 remove_event(GUI_EVENT_ACTIONUPDATE, viewportmanager_draw_statusbars);
144 return old;
147 void viewportmanager_draw_statusbars(void* data)
149 int i;
151 FOR_NB_SCREENS(i)
153 if (showing_bars(i))
154 gui_statusbar_draw(&statusbars.statusbars[i], (bool)data);
158 void viewportmanager_statusbar_changed(void* data)
160 (void)data;
161 statusbar_enabled = 0;
162 if (global_settings.statusbar != STATUSBAR_OFF)
163 statusbar_enabled = VP_SB_ONSCREEN(SCREEN_MAIN);
164 #ifdef HAVE_REMOTE_LCD
165 if (global_settings.remote_statusbar != STATUSBAR_OFF)
166 statusbar_enabled |= VP_SB_ONSCREEN(SCREEN_REMOTE);
167 #endif
168 viewportmanager_set_statusbar(statusbar_enabled);
171 #ifdef HAVE_LCD_BITMAP
172 const char* viewport_parse_viewport(struct viewport *vp,
173 enum screen_type screen,
174 const char *bufptr,
175 const char separator)
177 /* parse the list to the viewport struct */
178 const char *ptr = bufptr;
179 int depth;
180 uint32_t set = 0;
182 enum {
183 PL_X = 0,
184 PL_Y,
185 PL_WIDTH,
186 PL_HEIGHT,
187 PL_FONT,
188 PL_FG,
189 PL_BG,
192 /* Work out the depth of this display */
193 depth = screens[screen].depth;
194 #ifdef HAVE_LCD_COLOR
195 if (depth == 16)
197 if (!(ptr = parse_list("dddddcc", &set, separator, ptr, &vp->x, &vp->y, &vp->width,
198 &vp->height, &vp->font, &vp->fg_pattern,&vp->bg_pattern)))
199 return VP_ERROR;
201 else
202 #endif
203 #if (LCD_DEPTH == 2) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 2)
204 if (depth == 2) {
205 if (!(ptr = parse_list("dddddgg", &set, separator, ptr, &vp->x, &vp->y, &vp->width,
206 &vp->height, &vp->font, &vp->fg_pattern, &vp->bg_pattern)))
207 return VP_ERROR;
209 else
210 #endif
211 #if (LCD_DEPTH == 1) || (defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH == 1)
212 if (depth == 1)
214 if (!(ptr = parse_list("ddddd", &set, separator, ptr, &vp->x, &vp->y, &vp->width,
215 &vp->height, &vp->font)))
216 return VP_ERROR;
218 else
219 #endif
222 /* X and Y *must* be set */
223 if (!LIST_VALUE_PARSED(set, PL_X) || !LIST_VALUE_PARSED(set, PL_Y))
224 return VP_ERROR;
226 /* fix defaults */
227 if (!LIST_VALUE_PARSED(set, PL_WIDTH))
228 vp->width = screens[screen].lcdwidth - vp->x;
229 if (!LIST_VALUE_PARSED(set, PL_HEIGHT))
230 vp->height = screens[screen].lcdheight - vp->y;
232 #if LCD_DEPTH > 1 || LCD_REMOTE_DEPTH > 1
233 if (!LIST_VALUE_PARSED(set, PL_FG))
234 vp->fg_pattern = FG_FALLBACK;
235 if (!LIST_VALUE_PARSED(set, PL_BG))
236 vp->bg_pattern = BG_FALLBACK;
237 #endif /* LCD_DEPTH > 1 || LCD_REMOTE_DEPTH > 1 */
239 LINE_SEL_FROM_SETTINGS(vp);
241 /* Validate the viewport dimensions - we know that the numbers are
242 non-negative integers, ignore bars and assume the viewport takes them
243 * into account */
244 if ((vp->x >= screens[screen].lcdwidth) ||
245 ((vp->x + vp->width) > screens[screen].lcdwidth) ||
246 (vp->y >= screens[screen].lcdheight) ||
247 ((vp->y + vp->height) > screens[screen].lcdheight))
249 return VP_ERROR;
252 /* Default to using the user font if the font was an invalid number or '-'*/
253 if (((vp->font != FONT_SYSFIXED) && (vp->font != FONT_UI))
254 || !LIST_VALUE_PARSED(set, PL_FONT)
256 vp->font = FONT_UI;
258 vp->drawmode = DRMODE_SOLID;
260 return ptr;
263 #endif /* HAVE_LCD_BITMAP */