A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 343 lines 12 kB view raw
1/*************************************************************************** 2 * __________ __ ___. 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 * \/ \/ \/ \/ \/ 8 * $Id$ 9 * 10 * Copyright (C) 2005 by Kevin Ferrare 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 <stdio.h> 23#include "config.h" 24#include <lcd.h> 25#ifdef HAVE_REMOTE_LCD 26#include <lcd-remote.h> 27#endif 28#include "scroll_engine.h" 29#include <font.h> 30#include <button.h> 31#include <settings.h> 32#include <kernel.h> 33#include <icons.h> 34 35#include "backlight.h" 36#include "screen_access.h" 37#include "backdrop.h" 38#include "viewport.h" 39 40/* some helper functions to calculate metrics on the fly */ 41static int screen_helper_getcharwidth(void) 42{ 43 return font_get(lcd_getfont())->maxwidth; 44} 45 46static int screen_helper_getcharheight(void) 47{ 48 return font_get(lcd_getfont())->height; 49} 50 51static int screen_helper_getnblines(void) 52{ 53 int height=screens[0].lcdheight; 54 if(global_settings.statusbar != STATUSBAR_OFF) 55 height -= STATUSBAR_HEIGHT; 56 return height / screens[0].getcharheight(); 57} 58 59void screen_helper_setfont(int font) 60{ 61 (void)font; 62 if (font == FONT_UI) 63 font = global_status.font_id[SCREEN_MAIN]; 64 lcd_setfont(font); 65} 66 67static int screen_helper_getuifont(void) 68{ 69 return global_status.font_id[SCREEN_MAIN]; 70} 71 72static void screen_helper_setuifont(int font) 73{ 74 global_status.font_id[SCREEN_MAIN] = font; 75} 76 77static void screen_helper_set_drawmode(int mode) 78{ 79 lcd_set_drawmode(mode); 80} 81 82static void screen_helper_put_line(int x, int y, struct line_desc *line, 83 const char *fmt, ...) 84{ 85 va_list ap; 86 va_start(ap, fmt); 87 vput_line(&screens[SCREEN_MAIN], x, y, line, fmt, ap); 88 va_end(ap); 89} 90 91void screen_helper_lcd_viewport_set_buffer(struct viewport *vp, struct frame_buffer_t *buffer) 92{ 93 viewport_set_buffer(vp, buffer, SCREEN_MAIN); 94} 95 96#if NB_SCREENS == 2 97void screen_helper_lcd_remote_viewport_set_buffer(struct viewport *vp, struct frame_buffer_t *buffer) 98{ 99 viewport_set_buffer(vp, buffer, SCREEN_REMOTE); 100} 101 102static int screen_helper_remote_getcharwidth(void) 103{ 104 return font_get(lcd_remote_getfont())->maxwidth; 105} 106 107static int screen_helper_remote_getcharheight(void) 108{ 109 return font_get(lcd_remote_getfont())->height; 110} 111 112static int screen_helper_remote_getnblines(void) 113{ 114 int height=screens[1].lcdheight; 115 if(global_settings.statusbar != STATUSBAR_OFF) 116 height -= STATUSBAR_HEIGHT; 117 return height / screens[1].getcharheight(); 118} 119 120void screen_helper_remote_setfont(int font) 121{ 122 if (font == FONT_UI) 123 font = global_status.font_id[SCREEN_REMOTE]; 124 lcd_remote_setfont(font); 125} 126 127static int screen_helper_remote_getuifont(void) 128{ 129 return global_status.font_id[SCREEN_REMOTE]; 130} 131 132static void screen_helper_remote_setuifont(int font) 133{ 134 global_status.font_id[SCREEN_REMOTE] = font; 135} 136 137static void screen_helper_remote_put_line(int x, int y, struct line_desc *line, 138 const char *fmt, ...) 139{ 140 va_list ap; 141 va_start(ap, fmt); 142 vput_line(&screens[SCREEN_REMOTE], x, y, line, fmt, ap); 143 va_end(ap); 144} 145 146#endif 147 148struct screen screens[NB_SCREENS] = 149{ 150 { 151 .screen_type=SCREEN_MAIN, 152 .lcdwidth=LCD_WIDTH, 153 .lcdheight=LCD_HEIGHT, 154 .depth=LCD_DEPTH, 155 .getnblines=&screen_helper_getnblines, 156#if defined(HAVE_LCD_COLOR) 157 .is_color=true, 158#else 159 .is_color=false, 160#endif 161 .pixel_format=LCD_PIXELFORMAT, 162 .getcharwidth=screen_helper_getcharwidth, 163 .getcharheight=screen_helper_getcharheight, 164#if (CONFIG_LED == LED_VIRTUAL) 165 .has_disk_led=false, 166#elif defined(HAVE_REMOTE_LCD) 167 .has_disk_led=true, 168#endif 169 .set_drawmode=&screen_helper_set_drawmode, 170 .init_viewport=&lcd_init_viewport, 171 .set_viewport=&lcd_set_viewport, 172 .set_viewport_ex=&lcd_set_viewport_ex, 173 .viewport_set_buffer = &screen_helper_lcd_viewport_set_buffer, 174 .current_viewport = &lcd_current_viewport, 175 .getwidth=&lcd_getwidth, 176 .getheight=&lcd_getheight, 177 .getstringsize=&lcd_getstringsize, 178 .setfont=screen_helper_setfont, 179 .getuifont=screen_helper_getuifont, 180 .setuifont=screen_helper_setuifont, 181 .mono_bitmap=&lcd_mono_bitmap, 182 .mono_bitmap_part=&lcd_mono_bitmap_part, 183 .bitmap=(screen_bitmap_func*)&lcd_bitmap, 184 .bitmap_part=(screen_bitmap_part_func*)&lcd_bitmap_part, 185#if LCD_DEPTH <= 2 186 /* No transparency yet for grayscale and mono lcd */ 187 .transparent_bitmap=(screen_bitmap_func*)&lcd_bitmap, 188 .transparent_bitmap_part=(screen_bitmap_part_func*)&lcd_bitmap_part, 189#else 190 .transparent_bitmap=(screen_bitmap_func*)&lcd_bitmap_transparent, 191 .transparent_bitmap_part=(screen_bitmap_part_func*)&lcd_bitmap_transparent_part, 192#endif 193 .bmp = &lcd_bmp, 194 .bmp_part = &lcd_bmp_part, 195 .nine_segment_bmp = &lcd_nine_segment_bmp, 196#if LCD_DEPTH > 1 197#if defined(HAVE_LCD_COLOR) && defined(LCD_REMOTE_DEPTH) && LCD_REMOTE_DEPTH > 1 198 .color_to_native=&lcd_color_to_native, 199#endif 200 .get_background=&lcd_get_background, 201 .get_foreground=&lcd_get_foreground, 202 .set_background=&lcd_set_background, 203 .set_foreground=&lcd_set_foreground, 204 .set_drawinfo = &lcd_set_drawinfo, 205#endif /* LCD_DEPTH > 1 */ 206 .update_rect=&lcd_update_rect, 207 .update_viewport_rect=&lcd_update_viewport_rect, 208 .fillrect=&lcd_fillrect, 209 .drawrect=&lcd_drawrect, 210 .draw_border_viewport=&lcd_draw_border_viewport, 211 .fill_viewport=&lcd_fill_viewport, 212 .drawpixel=&lcd_drawpixel, 213 .drawline=&lcd_drawline, 214 .vline=&lcd_vline, 215 .hline=&lcd_hline, 216 .scroll_step=&lcd_scroll_step, 217 218 .putsxy=&lcd_putsxy, 219 .puts=&lcd_puts, 220 .putsf=&lcd_putsf, 221 .putsxyf=&lcd_putsxyf, 222 .puts_scroll=&lcd_puts_scroll, 223 .putsxy_scroll_func=&lcd_putsxy_scroll_func, 224 .scroll_speed=&lcd_scroll_speed, 225 .scroll_delay=&lcd_scroll_delay, 226 .clear_display=&lcd_clear_display, 227 .clear_viewport=&lcd_clear_viewport, 228 .scroll_stop_viewport_rect=&lcd_scroll_stop_viewport_rect, 229 .scroll_stop=&lcd_scroll_stop, 230 .scroll_stop_viewport=&lcd_scroll_stop_viewport, 231 .update=&lcd_update, 232 .update_viewport=&lcd_update_viewport, 233 .backlight_on=&backlight_on, 234 .backlight_off=&backlight_off, 235 .is_backlight_on=&is_backlight_on, 236 .backlight_set_timeout=&backlight_set_timeout, 237#if LCD_DEPTH > 1 238 .backdrop_load=&backdrop_load, 239 .backdrop_show=&backdrop_show, 240#endif 241#if defined(HAVE_LCD_COLOR) 242 .gradient_fillrect = lcd_gradient_fillrect, 243 .gradient_fillrect_part = lcd_gradient_fillrect_part, 244#endif 245 .put_line = screen_helper_put_line, 246 }, 247#if NB_SCREENS == 2 248 { 249 .screen_type=SCREEN_REMOTE, 250 .lcdwidth=LCD_REMOTE_WIDTH, 251 .lcdheight=LCD_REMOTE_HEIGHT, 252 .depth=LCD_REMOTE_DEPTH, 253 .getnblines=&screen_helper_remote_getnblines, 254 .is_color=false,/* No color remotes yet */ 255 .pixel_format=LCD_REMOTE_PIXELFORMAT, 256 .getcharwidth=screen_helper_remote_getcharwidth, 257 .getcharheight=screen_helper_remote_getcharheight, 258 .has_disk_led=false, 259 .set_drawmode=&lcd_remote_set_drawmode, 260 .init_viewport=&lcd_remote_init_viewport, 261 .set_viewport=&lcd_remote_set_viewport, 262 .set_viewport_ex=&lcd_remote_set_viewport_ex, 263 .viewport_set_buffer = &screen_helper_lcd_remote_viewport_set_buffer, 264 .current_viewport = &lcd_remote_current_viewport, 265 .getwidth=&lcd_remote_getwidth, 266 .getheight=&lcd_remote_getheight, 267 .getstringsize=&lcd_remote_getstringsize, 268#if 1 /* all remote LCDs are bitmapped so far */ 269 .setfont=screen_helper_remote_setfont, 270 .getuifont=screen_helper_remote_getuifont, 271 .setuifont=screen_helper_remote_setuifont, 272 .mono_bitmap=&lcd_remote_mono_bitmap, 273 .mono_bitmap_part=&lcd_remote_mono_bitmap_part, 274 .bitmap=(screen_bitmap_func*)&lcd_remote_bitmap, 275 .bitmap_part=(screen_bitmap_part_func*)&lcd_remote_bitmap_part, 276#if LCD_REMOTE_DEPTH <= 2 277 /* No transparency yet for grayscale and mono lcd */ 278 .transparent_bitmap=(screen_bitmap_func*)&lcd_remote_bitmap, 279 .transparent_bitmap_part=(screen_bitmap_part_func*)&lcd_remote_bitmap_part, 280 /* No colour remotes yet */ 281#endif 282 .bmp = &lcd_remote_bmp, 283 .bmp_part = &lcd_remote_bmp_part, 284 .nine_segment_bmp = &lcd_remote_nine_segment_bmp, 285#if LCD_REMOTE_DEPTH > 1 286#if defined(HAVE_LCD_COLOR) 287 .color_to_native=&lcd_remote_color_to_native, 288#endif 289 .get_background=&lcd_remote_get_background, 290 .get_foreground=&lcd_remote_get_foreground, 291 .set_background=&lcd_remote_set_background, 292 .set_foreground=&lcd_remote_set_foreground, 293 .set_drawinfo = &lcd_remote_set_drawinfo, 294#endif /* LCD_REMOTE_DEPTH > 1 */ 295 .update_rect=&lcd_remote_update_rect, 296 .update_viewport_rect=&lcd_remote_update_viewport_rect, 297 .fillrect=&lcd_remote_fillrect, 298 .drawrect=&lcd_remote_drawrect, 299 .draw_border_viewport=&lcd_remote_draw_border_viewport, 300 .fill_viewport=&lcd_remote_fill_viewport, 301 .drawpixel=&lcd_remote_drawpixel, 302 .drawline=&lcd_remote_drawline, 303 .vline=&lcd_remote_vline, 304 .hline=&lcd_remote_hline, 305 .scroll_step=&lcd_remote_scroll_step, 306#endif /* 1 */ 307 308 .putsxy=&lcd_remote_putsxy, 309 .puts=&lcd_remote_puts, 310 .putsf=&lcd_remote_putsf, 311 .putsxyf=&lcd_remote_putsxyf, 312 .puts_scroll=&lcd_remote_puts_scroll, 313 .putsxy_scroll_func=&lcd_remote_putsxy_scroll_func, 314 .scroll_speed=&lcd_remote_scroll_speed, 315 .scroll_delay=&lcd_remote_scroll_delay, 316 .clear_display=&lcd_remote_clear_display, 317 .clear_viewport=&lcd_remote_clear_viewport, 318 .scroll_stop_viewport_rect=&lcd_remote_scroll_stop_viewport_rect, 319 .scroll_stop=&lcd_remote_scroll_stop, 320 .scroll_stop_viewport=&lcd_remote_scroll_stop_viewport, 321 .update=&lcd_remote_update, 322 .update_viewport=&lcd_remote_update_viewport, 323 .backlight_on=&remote_backlight_on, 324 .backlight_off=&remote_backlight_off, 325 .is_backlight_on=&is_remote_backlight_on, 326 .backlight_set_timeout=&remote_backlight_set_timeout, 327 328#if LCD_DEPTH > 1 329 .backdrop_load=&remote_backdrop_load, 330 .backdrop_show=&remote_backdrop_show, 331#endif 332 .put_line = screen_helper_remote_put_line, 333 } 334#endif /* NB_SCREENS == 2 */ 335}; 336 337void screen_clear_area(struct screen * display, int xstart, int ystart, 338 int width, int height) 339{ 340 display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID); 341 display->fillrect(xstart, ystart, width, height); 342 display->set_drawmode(DRMODE_SOLID); 343}