]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
add updates pausing feature
authorRay Strode <rstrode@redhat.com>
Thu, 10 May 2007 19:39:05 +0000 (15:39 -0400)
committerRay Strode <rstrode@redhat.com>
Thu, 10 May 2007 19:39:05 +0000 (15:39 -0400)
In order to prevent flicker, there are two new apis
pause and unpause, that prevent and cause respectively
updates from getting flushed to the card.

This commit also has a few fixes for compositing.  It
still isn't working like it should be however.

src/ply-video-buffer.c
src/ply-video-buffer.h

index ca237070b09514d1b1874bb6f5001df171a7d255..30cbeb93c675aa25de32e944710d9159594ff3a3 100644 (file)
@@ -70,6 +70,8 @@ struct _PlyVideoBuffer
   unsigned int bytes_per_pixel;
   PlyVideoBufferArea area;
   PlyVideoBufferArea area_to_flush;
+
+  uint32_t is_paused : 1;
 };
 
 static bool ply_video_buffer_open_device (PlyVideoBuffer  *buffer);
@@ -330,13 +332,16 @@ ply_video_buffer_blend_value_at_pixel (PlyVideoBuffer *buffer,
 
   new_alpha = (pixel_value >> 24) / 255.0;
   new_red = ((pixel_value >> 16) & 0xff) / 255.0;
+  new_red *= new_alpha;
   new_green = ((pixel_value >> 8) & 0xff) / 255.0;
+  new_green *= new_alpha;
   new_blue = (pixel_value & 0xff) / 255.0;
+  new_blue *= new_alpha;
 
-  new_red = new_red * new_alpha + old_red * old_alpha * (1.0 - new_alpha);
-  new_green = new_green * new_alpha + old_green * old_alpha * (1.0 - new_alpha);
-  new_blue = new_blue * new_alpha + old_blue * old_alpha * (1.0 - new_alpha);
-  new_alpha = new_alpha * (1.0 - old_alpha); 
+  new_red = new_red + old_red * (1.0 - new_alpha);
+  new_green = new_green + old_green * (1.0 - new_alpha);
+  new_blue = new_blue + old_blue * (1.0 - new_alpha);
+  new_alpha = new_alpha + (1.0 - old_alpha);
 
   new_red = CLAMP (new_red * 255.0, 0, 255.0);
   new_green = CLAMP (new_green * 255.0, 0, 255.0);
@@ -358,11 +363,12 @@ ply_video_buffer_set_area_to_pixel_value (PlyVideoBuffer     *buffer,
 {
   long row, column;
 
-  for (row = 0; row < area->height; row++)
+  for (row = area->y; row < area->y + area->height; row++)
     {
-      for (column = 0; column < area->width; column++)
+      for (column = area->x; column < area->x + area->width; column++)
         {
-          ply_video_buffer_set_value_at_pixel (buffer, column, row,
+          ply_video_buffer_set_value_at_pixel (buffer, 
+                                               column, row,
                                                pixel_value);
         }
     }
@@ -375,11 +381,12 @@ ply_video_buffer_blend_area_with_pixel_value (PlyVideoBuffer     *buffer,
 {
   long row, column;
 
-  for (row = 0; row < area->height; row++)
+  for (row = area->y; row < area->y + area->height; row++)
     {
-      for (column = 0; column < area->width; column++)
+      for (column = area->x; column < area->x + area->width; column++)
         {
-          ply_video_buffer_blend_value_at_pixel (buffer, column, row, 
+          ply_video_buffer_blend_value_at_pixel (buffer, 
+                                                 column, row,
                                                  pixel_value);
         }
     }
@@ -412,7 +419,12 @@ ply_video_buffer_flush (PlyVideoBuffer *buffer)
   unsigned long start_offset;
   size_t size;
 
-  bytes_per_row = buffer->bytes_per_pixel * buffer->area.width;
+  assert (buffer != NULL);
+
+  if (buffer->is_paused)
+    return true;
+
+  bytes_per_row = buffer->bytes_per_pixel * buffer->area_to_flush.width;
   start_offset = (buffer->area_to_flush.y * bytes_per_row)
                  + (buffer->area_to_flush.x * buffer->bytes_per_pixel);
   size = buffer->area_to_flush.width * buffer->area_to_flush.height
@@ -447,6 +459,8 @@ ply_video_buffer_new (const char *device_name)
   buffer->layout.address = MAP_FAILED;
   buffer->shadow_layout.address = NULL;
 
+  buffer->is_paused = false;
+
   return buffer;
 }
 
@@ -509,6 +523,23 @@ out:
   return is_open;
 }
 
+void
+ply_video_buffer_pause_updates (PlyVideoBuffer *buffer)
+{
+  assert (buffer != NULL);
+
+  buffer->is_paused = true;
+}
+
+bool
+ply_video_buffer_unpause_updates (PlyVideoBuffer *buffer)
+{
+  assert (buffer != NULL);
+  
+  buffer->is_paused = false;
+  return ply_video_buffer_flush (buffer);
+}
+
 bool 
 ply_video_buffer_device_is_open (PlyVideoBuffer *buffer)
 {
@@ -618,9 +649,9 @@ ply_video_buffer_fill_with_argb32_data (PlyVideoBuffer     *buffer,
   if (area == NULL)
     area = &buffer->area;
 
-  for (row = y; row < height; row++)
+  for (row = y; row < y + height; row++)
     {
-      for (column = x; column < width; column++)
+      for (column = x; column < x + width; column++)
         {
           uint8_t alpha;
 
index d84f30ffb2ff3d883efce0976604209af567501f..1e6265ae7b27f0749d685bc539b559e9c3bc7ecb 100644 (file)
@@ -41,6 +41,8 @@ struct _PlyVideoBufferArea
 PlyVideoBuffer *ply_video_buffer_new (const char *device_name);
 void ply_video_buffer_free (PlyVideoBuffer *buffer);
 bool ply_video_buffer_open (PlyVideoBuffer *buffer);
+void ply_video_buffer_pause_updates (PlyVideoBuffer *buffer);
+bool ply_video_buffer_unpause_updates (PlyVideoBuffer *buffer);
 bool ply_video_buffer_device_is_open (PlyVideoBuffer *buffer); 
 char *ply_video_buffer_get_device_name (PlyVideoBuffer *buffer);
 void ply_video_buffer_set_device_name (PlyVideoBuffer *buffer,