1 /*****************************************************************************
2 * parser.c : OSD import module
3 *****************************************************************************
4 * Copyright (C) 2007-2008 M2X
7 * Authors: Jean-Paul Saman
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
32 #include <vlc_common.h>
34 #include <vlc_config.h>
37 #include <vlc_image.h>
39 #include <vlc_charset.h>
45 /*****************************************************************************
47 *****************************************************************************/
49 /*****************************************************************************
50 * Create a new Menu structure
51 *****************************************************************************/
52 osd_menu_t *osd_MenuNew( osd_menu_t *p_menu, const char *psz_path,
55 if( !p_menu ) return NULL;
57 p_menu->p_state = (osd_menu_state_t *) malloc( sizeof( osd_menu_state_t ) );
58 if( !p_menu->p_state )
60 msg_Err( p_menu, "Memory allocation for OSD Menu state failed" );
64 memset(p_menu->p_state, 0, sizeof(osd_menu_state_t));
65 if( psz_path != NULL )
66 p_menu->psz_path = strdup( psz_path );
68 p_menu->psz_path = NULL;
72 p_menu->i_style = OSD_MENU_STYLE_SIMPLE;
77 /*****************************************************************************
79 *****************************************************************************/
80 void osd_MenuFree( osd_menu_t *p_menu )
82 msg_Dbg( p_menu, "freeing menu" );
83 osd_ButtonFree( p_menu, p_menu->p_button );
85 free( p_menu->psz_path );
86 free( p_menu->p_state );
88 p_menu->p_button = NULL;
89 p_menu->p_last_button = NULL;
90 p_menu->psz_path = NULL;
91 p_menu->p_state = NULL;
94 /*****************************************************************************
96 *****************************************************************************/
97 osd_button_t *osd_ButtonNew( const char *psz_action, int i_x, int i_y )
99 osd_button_t *p_button = NULL;
100 p_button = (osd_button_t*) malloc( sizeof(osd_button_t) );
104 memset( p_button, 0, sizeof(osd_button_t) );
105 p_button->psz_action = strdup(psz_action);
106 p_button->psz_action_down = NULL;
107 p_button->p_feedback = NULL;
114 /*****************************************************************************
116 *****************************************************************************/
117 void osd_ButtonFree( osd_menu_t *p_menu, osd_button_t *p_button )
119 osd_button_t *p_current = p_button;
120 osd_button_t *p_next = NULL;
121 osd_button_t *p_prev = NULL;
123 if( !p_current ) return;
125 /* First walk to the end. */
126 while( p_current->p_next )
128 p_next = p_current->p_next;
131 /* Then free end first and walk to the start. */
132 while( p_current->p_prev )
134 msg_Dbg( p_menu, "+ freeing button %s [%p]",
135 p_current->psz_action, p_current );
136 p_prev = p_current->p_prev;
138 if( p_current->p_next )
140 free( p_current->p_next->psz_name );
141 free( p_current->p_next->psz_action );
142 free( p_current->p_next->psz_action_down );
143 if( p_current->p_feedback )
145 free( p_current->p_feedback->p_data_orig );
146 free( p_current->p_feedback );
147 p_current->p_feedback = NULL;
150 /* Free all states first */
151 if( p_current->p_next->p_states )
152 osd_StatesFree( p_menu, p_current->p_next->p_states );
154 free( p_current->p_next );
155 p_current->p_next = NULL;
158 if( p_current->p_up )
160 free( p_current->p_up->psz_name );
161 free( p_current->p_up->psz_action );
162 free( p_current->p_up->psz_action_down );
163 if( p_current->p_feedback )
165 free( p_current->p_feedback->p_data_orig );
166 free( p_current->p_feedback );
169 p_current->p_feedback = NULL;
171 /* Free all states first */
172 if( p_current->p_up->p_states )
173 osd_StatesFree( p_menu, p_current->p_up->p_states );
174 free( p_current->p_up );
175 p_current->p_up = NULL;
178 /* Free the last one. */
181 msg_Dbg( p_menu, "+ freeing button %s [%p]",
182 p_button->psz_action, p_button );
183 free( p_button->psz_name );
184 free( p_button->psz_action );
185 free( p_button->psz_action_down );
186 if( p_current->p_feedback )
188 free( p_current->p_feedback->p_data_orig );
189 free( p_current->p_feedback );
190 p_current->p_feedback = NULL;
193 if( p_button->p_states )
194 osd_StatesFree( p_menu, p_button->p_states );
201 /*****************************************************************************
202 * Create a new state image
203 *****************************************************************************/
204 osd_state_t *osd_StateNew( osd_menu_t *p_menu, const char *psz_file,
205 const char *psz_state )
207 osd_state_t *p_state = NULL;
208 video_format_t fmt_in, fmt_out;
210 p_state = (osd_state_t*) malloc( sizeof(osd_state_t) );
214 memset( p_state, 0, sizeof(osd_state_t) );
215 memset( &fmt_in, 0, sizeof(video_format_t) );
216 memset( &fmt_out, 0, sizeof(video_format_t) );
218 fmt_out.i_chroma = VLC_FOURCC('Y','U','V','A');
219 if( p_menu->p_image )
221 p_state->p_pic = image_ReadUrl( p_menu->p_image, psz_file,
225 p_state->i_width = p_state->p_pic->p[Y_PLANE].i_visible_pitch;
226 p_state->i_height = p_state->p_pic->p[Y_PLANE].i_visible_lines;
232 p_state->psz_state = strdup( psz_state );
233 if( strncmp( ppsz_button_states[0], psz_state,
234 strlen(ppsz_button_states[0]) ) == 0 )
235 p_state->i_state = OSD_BUTTON_UNSELECT;
236 else if( strncmp( ppsz_button_states[1], psz_state,
237 strlen(ppsz_button_states[1]) ) == 0 )
238 p_state->i_state = OSD_BUTTON_SELECT;
239 else if( strncmp( ppsz_button_states[2], psz_state,
240 strlen(ppsz_button_states[2]) ) == 0 )
241 p_state->i_state = OSD_BUTTON_PRESSED;
246 /*****************************************************************************
248 *****************************************************************************/
249 void osd_StatesFree( osd_menu_t *p_menu, osd_state_t *p_states )
251 osd_state_t *p_state = p_states;
252 osd_state_t *p_next = NULL;
253 osd_state_t *p_prev = NULL;
255 if( !p_state ) return;
257 while( p_state->p_next )
259 p_next = p_state->p_next;
262 /* Then free end first and walk to the start. */
263 while( p_state->p_prev )
265 msg_Dbg( p_menu, " |- freeing state %s [%p]",
266 p_state->psz_state, p_state );
267 p_prev = p_state->p_prev;
269 if( p_state->p_next )
271 if( p_state->p_next->p_pic )
273 free( p_state->p_next->p_pic->p_data_orig );
274 free( p_state->p_next->p_pic );
276 free( p_state->p_next->psz_state );
277 free( p_state->p_next );
278 p_state->p_next = NULL;
281 /* Free the last one. */
284 msg_Dbg( p_menu, " |- freeing state %s [%p]",
285 p_state->psz_state, p_states );
286 if( p_states->p_pic )
288 free( p_states->p_pic->p_data_orig );
289 free( p_states->p_pic );
291 free( p_state->psz_state );