]> git.sesse.net Git - vlc/commitdiff
Really prevent illegal puzzles and prevent some illegal moves.
authorAntoine Cellerier <dionoea@videolan.org>
Sat, 11 Nov 2006 00:48:03 +0000 (00:48 +0000)
committerAntoine Cellerier <dionoea@videolan.org>
Sat, 11 Nov 2006 00:48:03 +0000 (00:48 +0000)
modules/video_filter/puzzle.c

index f2e9e8dcc510f748d851552b7cd6ee11f507ba67..d6c32d9bbdeb33c168c6f5f37d023f3c002955a5 100644 (file)
@@ -120,14 +120,23 @@ static vlc_bool_t finished( vout_sys_t *p_sys )
 }
 static vlc_bool_t is_valid( vout_sys_t *p_sys )
 {
-    int i, s=0;
+    int i, j, d=0;
     if( p_sys->b_blackslot == VLC_FALSE ) return VLC_TRUE;
     for( i = 0; i < p_sys->i_cols * p_sys->i_rows; i++ )
     {
-        if( (p_sys->i_cols*p_sys->i_rows+i-p_sys->pi_order[i])%2 ) s++;
-        else s--;
+        if( p_sys->pi_order[i] == p_sys->i_cols * p_sys->i_rows - 1 )
+        {
+            d += i / p_sys->i_cols + 1;
+            continue;
+        }
+        for( j = i+1; j < p_sys->i_cols * p_sys->i_rows; j++ )
+        {
+            if( p_sys->pi_order[j] == p_sys->i_cols * p_sys->i_rows - 1 )
+                continue;
+            if( p_sys->pi_order[i] > p_sys->pi_order[j] ) d++;
+        }
     }
-    if( s!=0 ) return VLC_FALSE;
+    if( d%2!=0 ) return VLC_FALSE;
     else return VLC_TRUE;
 }
 static void shuffle( vout_sys_t *p_sys )
@@ -153,14 +162,14 @@ static void shuffle( vout_sys_t *p_sys )
         }
         p_sys->b_finished = finished( p_sys );
     } while(    p_sys->b_finished == VLC_TRUE
-             && is_valid( p_sys ) == VLC_FALSE );
+             || is_valid( p_sys ) == VLC_FALSE );
 
     if( p_sys->b_blackslot == VLC_TRUE )
     {
         for( i = 0; i < p_sys->i_cols * p_sys->i_rows; i++ )
         {
             if( p_sys->pi_order[i] ==
-                ( p_sys->i_cols - 1 ) * p_sys->i_rows )
+                p_sys->i_cols * p_sys->i_rows - 1 )
             {
                 p_sys->i_selected = i;
                 break;
@@ -171,7 +180,6 @@ static void shuffle( vout_sys_t *p_sys )
     {
         p_sys->i_selected = -1;
     }
-    printf( "selected: %d\n", p_sys->i_selected );
 }
 
 /*****************************************************************************
@@ -463,8 +471,10 @@ static int MouseEvent( vlc_object_t *p_this, char const *psz_var,
         {
             p_vout->p_sys->i_selected = -1;
         }
-        else if(    p_vout->p_sys->i_selected == i_pos + 1
-                 || p_vout->p_sys->i_selected == i_pos - 1
+        else if(    ( p_vout->p_sys->i_selected == i_pos + 1
+                      && p_vout->p_sys->i_selected%p_vout->p_sys->i_cols != 0 )
+                 || ( p_vout->p_sys->i_selected == i_pos - 1
+                      && i_pos % p_vout->p_sys->i_cols != 0 )
                  || p_vout->p_sys->i_selected == i_pos + p_vout->p_sys->i_cols
                  || p_vout->p_sys->i_selected == i_pos - p_vout->p_sys->i_cols )
         {