| /*************************************************************************** |
| * __________ __ ___. |
| * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| * \/ \/ \/ \/ \/ |
| * $Id$ |
| * |
| * Copyright (C) 2007 Nicolas Pennequin |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version 2 |
| * of the License, or (at your option) any later version. |
| * |
| * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| * KIND, either express or implied. |
| * |
| ****************************************************************************/ |
| |
| /* This stuff is for the wps engine only.. anyone caught using this outside |
| * of apps/gui/wps_engine will be shot on site! */ |
| |
| #ifndef _WPS_ENGINE_INTERNALS_ |
| #define _WPS_ENGINE_INTERNALS_ |
| /* Timeout unit expressed in HZ. In WPS, all timeouts are given in seconds |
| (possibly with a decimal fraction) but stored as integer values. |
| E.g. 2.5 is stored as 25. This means 25 tenth of a second, i.e. 25 units. |
| */ |
| #define TIMEOUT_UNIT (HZ/10) /* I.e. 0.1 sec */ |
| #define DEFAULT_SUBLINE_TIME_MULTIPLIER 20 /* In TIMEOUT_UNIT's */ |
| |
| #include "skin_tokens.h" |
| |
| |
| /* TODO: sort this mess out */ |
| |
| #include "screen_access.h" |
| #include "statusbar.h" |
| #include "metadata.h" |
| |
| /* constants used in line_type and as refresh_mode for wps_refresh */ |
| #define WPS_REFRESH_STATIC (1u<<0) /* line doesn't change over time */ |
| #define WPS_REFRESH_DYNAMIC (1u<<1) /* line may change (e.g. time flag) */ |
| #define WPS_REFRESH_SCROLL (1u<<2) /* line scrolls */ |
| #define WPS_REFRESH_PLAYER_PROGRESS (1u<<3) /* line contains a progress bar */ |
| #define WPS_REFRESH_PEAK_METER (1u<<4) /* line contains a peak meter */ |
| #define WPS_REFRESH_STATUSBAR (1u<<5) /* refresh statusbar */ |
| #define WPS_REFRESH_ALL (0xffffffffu) /* to refresh all line types */ |
| |
| /* to refresh only those lines that change over time */ |
| #define WPS_REFRESH_NON_STATIC (WPS_REFRESH_DYNAMIC| \ |
| WPS_REFRESH_PLAYER_PROGRESS| \ |
| WPS_REFRESH_PEAK_METER) |
| /* alignments */ |
| #define WPS_ALIGN_RIGHT 32 |
| #define WPS_ALIGN_CENTER 64 |
| #define WPS_ALIGN_LEFT 128 |
| |
| #ifdef HAVE_ALBUMART |
| |
| /* albumart definitions */ |
| #define WPS_ALBUMART_NONE 0 /* WPS does not contain AA tag */ |
| #define WPS_ALBUMART_CHECK 1 /* WPS contains AA conditional tag */ |
| #define WPS_ALBUMART_LOAD 2 /* WPS contains AA tag */ |
| |
| #define WPS_ALBUMART_ALIGN_RIGHT 1 /* x align: right */ |
| #define WPS_ALBUMART_ALIGN_CENTER 2 /* x/y align: center */ |
| #define WPS_ALBUMART_ALIGN_LEFT 4 /* x align: left */ |
| #define WPS_ALBUMART_ALIGN_TOP 1 /* y align: top */ |
| #define WPS_ALBUMART_ALIGN_BOTTOM 4 /* y align: bottom */ |
| |
| #endif /* HAVE_ALBUMART */ |
| |
| /* wps_data*/ |
| |
| #ifdef HAVE_LCD_BITMAP |
| struct gui_img { |
| struct viewport* vp; /* The viewport to display this image in */ |
| short int x; /* x-pos */ |
| short int y; /* y-pos */ |
| short int num_subimages; /* number of sub-images */ |
| short int subimage_height; /* height of each sub-image */ |
| short int display; /* -1 for no display, 0..n to display a subimage */ |
| struct bitmap bm; |
| char label; |
| bool loaded; /* load state */ |
| bool always_display; /* not using the preload/display mechanism */ |
| }; |
| |
| |
| struct progressbar { |
| enum wps_token_type type; |
| struct viewport *vp; |
| /* regular pb */ |
| short x; |
| /* >=0: explicitly set in the tag -> y-coord within the viewport |
| <0 : not set in the tag -> negated 1-based line number within |
| the viewport. y-coord will be computed based on the font height */ |
| short y; |
| short width; |
| short height; |
| bool follow_lang_direction; |
| /*progressbar image*/ |
| struct bitmap bm; |
| bool have_bitmap_pb; |
| |
| bool draw; |
| }; |
| #endif |
| |
| |
| |
| struct align_pos { |
| char* left; |
| char* center; |
| char* right; |
| }; |
| |
| #ifdef HAVE_LCD_BITMAP |
| |
| #define MAX_IMAGES (26*2) /* a-z and A-Z */ |
| #define MAX_PROGRESSBARS 3 |
| |
| /* The image buffer is big enough to store one full-screen native bitmap, |
| plus two full-screen mono bitmaps. */ |
| |
| #define WPS_MAX_VIEWPORTS 24 |
| #define WPS_MAX_LINES ((LCD_HEIGHT/5+1) * 2) |
| #define WPS_MAX_SUBLINES (WPS_MAX_LINES*3) |
| #define WPS_MAX_TOKENS 1024 |
| #define WPS_MAX_STRINGS 128 |
| #define STRING_BUFFER_SIZE 1024 |
| #define WPS_MAX_COND_LEVEL 10 |
| |
| #else |
| |
| #define WPS_MAX_VIEWPORTS 2 |
| #define WPS_MAX_LINES 2 |
| #define WPS_MAX_SUBLINES 12 |
| #define WPS_MAX_TOKENS 64 |
| #define WPS_MAX_STRINGS 32 |
| #define STRING_BUFFER_SIZE 64 |
| #define WPS_MAX_COND_LEVEL 5 |
| |
| #endif |
| |
| #define SUBLINE_RESET -1 |
| |
| enum wps_parse_error { |
| PARSE_OK, |
| PARSE_FAIL_UNCLOSED_COND, |
| PARSE_FAIL_INVALID_CHAR, |
| PARSE_FAIL_COND_SYNTAX_ERROR, |
| PARSE_FAIL_COND_INVALID_PARAM, |
| PARSE_FAIL_LIMITS_EXCEEDED, |
| }; |
| |
| |
| /* Description of a subline on the WPS */ |
| struct skin_subline { |
| |
| /* Index of the first token for this subline in the token array. |
| Tokens of this subline end where tokens for the next subline |
| begin. */ |
| unsigned short first_token_idx; |
| unsigned short last_token_idx; |
| |
| /* Bit or'ed WPS_REFRESH_xxx */ |
| unsigned char line_type; |
| |
| /* How long the subline should be displayed, in 10ths of sec */ |
| unsigned char time_mult; |
| |
| /* pointer to the next subline in this line */ |
| struct skin_subline *next; |
| }; |
| |
| /* Description of a line on the WPS. A line is a set of sublines. |
| A subline is displayed for a certain amount of time. After that, |
| the next subline of the line is displayed. And so on. */ |
| struct skin_line { |
| |
| /* Linked list of all the sublines on this line, |
| * a line *must* have at least one subline so no need to add an extra pointer */ |
| struct skin_subline sublines; |
| /* pointer to the current subline */ |
| struct skin_subline *curr_subline; |
| |
| /* When the next subline of this line should be displayed |
| (absolute time value in ticks) */ |
| long subline_expire_time; |
| |
| /* pointer to the next line */ |
| struct skin_line *next; |
| }; |
| |
| #define VP_DRAW_HIDEABLE 0x1 |
| #define VP_DRAW_HIDDEN 0x2 |
| #define VP_DRAW_WASHIDDEN 0x4 |
| /* these are never drawn, nor cleared, i.e. just ignored */ |
| #define VP_NEVER_VISIBLE 0x8 |
| #define VP_DEFAULT_LABEL '|' |
| #define VP_NO_LABEL '-' |
| #define VP_INFO_LABEL 0x80 |
| struct skin_viewport { |
| struct viewport vp; /* The LCD viewport struct */ |
| struct skin_line *lines; |
| char hidden_flags; |
| char label; |
| unsigned start_fgcolour; |
| unsigned start_bgcolour; |
| }; |
| struct viewport_colour { |
| struct viewport *vp; |
| unsigned colour; |
| }; |
| #ifdef HAVE_TOUCHSCREEN |
| struct touchregion { |
| struct skin_viewport* wvp;/* The viewport this region is in */ |
| short int x; /* x-pos */ |
| short int y; /* y-pos */ |
| short int width; /* width */ |
| short int height; /* height */ |
| enum { |
| WPS_TOUCHREGION_ACTION, |
| WPS_TOUCHREGION_SCROLLBAR, |
| WPS_TOUCHREGION_VOLUME |
| } type; /* type of touch region */ |
| bool repeat; /* requires the area be held for the action */ |
| int action; /* action this button will return */ |
| bool armed; /* A region is armed on press. Only armed regions are triggered |
| on repeat or release. */ |
| }; |
| #endif |
| |
| #define MAX_PLAYLISTLINE_TOKENS 16 |
| #define MAX_PLAYLISTLINE_STRINGS 8 |
| #define MAX_PLAYLISTLINE_STRLEN 8 |
| enum info_line_type { |
| TRACK_HAS_INFO = 0, |
| TRACK_HAS_NO_INFO |
| }; |
| struct playlistviewer { |
| struct viewport *vp; |
| bool show_icons; |
| int start_offset; |
| #ifdef HAVE_TC_RAMCACHE |
| struct mp3entry tempid3; |
| #endif |
| struct { |
| enum wps_token_type tokens[MAX_PLAYLISTLINE_TOKENS]; |
| char strings[MAX_PLAYLISTLINE_STRINGS][MAX_PLAYLISTLINE_STRLEN]; |
| int count; |
| bool scroll; |
| } lines[2]; |
| }; |
| |
| |
| #ifdef HAVE_ALBUMART |
| struct skin_albumart { |
| /* Album art support */ |
| struct viewport *vp;/* The viewport this is in */ |
| int x; |
| int y; |
| int width; |
| int height; |
| |
| bool draw; |
| unsigned char xalign; /* WPS_ALBUMART_ALIGN_LEFT, _CENTER, _RIGHT */ |
| unsigned char yalign; /* WPS_ALBUMART_ALIGN_TOP, _CENTER, _BOTTOM */ |
| unsigned char state; /* WPS_ALBUMART_NONE, _CHECK, _LOAD */ |
| }; |
| #endif |
| |
| /* wps_data |
| this struct holds all necessary data which describes the |
| viewable content of a wps */ |
| struct wps_data |
| { |
| #ifdef HAVE_LCD_BITMAP |
| struct skin_token_list *images; |
| struct skin_token_list *progressbars; |
| #endif |
| #if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1 |
| char *backdrop; |
| #endif |
| |
| #ifdef HAVE_TOUCHSCREEN |
| struct skin_token_list *touchregions; |
| #endif |
| struct skin_token_list *viewports; |
| struct skin_token_list *strings; |
| #ifdef HAVE_ALBUMART |
| struct skin_albumart *albumart; |
| int playback_aa_slot; |
| #endif |
| struct wps_token *tokens; |
| /* Total number of tokens in the WPS. During WPS parsing, this is |
| the index of the token being parsed. */ |
| int num_tokens; |
| |
| #ifdef HAVE_LCD_BITMAP |
| bool peak_meter_enabled; |
| bool wps_sb_tag; |
| bool show_sb_on_wps; |
| #else /*HAVE_LCD_CHARCELLS */ |
| unsigned short wps_progress_pat[8]; |
| bool full_line_progressbar; |
| #endif |
| bool wps_loaded; |
| }; |
| |
| /* wps_data end */ |
| |
| /* wps_state |
| holds the data which belongs to the current played track, |
| the track which will be played afterwards, current path to the track |
| and some status infos */ |
| struct wps_state |
| { |
| struct mp3entry* id3; |
| struct mp3entry* nid3; |
| int ff_rewind_count; |
| bool ff_rewind; |
| bool paused; |
| bool wps_time_countup; |
| bool is_fading; |
| }; |
| |
| /* Holds data for all screens in a skin. */ |
| struct wps_sync_data |
| { |
| /* suitable for the viewportmanager, possibly only temporary here |
| * needs to be same for all screens! can't be split up for screens |
| * due to what viewportmanager_set_statusbar() accepts |
| * (FIXME?) */ |
| int statusbars; |
| /* indicates whether the skin needs a full update for all screens */ |
| bool do_full_update; |
| }; |
| |
| /* change the ff/rew-status |
| if ff_rew = true then we are in skipping mode |
| else we are in normal mode */ |
| /* void wps_state_update_ff_rew(bool ff_rew); Currently unused */ |
| |
| /* change the tag-information of the current played track |
| and the following track */ |
| /* void wps_state_update_id3_nid3(struct mp3entry *id3, struct mp3entry *nid3); Currently unused */ |
| /* wps_state end*/ |
| |
| /* gui_wps |
| defines a wps with its data, state, |
| and the screen on which the wps-content should be drawn */ |
| struct gui_wps |
| { |
| struct screen *display; |
| struct wps_data *data; |
| struct wps_state *state; |
| /* must point to the same struct for all screens */ |
| struct wps_sync_data *sync_data; |
| }; |
| |
| /* gui_wps end */ |
| |
| char *get_image_filename(const char *start, const char* bmpdir, |
| char *buf, int buf_size); |
| /***** wps_tokens.c ******/ |
| |
| const char *get_token_value(struct gui_wps *gwps, |
| struct wps_token *token, |
| char *buf, int buf_size, |
| int *intval); |
| |
| const char *get_id3_token(struct wps_token *token, struct mp3entry *id3, |
| char *buf, int buf_size, int limit, int *intval); |
| #if CONFIG_TUNER |
| const char *get_radio_token(struct wps_token *token, int preset_offset, |
| char *buf, int buf_size, int limit, int *intval); |
| #endif |
| |
| struct gui_img* find_image(char label, struct wps_data *data); |
| struct skin_viewport* find_viewport(char label, struct wps_data *data); |
| |
| |
| #if defined(DEBUG) || defined(SIMULATOR) |
| #define DEBUG_SKIN_ENGINE |
| extern bool debug_wps; |
| #endif |
| |
| #endif |