gst/games/gstpuzzle.c: make RGB endianness work correctly refactor and fix race with...
authorBenjamin Otte <otte@gnome.org>
Thu, 6 Jan 2005 16:08:11 +0000 (16:08 +0000)
committerBenjamin Otte <otte@gnome.org>
Thu, 6 Jan 2005 16:08:11 +0000 (16:08 +0000)
Original commit message from CVS:
* gst/games/gstpuzzle.c: (gst_puzzle_base_init):
make RGB endianness work correctly
(gst_puzzle_show), (gst_puzzle_swap), (gst_puzzle_move):
refactor and fix race with initial shuffling
(nav_event_handler):
allow using the mouse to puzzle
(draw_puzzle):
insist on tiles having width and height as multiples of 4 to get
clean YUV image handling
* sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new),
(gst_xvimagesink_handle_xevents), (gst_xvimagesink_buffer_alloc):
s/DEBUG/LOG/ for common messages
(gst_xvimagesink_navigation_send_event):
fix mouse event translation to not include screen PAR
* sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event):
fix mouse event translation to actually work

ChangeLog
gst/games/gstpuzzle.c

index 5dd00a5648bb4740145948ae623ad5dc69a9400a..6391b170d42c34e6d7e446b77c3b01daa23aef90 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2005-01-06  Benjamin Otte  <otte@gnome.org>
+
+       * gst/games/gstpuzzle.c: (gst_puzzle_base_init):
+         make RGB endianness work correctly
+       (gst_puzzle_show), (gst_puzzle_swap), (gst_puzzle_move):
+         refactor and fix race with initial shuffling
+       (nav_event_handler):
+         allow using the mouse to puzzle
+       (draw_puzzle):
+         insist on tiles having width and height as multiples of 4 to get
+         clean YUV image handling
+       * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xvimage_new),
+       (gst_xvimagesink_handle_xevents), (gst_xvimagesink_buffer_alloc):
+         s/DEBUG/LOG/ for common messages
+       (gst_xvimagesink_navigation_send_event):
+         fix mouse event translation to not include screen PAR
+       * sys/ximage/ximagesink.c: (gst_ximagesink_navigation_send_event):
+         fix mouse event translation to actually work
+
 2005-01-06  Stephane LOEUILLET  <stephane.loeuillet@tiscali.fr>
 
        * gst/asfdemux/gstasfdemux.c:
index ac057f6216fc44ca91a8e690f1e4eb09eeae8595..c0e3c2548cc01990cca6e067a3115f86aa95b8a6 100644 (file)
@@ -136,7 +136,8 @@ gst_puzzle_base_init (gpointer g_class)
     f->filter_func = draw_puzzle;
     if (gst_video_format_list[i].ext_caps) {
       f->depth = gst_video_format_list[i].depth;
-      f->endianness = G_BYTE_ORDER;
+      f->endianness =
+          gst_video_format_list[i].bitspp < 24 ? G_BYTE_ORDER : G_BIG_ENDIAN;
       f->red_mask = gst_video_format_list[i].red_mask;
       f->green_mask = gst_video_format_list[i].green_mask;
       f->blue_mask = gst_video_format_list[i].blue_mask;
@@ -210,6 +211,18 @@ gst_puzzle_show (GstPuzzle * puzzle)
 }
 #endif
 
+static void
+gst_puzzle_swap (GstPuzzle * puzzle, guint next)
+{
+  guint tmp;
+
+  g_assert (next < puzzle->tiles);
+  tmp = puzzle->permutation[puzzle->position];
+  puzzle->permutation[puzzle->position] = puzzle->permutation[next];
+  puzzle->permutation[next] = tmp;
+  puzzle->position = next;
+}
+
 typedef enum
 {
   DIR_UP,
@@ -246,12 +259,7 @@ gst_puzzle_move (GstPuzzle * puzzle, GstPuzzleDirection dir)
 
   if (next < puzzle->tiles) {
     /* the move was valid */
-    guint tmp = puzzle->permutation[puzzle->position];
-
-    puzzle->permutation[puzzle->position] = puzzle->permutation[next];
-    puzzle->permutation[next] = tmp;
-    puzzle->position = next;
-    puzzle->solved = gst_puzzle_is_solved (puzzle);
+    gst_puzzle_swap (puzzle, next);
   }
 }
 
@@ -272,9 +280,11 @@ static gboolean
 nav_event_handler (GstPad * pad, GstEvent * event)
 {
   GstPuzzle *puzzle;
+  GstVideofilter *filter;
   const gchar *type;
 
   puzzle = GST_PUZZLE (gst_pad_get_parent (pad));
+  filter = GST_VIDEOFILTER (puzzle);
 
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_NAVIGATION:
@@ -284,6 +294,7 @@ nav_event_handler (GstPad * pad, GstEvent * event)
         const gchar *key =
             gst_structure_get_string (event->event_data.structure.structure,
             "key");
+
         if (g_str_equal (key, "space")) {
           if (gst_puzzle_is_solved (puzzle)) {
             gst_puzzle_shuffle (puzzle);
@@ -305,8 +316,48 @@ nav_event_handler (GstPad * pad, GstEvent * event)
             break;
           }
         }
+        puzzle->solved = gst_puzzle_is_solved (puzzle);
         gst_event_unref (event);
         return TRUE;
+      } else if (g_str_equal (type, "mouse-button-press")) {
+        gint button;
+
+        if (gst_structure_get_int (event->event_data.structure.structure,
+                "button", &button)) {
+          if (button == 1) {
+            gdouble x, y;
+
+            if (gst_structure_get_double (event->event_data.structure.structure,
+                    "pointer_x", &x) &&
+                gst_structure_get_double (event->event_data.structure.structure,
+                    "pointer_y", &y)) {
+              gint xpos, ypos;
+
+              xpos =
+                  (int) x / ((gst_videofilter_get_input_width (filter) /
+                      puzzle->columns) & ~3);
+              ypos =
+                  (int) y / ((gst_videofilter_get_input_height (filter) /
+                      puzzle->rows) & ~3);
+              if (xpos >= 0 && xpos < puzzle->columns && ypos >= 0
+                  && ypos < puzzle->rows) {
+                gst_puzzle_swap (puzzle, ypos * puzzle->columns + xpos);
+              }
+              puzzle->solved = gst_puzzle_is_solved (puzzle);
+              gst_event_unref (event);
+              return TRUE;
+            }
+          } else if (button == 2) {
+            if (gst_puzzle_is_solved (puzzle)) {
+              gst_puzzle_shuffle (puzzle);
+            } else {
+              gst_puzzle_solve (puzzle);
+            }
+            puzzle->solved = gst_puzzle_is_solved (puzzle);
+            gst_event_unref (event);
+            return TRUE;
+          }
+        }
       }
       break;
     default:
@@ -424,8 +475,9 @@ draw_puzzle (GstVideofilter * videofilter, void *destp, void *srcp)
     gst_video_image_copy_area (&dest, 0, height - h, &src, 0, height - h, width,
         h);
   }
-  width /= puzzle->columns;
-  height /= puzzle->rows;
+  /* use multiples of 4 here to get around drawing problems with YUV colorspaces */
+  width = (width / puzzle->columns) & ~3;
+  height = (height / puzzle->rows) & ~3;
 
   for (i = 0; i < puzzle->tiles; i++) {
     if (!puzzle->solved && i == puzzle->position) {