diff options
| author | Ray Strode <rstrode@redhat.com> | 2007-05-10 15:39:05 -0400 |
|---|---|---|
| committer | Ray Strode <rstrode@redhat.com> | 2007-05-10 15:39:05 -0400 |
| commit | 3be9909f098df6ae144e333f4d9c7ff74fb8df05 (patch) | |
| tree | a8ca208979ed69b0db823dafc162acafa9afe767 /src | |
| parent | 4c2ac91f587b1ec63ab29a0c0715bf61402ebdd3 (diff) | |
| download | plymouth-3be9909f098df6ae144e333f4d9c7ff74fb8df05.tar.gz plymouth-3be9909f098df6ae144e333f4d9c7ff74fb8df05.tar.xz plymouth-3be9909f098df6ae144e333f4d9c7ff74fb8df05.zip | |
add updates pausing feature
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ply-video-buffer.c | 57 | ||||
| -rw-r--r-- | src/ply-video-buffer.h | 2 |
2 files changed, 46 insertions, 13 deletions
diff --git a/src/ply-video-buffer.c b/src/ply-video-buffer.c index ca23707..30cbeb9 100644 --- a/src/ply-video-buffer.c +++ b/src/ply-video-buffer.c @@ -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; diff --git a/src/ply-video-buffer.h b/src/ply-video-buffer.h index d84f30f..1e6265a 100644 --- a/src/ply-video-buffer.h +++ b/src/ply-video-buffer.h @@ -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, |
