Hello,

Here's a patch that adds a list of temporary image structures that get created if the image they reference hasn't been parsed yet.

If the .edc file is correct, at the end of parsing the "temp" list should be empty, if not, we free it and report errors.

--
Chady 'Leviathan' Kassouf
http://chady.net/
? lib/libengrave_la-engrave_style.lo
Index: bin/engrave_canvas_test_main.c
===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/engrave/src/bin/engrave_canvas_test_main.c,v
retrieving revision 1.4
diff -u -r1.4 engrave_canvas_test_main.c
--- bin/engrave_canvas_test_main.c      4 Nov 2005 23:49:11 -0000       1.4
+++ bin/engrave_canvas_test_main.c      9 Feb 2006 07:32:51 -0000
@@ -56,6 +56,12 @@
         return 1;
     }
 
+    if (!ecore_evas_init()) {
+        printf("Unable to setup ecore_evas\n");
+        return 1;
+    }
+
+
     ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 640, 480);
     ecore_evas_title_set(ee, "Engrave Canvas Test App");
     ecore_evas_callback_resize_set(ee, resize_cb);
Index: lib/engrave_file.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/engrave/src/lib/engrave_file.c,v
retrieving revision 1.19
diff -u -r1.19 engrave_file.c
--- lib/engrave_file.c  8 Feb 2006 04:38:47 -0000       1.19
+++ lib/engrave_file.c  9 Feb 2006 07:32:57 -0000
@@ -37,6 +37,12 @@
   }
   ef->images = evas_list_free(ef->images);
 
+  for (l = ef->temp; l; l = l->next) {
+    Engrave_Image *ei = l->data;
+    engrave_image_free(ei);
+  }
+  ef->temp = evas_list_free(ef->temp);
+
   for (l = ef->fonts; l; l = l->next) {
     Engrave_Font *font = l->data;
     engrave_font_free(font);
@@ -143,6 +149,35 @@
 }
 
 /**
+ * engrave_file_temp_image_add - add the image to the engrave file.
+ * @param ef: The Engrave_File to add the image to.
+ * @param ei: The Engrave_Image to add to the file.
+ *
+ * @return Returns no value.
+ */
+void
+engrave_file_temp_image_add(Engrave_File *ef, Engrave_Image *ei)
+{
+  if (!ef || !ei) return;
+  ef->temp = evas_list_append(ef->temp, ei);
+  engrave_image_parent_set(ei, ef);
+}
+
+/**
+ * engrave_file_temp_image_del - remove the image to the engrave file.
+ * @param ef: The Engrave_File to add the image to.
+ * @param ei: The Engrave_Image to add to the file.
+ *
+ * @return Returns no value.
+ */
+void
+engrave_file_temp_image_del(Engrave_File *ef, Engrave_Image *ei)
+{
+  if (!ef || !ei) return;
+  ef->temp = evas_list_remove(ef->temp, ei);
+}
+
+/**
  * engrave_file_image_add - add the image to the engrave file.
  * @param ef: The Engrave_File to add the image too.
  * @param ei: The Engrave_Image to add to the file.
@@ -258,6 +293,27 @@
 }
 
 /**
+ * engrave_file_temp_image_by_name_find - returns the Engrave_Image with the 
given name.
+ * @param ef: The Engrave_File to search for the image in.
+ * @param name: The name of the image to search for.
+ *
+ * @return Returns the Engrave_Image with the given @a name or NULL if no
+ * corresponding image can be found.
+ */
+Engrave_Image *
+engrave_file_temp_image_by_name_find(Engrave_File *ef, const char *name)
+{
+  Evas_List *l;
+  for (l = ef->temp; l; l = l->next)
+  {
+    Engrave_Image *im = l->data;
+    if (im && !strcmp(engrave_image_name_get(im), name))
+      return im;
+  }
+  return NULL;
+}
+
+/**
  * engrave_file_images_count - get the number of images
  * @param ef: The Engrave_File to check for images
  * 
Index: lib/engrave_file.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/engrave/src/lib/engrave_file.h,v
retrieving revision 1.12
diff -u -r1.12 engrave_file.h
--- lib/engrave_file.h  8 Feb 2006 04:38:47 -0000       1.12
+++ lib/engrave_file.h  9 Feb 2006 07:32:57 -0000
@@ -26,6 +26,7 @@
   char *im_dir;      /**< The image directory */
 
   Evas_List *images; /**< The list of images in the file */
+  Evas_List *temp; /**< The list of temporary images while parsing */
   Evas_List *fonts;  /**< The list of fonts in the file  */
   Evas_List *styles;  /**< The list of styles in the file  */
   Evas_List *data;   /**< The list of data items in the file */
@@ -44,6 +45,8 @@
 void engrave_file_font_add(Engrave_File *e, Engrave_Font *ef);
 void engrave_file_style_add(Engrave_File *e, Engrave_Style *es);
 void engrave_file_image_add(Engrave_File *ef, Engrave_Image *ei);
+void engrave_file_temp_image_add(Engrave_File *ef, Engrave_Image *ei);
+void engrave_file_temp_image_del(Engrave_File *ef, Engrave_Image *ei);
 void engrave_file_data_add(Engrave_File *ef, Engrave_Data *ed);
 void engrave_file_group_add(Engrave_File *ef, Engrave_Group *eg);
 
@@ -57,6 +60,8 @@
 
 Engrave_Image *engrave_file_image_by_name_find(Engrave_File *ef,
                                               const char *name);
+Engrave_Image *engrave_file_temp_image_by_name_find(Engrave_File *ef,
+                                              const char *name);
 
 int engrave_file_images_count(Engrave_File *ef);
 int engrave_file_data_count(Engrave_File *ef);
Index: lib/engrave_parse.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/engrave/src/lib/engrave_parse.c,v
retrieving revision 1.14
diff -u -r1.14 engrave_parse.c
--- lib/engrave_parse.c 8 Feb 2006 04:38:47 -0000       1.14
+++ lib/engrave_parse.c 9 Feb 2006 07:33:02 -0000
@@ -8,6 +8,8 @@
 Engrave_File *
 engrave_parse(const char *file, const char *imdir, const char *fontdir)
 {
+  int i;
+  Evas_List *l;
   engrave_file = engrave_file_new();
   engrave_file_image_dir_set(engrave_file, imdir);
   engrave_file_font_dir_set(engrave_file, fontdir);
@@ -16,6 +18,17 @@
   yyparse();
   fclose(yyin);
 
+  i = evas_list_count(engrave_file->temp);
+  if (i > 0) {
+     for (l = engrave_file->temp; l; l = l->next) {
+         Engrave_Image * ei;
+        ei = l->data;
+         printf("Error: image %s was not found.\n", 
engrave_image_name_get(ei));
+        engrave_image_free(ei);
+     }
+     engrave_file->temp = evas_list_free(engrave_file->temp);
+  }
+
   return (engrave_file);
 }
 
@@ -31,7 +44,15 @@
 engrave_parse_image(char *name, Engrave_Image_Type type, double value)
 {
   Engrave_Image *image;
-  image = engrave_image_new(name, type, value);
+  image = engrave_file_temp_image_by_name_find(engrave_file, name);
+  if (!image) { 
+    image = engrave_image_new(name, type, value);
+  } else {
+    engrave_file_temp_image_del(engrave_file, image);
+    /* XXX create methods in engrave_image to set these values? */
+    image->type = type;
+    image->value = value;
+  }
   engrave_file_image_add(engrave_file, image);
 }
 
@@ -581,8 +602,11 @@
   im = engrave_file_image_by_name_find(engrave_file, name);
   if (im)
     engrave_part_state_image_normal_set(state, im);
-  else
-    printf("Error: image \"%s\" does not exist\n", name);
+  else {
+    im = engrave_image_new(name, 0, 0.0);
+    engrave_file_temp_image_add(engrave_file, im);
+    engrave_part_state_image_normal_set(state, im);
+  }
 }
 
 void
@@ -614,8 +638,11 @@
   im = engrave_file_image_by_name_find(engrave_file, name);
   if (im)
     engrave_part_state_image_tween_add(state, im);
-  else
-    printf("Error: image \"%s\" does not exist\n", name);
+  else {
+    im = engrave_image_new(name, 0, 0.0);
+    engrave_file_temp_image_add(engrave_file, im);
+    engrave_part_state_image_normal_set(state, im);
+  }
 }
 
 void

Reply via email to