From: Charlie Brej Date: Sat, 21 Nov 2009 16:30:34 +0000 (+0000) Subject: [script] Migrate from image to pixel buffer X-Git-Tag: 0.8.0~122 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2dbac8e9422a37efb4cb9bf0a1dfeddbe84af4e2;p=thirdparty%2Fplymouth.git [script] Migrate from image to pixel buffer The script image is now a pixel buffer. This allows some clever possibilities: We can now implement text to image. We can compose images by drawing on them, and record the areas which changed to avoid refreshing the whole thing. --- diff --git a/src/plugins/splash/script/script-lib-image.c b/src/plugins/splash/script/script-lib-image.c index 0474ae9c..b4f998c7 100644 --- a/src/plugins/splash/script/script-lib-image.c +++ b/src/plugins/splash/script/script-lib-image.c @@ -21,6 +21,7 @@ */ #define _GNU_SOURCE #include "ply-image.h" +#include "ply-pixel-buffer.h" #include "ply-utils.h" #include "script.h" #include "script-parse.h" @@ -39,9 +40,9 @@ static void image_free (script_obj_t *obj) { - ply_image_t *image = obj->data.native.object_data; + ply_pixel_buffer_t *image = obj->data.native.object_data; - ply_image_free (image); + ply_pixel_buffer_free (image); } static script_return_t image_new (script_state_t *state, @@ -68,12 +69,15 @@ static script_return_t image_new (script_state_t *state, } else asprintf (&path_filename, "%s/%s", data->image_dir, filename); - ply_image_t *image = ply_image_new (path_filename); - if (ply_image_load (image)) - reply = script_obj_new_native (image, data->class); + ply_image_t *file_image = ply_image_new (path_filename); + if (ply_image_load (file_image)) + { + ply_pixel_buffer_t *buffer = ply_image_convert_to_pixel_buffer (file_image); + reply = script_obj_new_native (buffer, data->class); + } else { - ply_image_free (image); + ply_image_free (file_image); reply = script_obj_new_null (); } free (filename); @@ -85,35 +89,47 @@ static script_return_t image_get_width (script_state_t *state, void *user_data) { script_lib_image_data_t *data = user_data; - ply_image_t *image = script_obj_as_native_of_class (state->this, data->class); - if (image) - return script_return_obj (script_obj_new_number (ply_image_get_width (image))); - return script_return_obj_null (); + ply_rectangle_t size; + ply_pixel_buffer_t *image; + + image = script_obj_as_native_of_class (state->this, data->class); + if (!image) return script_return_obj_null (); + + ply_pixel_buffer_get_size (image, &size); + + return script_return_obj (script_obj_new_number (size.width)); } static script_return_t image_get_height (script_state_t *state, void *user_data) { script_lib_image_data_t *data = user_data; - ply_image_t *image = script_obj_as_native_of_class (state->this, data->class); - if (image) - return script_return_obj (script_obj_new_number (ply_image_get_height (image))); - return script_return_obj_null (); + ply_rectangle_t size; + ply_pixel_buffer_t *image; + + image = script_obj_as_native_of_class (state->this, data->class); + if (!image) return script_return_obj_null (); + + ply_pixel_buffer_get_size (image, &size); + + return script_return_obj (script_obj_new_number (size.height)); } static script_return_t image_rotate (script_state_t *state, void *user_data) { script_lib_image_data_t *data = user_data; - ply_image_t *image = script_obj_as_native_of_class (state->this, data->class); + ply_pixel_buffer_t *image = script_obj_as_native_of_class (state->this, data->class); float angle = script_obj_hash_get_number (state->local, "angle"); - + ply_rectangle_t size; + if (image) { - ply_image_t *new_image = ply_image_rotate (image, - ply_image_get_width (image) / 2, - ply_image_get_height (image) / 2, - angle); + ply_pixel_buffer_get_size (image, &size); + ply_pixel_buffer_t *new_image = ply_pixel_buffer_rotate (image, + size.width / 2, + size.height / 2, + angle); return script_return_obj (script_obj_new_native (new_image, data->class)); } return script_return_obj_null (); @@ -123,13 +139,13 @@ static script_return_t image_scale (script_state_t *state, void *user_data) { script_lib_image_data_t *data = user_data; - ply_image_t *image = script_obj_as_native_of_class (state->this, data->class); + ply_pixel_buffer_t *image = script_obj_as_native_of_class (state->this, data->class); int width = script_obj_hash_get_number (state->local, "width"); int height = script_obj_hash_get_number (state->local, "height"); if (image) { - ply_image_t *new_image = ply_image_resize (image, width, height); + ply_pixel_buffer_t *new_image = ply_pixel_buffer_resize (image, width, height); return script_return_obj (script_obj_new_native (new_image, data->class)); } return script_return_obj_null (); diff --git a/src/plugins/splash/script/script-lib-sprite.c b/src/plugins/splash/script/script-lib-sprite.c index 9078c095..89074489 100644 --- a/src/plugins/splash/script/script-lib-sprite.c +++ b/src/plugins/splash/script/script-lib-sprite.c @@ -77,10 +77,10 @@ static script_return_t sprite_set_image (script_state_t *state, script_lib_sprite_data_t *data = user_data; sprite_t *sprite = script_obj_as_native_of_class (state->this, data->class); script_obj_t *script_obj_image = script_obj_hash_get_element (state->local, - "image"); + "image"); script_obj_deref (&script_obj_image); - ply_image_t *image = script_obj_as_native_of_class_name (script_obj_image, - "image"); + ply_pixel_buffer_t *image = script_obj_as_native_of_class_name (script_obj_image, + "image"); if (image && sprite) { @@ -214,16 +214,18 @@ void script_lib_sprite_draw_area (script_lib_sprite_data_t *data, { sprite_t *sprite = ply_list_node_get_data (node); ply_rectangle_t sprite_area; + if (!sprite->image) continue; if (sprite->remove_me) continue; if (sprite->opacity < 0.011) continue; + + ply_pixel_buffer_get_size (sprite->image, &sprite_area); + sprite_area.x = sprite->x; sprite_area.y = sprite->y; if (sprite_area.x >= (x + width)) continue; if (sprite_area.y >= (y + height)) continue; - sprite_area.width = ply_image_get_width (sprite->image); - sprite_area.height = ply_image_get_height (sprite->image); if ((sprite_area.x + (int) sprite_area.width) <= x) continue; if ((sprite_area.y + (int) sprite_area.height) <= y) continue; @@ -231,7 +233,7 @@ void script_lib_sprite_draw_area (script_lib_sprite_data_t *data, &sprite_area, &clip_area, 0, 0, - ply_image_get_data (sprite->image), + ply_pixel_buffer_get_argb32_data (sprite->image), sprite->opacity); } } @@ -379,9 +381,9 @@ void script_lib_sprite_refresh (script_lib_sprite_data_t *data) || (fabs (sprite->old_opacity - sprite->opacity) > 0.01) /* People can't see the difference between */ || sprite->refresh_me) { - int width = ply_image_get_width (sprite->image); - int height = ply_image_get_height (sprite->image); - draw_area (data, sprite->x, sprite->y, width, height); + ply_rectangle_t size; + ply_pixel_buffer_get_size (sprite->image, &size); + draw_area (data, sprite->x, sprite->y, size.width, size.height); draw_area (data, sprite->old_x, sprite->old_y, @@ -390,8 +392,8 @@ void script_lib_sprite_refresh (script_lib_sprite_data_t *data) sprite->old_x = sprite->x; sprite->old_y = sprite->y; sprite->old_z = sprite->z; - sprite->old_width = width; - sprite->old_height = height; + sprite->old_width = size.width; + sprite->old_height = size.height; sprite->old_opacity = sprite->opacity; sprite->refresh_me = false; } diff --git a/src/plugins/splash/script/script-lib-sprite.h b/src/plugins/splash/script/script-lib-sprite.h index 4d1de5e0..f36e4a65 100644 --- a/src/plugins/splash/script/script-lib-sprite.h +++ b/src/plugins/splash/script/script-lib-sprite.h @@ -23,6 +23,7 @@ #define SCRIPT_LIB_SPRITE_H #include "script.h" +#include "ply-pixel-buffer.h" #include "ply-pixel-display.h" typedef struct @@ -38,20 +39,20 @@ typedef struct typedef struct { - int x; - int y; - int z; - double opacity; - int old_x; - int old_y; - int old_z; - int old_width; - int old_height; - double old_opacity; - bool refresh_me; - bool remove_me; - ply_image_t *image; - script_obj_t *image_obj; + int x; + int y; + int z; + double opacity; + int old_x; + int old_y; + int old_z; + int old_width; + int old_height; + double old_opacity; + bool refresh_me; + bool remove_me; + ply_pixel_buffer_t *image; + script_obj_t *image_obj; } sprite_t; script_lib_sprite_data_t *script_lib_sprite_setup (script_state_t *state,