]> git.sesse.net Git - vlc/blobdiff - modules/misc/osd/osd_menu.c
Revert "macosx/framework: contrib are fat now."
[vlc] / modules / misc / osd / osd_menu.c
index d894308d433a230d8aca8a5b564f876c6c79c607..57cd24ecab51e5e1a61827c33f42367e216461cd 100644 (file)
@@ -1,8 +1,8 @@
 /*****************************************************************************
- * parser.c :  OSD import module
+ * parser.c : OSD import module
  *****************************************************************************
- * Copyright (C) 2007 M2X
- * $Id$
+ * Copyright (C) 2007-2008 M2X
+ * $Id$
  *
  * Authors: Jean-Paul Saman
  *
  * Preamble
  *****************************************************************************/
 
-#include <vlc/vlc.h>
-#include <vlc_vout.h>
-#include <vlc_config.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
 
-#include <vlc_keys.h>
+#include <vlc_common.h>
 #include <vlc_image.h>
 #include <vlc_osd.h>
-#include <vlc_charset.h>
 
 #include "osd_menu.h"
 
 #undef OSD_MENU_DEBUG
 
+const char * const ppsz_button_states[] = { "unselect", "select", "pressed" };
+
 /*****************************************************************************
  * Local prototypes
  *****************************************************************************/
-static const char *ppsz_button_states[] = { "unselect", "select", "pressed" };
 
 /*****************************************************************************
  * Create a new Menu structure
  *****************************************************************************/
-osd_menu_t *osd_MenuNew( osd_menu_t *p_menu, const char *psz_path, int i_x, int i_y )
+osd_menu_t *osd_MenuNew( osd_menu_t *p_menu, const char *psz_path,
+                         int i_x, int i_y )
 {
     if( !p_menu ) return NULL;
 
-    p_menu->p_state = (osd_menu_state_t *) malloc( sizeof( osd_menu_state_t ) );
+    p_menu->p_state = calloc( 1, sizeof( osd_menu_state_t ) );
     if( !p_menu->p_state )
-    {
-        msg_Err( p_menu, "Memory allocation for OSD Menu state failed" );
         return NULL;
-    }
 
-    memset(p_menu->p_state, 0, sizeof(osd_menu_state_t));
-    if( psz_path != NULL )
-        p_menu->psz_path = strdup( psz_path );
-    else
-        p_menu->psz_path = NULL;
+    p_menu->psz_path = psz_path ? strdup( psz_path ) : NULL;
     p_menu->i_x = i_x;
     p_menu->i_y = i_y;
     p_menu->i_style = OSD_MENU_STYLE_SIMPLE;
@@ -72,15 +66,17 @@ osd_menu_t *osd_MenuNew( osd_menu_t *p_menu, const char *psz_path, int i_x, int
 /*****************************************************************************
  * Free the menu
  *****************************************************************************/
-void osd_MenuFree( vlc_object_t *p_this, osd_menu_t *p_menu )
+void osd_MenuFree( osd_menu_t *p_menu )
 {
-    msg_Dbg( p_this, "freeing menu" );
-    osd_ButtonFree( p_this, p_menu->p_button );
+    msg_Dbg( p_menu, "freeing menu" );
+    osd_ButtonFree( p_menu, p_menu->p_button );
+
+    free( p_menu->psz_path );
+    free( p_menu->p_state );
+
     p_menu->p_button = NULL;
     p_menu->p_last_button = NULL;
-    if( p_menu->psz_path ) free( p_menu->psz_path );
     p_menu->psz_path = NULL;
-    if( p_menu->p_state ) free( p_menu->p_state );
     p_menu->p_state = NULL;
 }
 
@@ -90,11 +86,10 @@ void osd_MenuFree( vlc_object_t *p_this, osd_menu_t *p_menu )
 osd_button_t *osd_ButtonNew( const char *psz_action, int i_x, int i_y )
 {
     osd_button_t *p_button = NULL;
-    p_button = (osd_button_t*) malloc( sizeof(osd_button_t) );
+    p_button = calloc( 1, sizeof(osd_button_t) );
     if( !p_button )
         return NULL;
 
-    memset( p_button, 0, sizeof(osd_button_t) );
     p_button->psz_action = strdup(psz_action);
     p_button->psz_action_down = NULL;
     p_button->p_feedback = NULL;
@@ -107,12 +102,14 @@ osd_button_t *osd_ButtonNew( const char *psz_action, int i_x, int i_y )
 /*****************************************************************************
  * Free a button
  *****************************************************************************/
-void osd_ButtonFree( vlc_object_t *p_this, osd_button_t *p_button )
+void osd_ButtonFree( osd_menu_t *p_menu, osd_button_t *p_button )
 {
     osd_button_t *p_current = p_button;
     osd_button_t *p_next = NULL;
     osd_button_t *p_prev = NULL;
 
+    if( !p_current ) return;
+
     /* First walk to the end. */
     while( p_current->p_next )
     {
@@ -122,109 +119,98 @@ void osd_ButtonFree( vlc_object_t *p_this, osd_button_t *p_button )
     /* Then free end first and walk to the start. */
     while( p_current->p_prev )
     {
-        msg_Dbg( p_this, "+ freeing button %s [%p]", p_current->psz_action, p_current );
+        msg_Dbg( p_menu, "+ freeing button %s [%p]",
+                 p_current->psz_action, p_current );
         p_prev = p_current->p_prev;
         p_current = p_prev;
         if( p_current->p_next )
         {
-            if( p_current->p_next->psz_name )
-                free( p_current->p_next->psz_name );
-            if( p_current->p_next->psz_action )
-                free( p_current->p_next->psz_action );
-            if( p_current->p_next->psz_action_down )
-                free( p_current->p_next->psz_action_down );
-            if( p_current->p_feedback && p_current->p_feedback->p_data_orig )
-                free( p_current->p_feedback->p_data_orig );
+            free( p_current->p_next->psz_name );
+            free( p_current->p_next->psz_action );
+            free( p_current->p_next->psz_action_down );
             if( p_current->p_feedback )
+            {
+                free( p_current->p_feedback->p_data_orig );
                 free( p_current->p_feedback );
-
-            p_current->p_next->psz_action_down = NULL;
-            p_current->p_next->psz_action = NULL;
-            p_current->p_next->psz_name = NULL;
-            p_current->p_feedback = NULL;
+                p_current->p_feedback = NULL;
+            }
 
             /* Free all states first */
             if( p_current->p_next->p_states )
-                osd_StatesFree( p_this, p_current->p_next->p_states );
-            p_current->p_next->p_states = NULL;
-            if( p_current->p_next) free( p_current->p_next );
+                osd_StatesFree( p_menu, p_current->p_next->p_states );
+
+            free( p_current->p_next );
             p_current->p_next = NULL;
         }
 
         if( p_current->p_up )
         {
-            if( p_current->p_up->psz_name )
-                free( p_current->p_up->psz_name );
-            if( p_current->p_up->psz_action )
-                free( p_current->p_up->psz_action );
-            if( p_current->p_up->psz_action_down )
-                free( p_current->p_up->psz_action_down );
-            if( p_current->p_feedback && p_current->p_feedback->p_data_orig )
-                free( p_current->p_feedback->p_data_orig );
+            free( p_current->p_up->psz_name );
+            free( p_current->p_up->psz_action );
+            free( p_current->p_up->psz_action_down );
             if( p_current->p_feedback )
+            {
+                free( p_current->p_feedback->p_data_orig );
                 free( p_current->p_feedback );
+            }
 
-            p_current->p_up->psz_action_down = NULL;
-            p_current->p_up->psz_action = NULL;
-            p_current->p_up->psz_name = NULL;
             p_current->p_feedback = NULL;
 
             /* Free all states first */
             if( p_current->p_up->p_states )
-                osd_StatesFree( p_this, p_current->p_up->p_states );
-            p_current->p_up->p_states = NULL;
-            if( p_current->p_up ) free( p_current->p_up );
+                osd_StatesFree( p_menu, p_current->p_up->p_states );
+            free( p_current->p_up );
             p_current->p_up = NULL;
         }
     }
     /* Free the last one. */
     if( p_button )
     {
-        msg_Dbg( p_this, "+ freeing button %s [%p]", p_button->psz_action, p_button );
-        if( p_button->psz_name ) free( p_button->psz_name );
-        if( p_button->psz_action ) free( p_button->psz_action );
-        if( p_button->psz_action_down ) free( p_button->psz_action_down );
-        if( p_current->p_feedback && p_current->p_feedback->p_data_orig )
-            free( p_current->p_feedback->p_data_orig );
+        msg_Dbg( p_menu, "+ freeing button %s [%p]",
+                 p_button->psz_action, p_button );
+        free( p_button->psz_name );
+        free( p_button->psz_action );
+        free( p_button->psz_action_down );
         if( p_current->p_feedback )
+        {
+            free( p_current->p_feedback->p_data_orig );
             free( p_current->p_feedback );
-
-        p_button->psz_name = NULL;
-        p_button->psz_action = NULL;
-        p_button->psz_action_down = NULL;
-        p_current->p_feedback = NULL;
+            p_current->p_feedback = NULL;
+        }
 
         if( p_button->p_states )
-            osd_StatesFree( p_this, p_button->p_states );
-        p_button->p_states = NULL;
+            osd_StatesFree( p_menu, p_button->p_states );
+
         free( p_button );
-        p_button = NULL;
     }
 }
 
 /*****************************************************************************
  * Create a new state image
  *****************************************************************************/
-osd_state_t *osd_StateNew( vlc_object_t *p_this, const char *psz_file, const char *psz_state )
+osd_state_t *osd_StateNew( osd_menu_t *p_menu, const char *psz_file,
+                           const char *psz_state )
 {
-    osd_menu_t *p_this;
     osd_state_t *p_state = NULL;
     video_format_t fmt_in, fmt_out;
 
-    p_state = (osd_state_t*) malloc( sizeof(osd_state_t) );
+    p_state = calloc( 1, sizeof(osd_state_t) );
     if( !p_state )
         return NULL;
 
-    memset( p_state, 0, sizeof(osd_state_t) );
-
     memset( &fmt_in, 0, sizeof(video_format_t) );
     memset( &fmt_out, 0, sizeof(video_format_t) );
 
-    fmt_out.i_chroma = VLC_FOURCC('Y','U','V','A');
-    if( p_osd->p_image )
+    fmt_out.i_chroma = VLC_CODEC_YUVA;
+    if( p_menu->p_image )
     {
-        p_state->p_pic = image_ReadUrl( p_osd->p_image, p_osd->psz_file,
+        p_state->p_pic = image_ReadUrl( p_menu->p_image, psz_file,
                                         &fmt_in, &fmt_out );
+        if( p_state->p_pic )
+        {
+            p_state->i_width  = p_state->p_pic->p[Y_PLANE].i_visible_pitch;
+            p_state->i_height = p_state->p_pic->p[Y_PLANE].i_visible_lines;
+        }
     }
 
     if( psz_state )
@@ -246,12 +232,14 @@ osd_state_t *osd_StateNew( vlc_object_t *p_this, const char *psz_file, const cha
 /*****************************************************************************
  * Free state images
  *****************************************************************************/
-void osd_StatesFree( vlc_object_t *p_this, osd_state_t *p_states )
+void osd_StatesFree( osd_menu_t *p_menu, osd_state_t *p_states )
 {
     osd_state_t *p_state = p_states;
     osd_state_t *p_next = NULL;
     osd_state_t *p_prev = NULL;
 
+    if( !p_state ) return;
+
     while( p_state->p_next )
     {
         p_next = p_state->p_next;
@@ -260,17 +248,18 @@ void osd_StatesFree( vlc_object_t *p_this, osd_state_t *p_states )
     /* Then free end first and walk to the start. */
     while( p_state->p_prev )
     {
-        msg_Dbg( p_this, " |- freeing state %s [%p]", p_state->psz_state, p_state );
+        msg_Dbg( p_menu, " |- freeing state %s [%p]",
+                 p_state->psz_state, p_state );
         p_prev = p_state->p_prev;
         p_state = p_prev;
         if( p_state->p_next )
         {
-            if( p_state->p_next->p_pic && p_state->p_next->p_pic->p_data_orig )
+            if( p_state->p_next->p_pic )
+            {
                 free( p_state->p_next->p_pic->p_data_orig );
-            if( p_state->p_next->p_pic ) free( p_state->p_next->p_pic );
-            p_state->p_next->p_pic = NULL;
-            if( p_state->p_next->psz_state ) free( p_state->p_next->psz_state );
-            p_state->p_next->psz_state = NULL;
+                free( p_state->p_next->p_pic );
+            }
+            free( p_state->p_next->psz_state );
             free( p_state->p_next );
             p_state->p_next = NULL;
         }
@@ -278,14 +267,15 @@ void osd_StatesFree( vlc_object_t *p_this, osd_state_t *p_states )
     /* Free the last one. */
     if( p_states )
     {
-        msg_Dbg( p_this, " |- freeing state %s [%p]", p_state->psz_state, p_states );
-        if( p_states->p_pic && p_states->p_pic->p_data_orig )
+        msg_Dbg( p_menu, " |- freeing state %s [%p]",
+                 p_state->psz_state, p_states );
+        if( p_states->p_pic )
+        {
             free( p_states->p_pic->p_data_orig );
-        if( p_states->p_pic ) free( p_states->p_pic );
-        p_states->p_pic = NULL;
-        if( p_state->psz_state ) free( p_state->psz_state );
-        p_state->psz_state = NULL;
+            free( p_states->p_pic );
+        }
+        free( p_state->psz_state );
         free( p_states );
-        p_states = NULL;
     }
 }
+