]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
[script] Migrate from image to pixel buffer
authorCharlie Brej <cbrej@cs.man.ac.uk>
Sat, 21 Nov 2009 16:30:34 +0000 (16:30 +0000)
committerCharlie Brej <cbrej@cs.man.ac.uk>
Sat, 21 Nov 2009 16:30:34 +0000 (16:30 +0000)
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.

src/plugins/splash/script/script-lib-image.c
src/plugins/splash/script/script-lib-sprite.c
src/plugins/splash/script/script-lib-sprite.h

index 0474ae9cf531638e4967ca66597de0763568d4ac..b4f998c7ccad00f177f678952b05b640db7ab2fe 100644 (file)
@@ -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 ();
index 9078c09526d91e228b1ddc5e87c74ad6069dd4aa..89074489cd05c380ada639e49f7bd38c9f6a01c7 100644 (file)
@@ -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;
         }
index 4d1de5e089f30df2143537c5816e04f32df9cbe2..f36e4a6580f92948c1371371665494e03da7555c 100644 (file)
@@ -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,