--- /dev/null
+/*
+ * A small binary utility for packing basic data and images into eet files.
+ * Can be used in combination with the "eet" utility and can even be used
+ * to stuff more data into edj files (which are eet). Run tool for help.
+ */
+#include <Eina.h>
+#include <Eet.h>
+#include <Evas.h>
+#include <Ecore_Evas.h>
+
+static const char *file = NULL;
+static Eet_File *ef = NULL;
+static Ecore_Evas *ee = NULL;
+static Evas *evas = NULL;
+static Evas_Object *im_obj = NULL;
+
+static void
+file_add(void)
+{
+ if (ef) return;
+ ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
+ if (!ef) ef = eet_open(file, EET_FILE_MODE_WRITE);
+ if (!ef)
+ {
+ printf("ERROR: Cannot open %s for reading or writing!\n", file);
+ exit(-1);
+ }
+}
+
+static void
+file_del(void)
+{
+ if (ef) return;
+ ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
+ if (!ef)
+ {
+ printf("ERROR: Cannot open %s for writing!\n", file);
+ exit(-1);
+ }
+}
+
+static void
+check_argc(int argc, int i)
+{
+ if (i >= argc)
+ {
+ printf("ERROR: ran out of arguments at argument #%i\n", i);
+ exit(-1);
+ }
+}
+
+static void
+commands(int start, int argc, char **argv)
+{
+ int i;
+ const char *key, *file, *mode;
+ void *pixels, *data;
+ int w, h, alpha, compress, quality;
+ Eet_Image_Encoding lossy;
+ Eina_File *f;
+ size_t size;
+
+ for (i = start; i < argc;)
+ {
+ if (!strcmp(argv[i], "+"))
+ {
+ i++; check_argc(argc, i);
+ key = argv[i];
+ i++; check_argc(argc, i);
+ file_add();
+ if (!strcmp(argv[i], "im"))
+ {
+ i++; check_argc(argc, i);
+ file = argv[i];
+ i++; check_argc(argc, i);
+ mode = argv[i];
+ evas_object_image_file_set(im_obj, file, NULL);
+ if (evas_object_image_load_error_get(im_obj) != EVAS_LOAD_ERROR_NONE)
+ {
+ printf("ERROR: cannot load image file '%s'\n", file);
+ exit(-1);
+ }
+ pixels = evas_object_image_data_get(im_obj, EINA_FALSE);
+ if (!pixels)
+ {
+ printf("ERROR: cannot get pixel data for file '%s'\n", file);
+ exit(-1);
+ }
+ evas_object_image_size_get(im_obj, &w, &h);
+ if ((w <= 0) || (h <= 0))
+ {
+ printf("ERROR: width or height <= 0 for file '%s'\n", file);
+ exit(-1);
+ }
+ alpha = evas_object_image_alpha_get(im_obj);
+ quality = 0;
+ compress = 0;
+ lossy = EET_IMAGE_LOSSLESS;
+ if (!strcmp(mode, "none"))
+ {
+ lossy = EET_IMAGE_LOSSLESS;
+ compress = EET_COMPRESSION_NONE;
+ }
+ else if (!strcmp(mode, "lo"))
+ {
+ lossy = EET_IMAGE_LOSSLESS;
+ compress = EET_COMPRESSION_LOW;
+ }
+ else if (!strcmp(mode, "med"))
+ {
+ lossy = EET_IMAGE_LOSSLESS;
+ compress = EET_COMPRESSION_MED;
+ }
+ else if (!strcmp(mode, "hi"))
+ {
+ lossy = EET_IMAGE_LOSSLESS;
+ compress = EET_COMPRESSION_HI;
+ }
+ else if (!strcmp(mode, "fast"))
+ {
+ lossy = EET_IMAGE_LOSSLESS;
+ compress = EET_COMPRESSION_VERYFAST;
+ }
+ else if (!strcmp(mode, "super"))
+ {
+ lossy = EET_IMAGE_LOSSLESS;
+ compress = EET_COMPRESSION_SUPERFAST;
+ }
+ else if (!strcmp(mode, "etc1"))
+ {
+ if (alpha) lossy = EET_IMAGE_ETC1_ALPHA;
+ else lossy = EET_IMAGE_ETC1;
+ compress = EET_COMPRESSION_SUPERFAST;
+ }
+ else if (!strcmp(mode, "etc2"))
+ {
+ if (alpha) lossy = EET_IMAGE_ETC2_RGBA;
+ else lossy = EET_IMAGE_ETC2_RGB;
+ compress = EET_COMPRESSION_SUPERFAST;
+ }
+ else
+ {
+ quality = atoi(mode);
+ lossy = EET_IMAGE_JPEG;
+ }
+ if (eet_data_image_write(ef, key, pixels, w, h, alpha,
+ compress, quality, lossy) <= 0)
+ {
+ printf("ERROR: cannot encode file '%s' in key '%s'\n", file, key);
+ exit(-1);
+ }
+ }
+ else if (!strcmp(argv[i], "data"))
+ {
+ i++; check_argc(argc, i);
+ file = argv[i];
+ i++; check_argc(argc, i);
+ mode = argv[i];
+ f = eina_file_open(file, EINA_FALSE);
+ if (!f)
+ {
+ printf("ERROR: cannot open file '%s'\n", file);
+ exit(-1);
+ }
+ size = eina_file_size_get(f);
+ if (size == 0)
+ {
+ printf("ERROR: file '%s' is zero sized\n", file);
+ exit(-1);
+ }
+ if (size >= 0x7f000000)
+ {
+ printf("ERROR: file '%s' is too big (a bit under 2GB max)\n", file);
+ exit(-1);
+ }
+ data = eina_file_map_all(f, EINA_FILE_POPULATE);
+ if (!data)
+ {
+ printf("ERROR: cannot mmap file '%s'\n", file);
+ exit(-1);
+ }
+ compress = 0;
+ if (!strcmp(mode, "none"))
+ {
+ compress = EET_COMPRESSION_NONE;
+ }
+ else if (!strcmp(mode, "lo"))
+ {
+ compress = EET_COMPRESSION_LOW;
+ }
+ else if (!strcmp(mode, "med"))
+ {
+ compress = EET_COMPRESSION_MED;
+ }
+ else if (!strcmp(mode, "hi"))
+ {
+ compress = EET_COMPRESSION_HI;
+ }
+ else if (!strcmp(mode, "fast"))
+ {
+ compress = EET_COMPRESSION_VERYFAST;
+ }
+ else if (!strcmp(mode, "super"))
+ {
+ compress = EET_COMPRESSION_SUPERFAST;
+ }
+ else
+ {
+ printf("ERROR: invalid compress mode '%s' for file '%s'\n", mode, file);
+ exit(-1);
+ }
+ if (eet_write(ef, key, data, size, compress) <= 0)
+ {
+ printf("ERROR: cannot encode file '%s' in key '%s'\n", file, key);
+ exit(-1);
+ }
+ eina_file_map_free(f, data);
+ eina_file_close(f);
+ }
+ i++;
+ }
+ else if (!strcmp(argv[i], "-"))
+ {
+ i++; check_argc(argc, i);
+ key = argv[i];
+ file_del();
+ eet_delete(ef, key);
+ i++;
+ }
+ else
+ {
+ printf("invalid argument #%i of '%s'\n", i, argv[i]);
+ exit(-1);
+ }
+ }
+}
+
+static void
+scratch_canvas_init(void)
+{
+ ee = ecore_evas_buffer_new(1, 1);
+ if (!ee)
+ {
+ printf("ERROR: cannot create buffer canvas!\n");
+ exit(-1);
+ }
+ evas = ecore_evas_get(ee);
+ im_obj = evas_object_image_add(evas);
+}
+
+int
+main(int argc, char **argv)
+{
+ if (argc <= 1)
+ {
+ printf
+ ("USAGE: \n"
+ " eetpack outputfile.eet [commands]\n"
+ "WHERE commands are a series of one or more of:\n"
+ " + KEY im IMG-FILE [none|lo|med|hi|fast|super|etc1|etc2|0-100]\n"
+ " + KEY data DATA-FILE [none|lo|med|hi|fast|super]\n"
+ " - KEY\n"
+ "\n"
+ "e.g.\n"
+ "add 2 images and a text file to the archive:\n"
+ " eetpack archive.eet \\\n"
+ " + mykey1 im image.png fast \\\n"
+ " + mykey2 im logo.png 70 \\\n"
+ " + mydata1 data file.txt hi \\\n"
+ "\n"
+ "remove keys from an archive:\n"
+ " eetpack archive.eet - mykey2 - mydata1\n"
+ );
+
+ return -1;
+ }
+ eina_init();
+ eet_init();
+ evas_init();
+ ecore_evas_init();
+
+ scratch_canvas_init();
+ file = argv[1];
+ commands(2, argc, argv);
+ if (ef) eet_close(ef);
+
+ ecore_evas_shutdown();
+ evas_shutdown();
+ eet_shutdown();
+ eina_shutdown();
+ return 0;
+}