diff --git a/legacy/edje/configure.in b/legacy/edje/configure.in
index 4a50831c95..ed2353e3e0 100644
--- a/legacy/edje/configure.in
+++ b/legacy/edje/configure.in
@@ -121,13 +121,17 @@ fi
AC_SUBST(edje_def)
EDJE_CC_PRG=""
+EDJE_DECC_PRG=""
if test "x$have_edje_cc" = "xyes"; then
AM_CONDITIONAL(BUILD_EDJE_CC, true)
EDJE_CC_PRG="edje_cc"
+ EDJE_DECC_PRG="edje_decc"
else
AM_CONDITIONAL(BUILD_EDJE_CC, false)
+ AM_CONDITIONAL(BUILD_EDJE_DECC, false)
fi
AC_SUBST(EDJE_CC_PRG)
+AC_SUBST(EDJE_DECC_PRG)
AC_ARG_WITH(eet,
[ --with-eet=DIR use eet in
],
diff --git a/legacy/edje/src/bin/Makefile.am b/legacy/edje/src/bin/Makefile.am
index 74aef6c49d..f68a32b71c 100644
--- a/legacy/edje/src/bin/Makefile.am
+++ b/legacy/edje/src/bin/Makefile.am
@@ -12,10 +12,12 @@ INCLUDES = \
bin_PROGRAMS = \
edje \
edje_ls \
-@EDJE_CC_PRG@
+@EDJE_CC_PRG@ \
+@EDJE_DECC_PRG@
EXTRA_PROGRAMS = \
-edje_cc
+edje_cc \
+edje_decc
edje_SOURCES = \
edje_main.c \
@@ -38,7 +40,8 @@ edje_cc.h \
edje_cc_out.c \
edje_cc_parse.c \
edje_cc_mem.c \
-edje_cc_handlers.c
+edje_cc_handlers.c \
+edje_cc_sources.c
edje_cc_LDADD = \
$(top_builddir)/src/lib/libedje.la \
@@ -51,6 +54,24 @@ edje_cc_LDFLAGS =
edje_cc_DEPENDENCIES = $(top_builddir)/src/lib/libedje.la
+edje_decc_SOURCES = \
+edje_decc.c \
+edje_decc.h \
+edje_cc_mem.c \
+edje_cc_sources.c
+
+edje_decc_LDADD = \
+$(top_builddir)/src/lib/libedje.la \
+@imlib2_libs@
+
+edje_decc_CPPFLAGS = @edje_def@
+
+edje_decc_LDFLAGS =
+
+edje_decc_DEPENDENCIES = $(top_builddir)/src/lib/libedje.la
+
+
+
edje_ls_SOURCES = \
edje_ls.c
diff --git a/legacy/edje/src/bin/edje_cc.c b/legacy/edje/src/bin/edje_cc.c
index 09780c5836..e20774798b 100644
--- a/legacy/edje/src/bin/edje_cc.c
+++ b/legacy/edje/src/bin/edje_cc.c
@@ -90,6 +90,9 @@ main(int argc, char **argv)
edje_file = mem_alloc(SZ(Edje_File));
edje_file->version = EDJE_FILE_VERSION;
+ source_edd();
+ source_fetch();
+
data_setup();
compile();
data_process_scripts();
diff --git a/legacy/edje/src/bin/edje_cc.h b/legacy/edje/src/bin/edje_cc.h
index 68331dd735..7650ec43f5 100644
--- a/legacy/edje/src/bin/edje_cc.h
+++ b/legacy/edje/src/bin/edje_cc.h
@@ -25,9 +25,12 @@
/* types */
typedef struct _New_Object_Handler New_Object_Handler;
typedef struct _New_Statement_Handler New_Statement_Handler;
+typedef struct _Font_List Font_List;
typedef struct _Font Font;
typedef struct _Code Code;
typedef struct _Code_Program Code_Program;
+typedef struct _SrcFile SrcFile;
+typedef struct _SrcFile_List SrcFile_List;
struct _New_Object_Handler
{
@@ -41,6 +44,11 @@ struct _New_Statement_Handler
void (*func)(void);
};
+struct _Font_List
+{
+ Evas_List *list;
+};
+
struct _Font
{
char *file;
@@ -61,6 +69,17 @@ struct _Code_Program
char *script;
};
+struct _SrcFile
+{
+ char *name;
+ char *file;
+};
+
+struct _SrcFile_List
+{
+ Evas_List *list;
+};
+
/* global fn calls */
void data_setup(void);
void data_write(void);
@@ -91,6 +110,13 @@ double parse_float_range(int n, double f, double t);
int object_handler_num(void);
int statement_handler_num(void);
+void source_edd(void);
+void source_fetch(void);
+int source_append(Eet_File *ef);
+SrcFile_List *source_load(Eet_File *ef);
+int source_fontmap_save(Eet_File *ef, Evas_List *fonts);
+Font_List *source_fontmap_load(Eet_File *ef);
+
void *mem_alloc(size_t size);
char *mem_strdup(const char *s);
#define SZ sizeof
diff --git a/legacy/edje/src/bin/edje_cc_out.c b/legacy/edje/src/bin/edje_cc_out.c
index 53ad391035..5b63d627e6 100644
--- a/legacy/edje/src/bin/edje_cc_out.c
+++ b/legacy/edje/src/bin/edje_cc_out.c
@@ -90,6 +90,8 @@ data_write(void)
int bytes;
int input_bytes;
int total_bytes;
+ int src_bytes;
+ int fmap_bytes;
int input_raw_bytes;
int image_num;
int font_num;
@@ -99,6 +101,8 @@ data_write(void)
bytes = 0;
input_bytes = 0;
total_bytes = 0;
+ src_bytes = 0;
+ fmap_bytes = 0;
input_raw_bytes = 0;
image_num = 0;
font_num = 0;
@@ -549,6 +553,10 @@ data_write(void)
}
}
}
+ src_bytes = source_append(ef);
+ total_bytes += src_bytes;
+ fmap_bytes = source_fontmap_save(ef, fonts);
+ total_bytes += fmap_bytes;
eet_close(ef);
if (verbose)
{
@@ -562,6 +570,8 @@ data_write(void)
" Wrote %i collections\n"
" Wrote %i images\n"
" Wrote %i fonts\n"
+ " Wrote %i bytes (%iKb) of original source data\n"
+ " Wrote %i bytes (%iKb) of original source font map\n"
"Conservative compression summary:\n"
" Wrote total %i bytes (%iKb) from %i (%iKb) input data\n"
" Output file is %3.1f%% the size of the input data\n"
@@ -574,6 +584,8 @@ data_write(void)
collection_num,
image_num,
font_num,
+ src_bytes, (src_bytes + 512) / 1024,
+ fmap_bytes, (fmap_bytes + 512) / 1024,
total_bytes, (total_bytes + 512) / 1024,
input_bytes, (input_bytes + 512) / 1024,
(100.0 * (double)total_bytes) / (double)input_bytes,
diff --git a/legacy/edje/src/bin/edje_cc_sources.c b/legacy/edje/src/bin/edje_cc_sources.c
new file mode 100644
index 0000000000..a2e01f7765
--- /dev/null
+++ b/legacy/edje/src/bin/edje_cc_sources.c
@@ -0,0 +1,224 @@
+#include "edje_cc.h"
+
+static Eet_Data_Descriptor *_srcfile_edd = NULL;
+static Eet_Data_Descriptor *_srcfile_list_edd = NULL;
+
+static Eet_Data_Descriptor *_font_edd = NULL;
+static Eet_Data_Descriptor *_font_list_edd = NULL;
+
+static SrcFile_List srcfiles = {NULL};
+
+void
+source_edd(void)
+{
+ _srcfile_edd = eet_data_descriptor_new("srcfile", sizeof(SrcFile),
+ (void *(*) (void *))evas_list_next,
+ (void *(*) (void *, void *))evas_list_append,
+ (void *(*) (void *))evas_list_data,
+ (void *(*) (void *))evas_list_free,
+ (void (*) (void *, int (*) (void *, const char *, void *, void *), void *))evas_hash_foreach,
+ (void *(*) (void *, const char *, void *))evas_hash_add,
+ (void (*) (void *))evas_hash_free);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_srcfile_edd, SrcFile, "name", name, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_srcfile_edd, SrcFile, "file", file, EET_T_STRING);
+ _srcfile_list_edd = eet_data_descriptor_new("srcfile_list", sizeof(SrcFile_List),
+ (void *(*) (void *))evas_list_next,
+ (void *(*) (void *, void *))evas_list_append,
+ (void *(*) (void *))evas_list_data,
+ (void *(*) (void *))evas_list_free,
+ (void (*) (void *, int (*) (void *, const char *, void *, void *), void *))evas_hash_foreach,
+ (void *(*) (void *, const char *, void *))evas_hash_add,
+ (void (*) (void *))evas_hash_free);
+ EET_DATA_DESCRIPTOR_ADD_LIST(_srcfile_list_edd, SrcFile_List, "list", list, _srcfile_edd);
+
+ _font_edd = eet_data_descriptor_new("font", sizeof(Font),
+ (void *(*) (void *))evas_list_next,
+ (void *(*) (void *, void *))evas_list_append,
+ (void *(*) (void *))evas_list_data,
+ (void *(*) (void *))evas_list_free,
+ (void (*) (void *, int (*) (void *, const char *, void *, void *), void *))evas_hash_foreach,
+ (void *(*) (void *, const char *, void *))evas_hash_add,
+ (void (*) (void *))evas_hash_free);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font, "file", file, EET_T_STRING);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font, "name", name, EET_T_STRING);
+ _font_list_edd = eet_data_descriptor_new("font_list", sizeof(Font_List),
+ (void *(*) (void *))evas_list_next,
+ (void *(*) (void *, void *))evas_list_append,
+ (void *(*) (void *))evas_list_data,
+ (void *(*) (void *))evas_list_free,
+ (void (*) (void *, int (*) (void *, const char *, void *, void *), void *))evas_hash_foreach,
+ (void *(*) (void *, const char *, void *))evas_hash_add,
+ (void (*) (void *))evas_hash_free);
+ EET_DATA_DESCRIPTOR_ADD_LIST(_font_list_edd, Font_List, "list", list, _font_edd);
+}
+
+void
+source_fetch(void)
+{
+ FILE *f;
+ char buf[256 * 1024];
+
+ f = fopen(file_in, "r");
+ if (!f)
+ {
+ return;
+ }
+ else
+ {
+ long sz;
+ SrcFile *sf;
+
+ fseek(f, 0, SEEK_END);
+ sz = ftell(f);
+ fseek(f, 0, SEEK_SET);
+ sf = mem_alloc(SZ(SrcFile));
+ sf->name = strdup("main_edje_source.edc");
+ sf->file = mem_alloc(sz);
+ fread(sf->file, sz, 1, f);
+ fseek(f, 0, SEEK_SET);
+ srcfiles.list = evas_list_append(srcfiles.list, sf);
+ }
+
+ while (fgets(buf, sizeof(buf), f))
+ {
+ char *p, *pp;
+ int notyet;
+ int forgetit;
+ int haveinclude;
+ int havefile;
+ char *file;
+
+ p = buf;
+ notyet = 1;
+ forgetit = 0;
+ haveinclude = 0;
+ havefile = 0;
+ file = NULL;
+ while ((!forgetit) && (*p))
+ {
+ if (notyet)
+ {
+ if (!isblank(*p))
+ {
+ if (*p == '#')
+ notyet = 0;
+ else
+ forgetit = 1;
+ }
+ p++;
+ }
+ else
+ {
+ if (!haveinclude)
+ {
+ if (!isblank(*p))
+ {
+ if (!strncmp(p, "include", 7))
+ {
+ haveinclude = 1;
+ p += 7;
+ }
+ else
+ forgetit = 1;
+ }
+ }
+ else
+ {
+ if (!havefile)
+ {
+ if (!isblank(*p))
+ {
+ if (*p == '"')
+ {
+ pp = strchr(p + 1, '"');
+ if (!pp)
+ forgetit = 1;
+ else
+ {
+ file = mem_alloc(pp - p);
+ strncpy(file, p + 1, pp - p - 1);
+ file[pp - p - 1] = 0;
+ forgetit = 1;
+ }
+ }
+ else if (*p == '<')
+ {
+ pp = strchr(p + 1, '>');
+ if (!pp)
+ forgetit = 1;
+ else
+ {
+ file = mem_alloc(pp - p);
+ strncpy(file, p + 1, pp - p - 1);
+ file[pp - p - 1] = 0;
+ forgetit = 1;
+ }
+ }
+ else
+ forgetit = 1;
+ }
+ }
+ }
+ }
+ }
+ if (file)
+ {
+ FILE *ff;
+
+ ff = fopen(file, "r");
+ if (ff)
+ {
+ long sz;
+ SrcFile *sf;
+
+ fseek(ff, 0, SEEK_END);
+ sz = ftell(ff);
+ fseek(ff, 0, SEEK_SET);
+ sf = mem_alloc(SZ(SrcFile));
+ sf->name = file;
+ sf->file = mem_alloc(sz);
+ fread(sf->file, sz, 1, ff);
+ fclose(ff);
+ srcfiles.list = evas_list_append(srcfiles.list, sf);
+ }
+ else
+ {
+ free(file);
+ }
+ }
+ }
+ fclose(f);
+}
+
+int
+source_append(Eet_File *ef)
+{
+ return eet_data_write(ef, _srcfile_list_edd, "edje_sources", &srcfiles, 1);
+}
+
+SrcFile_List *
+source_load(Eet_File *ef)
+{
+ SrcFile_List *s;
+
+ s = eet_data_read(ef, _srcfile_list_edd, "edje_sources");
+ return s;
+}
+
+int
+source_fontmap_save(Eet_File *ef, Evas_List *fonts)
+{
+ Font_List fl;
+
+ fl.list = fonts;
+ return eet_data_write(ef, _font_list_edd, "edje_source_fontmap", &fl, 1);
+}
+
+Font_List *
+source_fontmap_load(Eet_File *ef)
+{
+ Font_List *fl;
+
+ fl = eet_data_read(ef, _font_list_edd, "edje_source_fontmap");
+ return fl;
+}
diff --git a/legacy/edje/src/bin/edje_decc.c b/legacy/edje/src/bin/edje_decc.c
new file mode 100644
index 0000000000..5cf01e75e2
--- /dev/null
+++ b/legacy/edje/src/bin/edje_decc.c
@@ -0,0 +1,252 @@
+/* ugly ugly. avert your eyes. */
+#include "edje_decc.h"
+#include
+#include
+#include
+#include
+
+char *progname = NULL;
+char *file_in = NULL;
+
+Edje_File *edje_file = NULL;
+SrcFile_List *srcfiles = NULL;
+Font_List *fontlist = NULL;
+
+int line = 0;
+
+int decomp(void);
+void output(void);
+int e_file_is_dir(char *file);
+int e_file_mkdir(char *dir);
+int e_file_mkpath(char *path);
+
+static void
+main_help(void)
+{
+ printf
+ ("Usage:\n"
+ "\t%s input_file.eet \n"
+ "\n"
+ ,progname);
+}
+
+int
+main(int argc, char **argv)
+{
+ int i;
+
+ setlocale(LC_NUMERIC, "C");
+
+ progname = argv[0];
+ for (i = 1; i < argc; i++)
+ {
+ if (!file_in)
+ file_in = argv[i];
+ }
+ if (!file_in)
+ {
+ fprintf(stderr, "%s: Error: no input file specified.\n", progname);
+ main_help();
+ exit(-1);
+ }
+
+ edje_init();
+ eet_init();
+ source_edd();
+
+ if (!decomp()) return -1;
+ output();
+
+ eet_shutdown();
+ return 0;
+}
+
+int
+decomp(void)
+{
+ Eet_File *ef;
+ ef = eet_open(file_in, EET_FILE_MODE_READ);
+ if (!ef) return 0;
+
+ srcfiles = source_load(ef);
+ if (!srcfiles)
+ {
+ eet_close(ef);
+ return 0;
+ }
+ edje_file = eet_data_read(ef, _edje_edd_edje_file, "edje_file");
+ fontlist = source_fontmap_load(ef);
+ eet_close(ef);
+ return 1;
+}
+
+void
+output(void)
+{
+ Evas_List *l;
+ Eet_File *ef;
+ char *outdir, *p;
+ int i;
+
+ p = strrchr(file_in, '/');
+ if (p)
+ outdir = strdup(p + 1);
+ else
+ outdir = strdup(file_in);
+ p = strrchr(outdir, '.');
+ if (p) *p = 0;
+
+ e_file_mkpath(outdir);
+
+ ef = eet_open(file_in, EET_FILE_MODE_READ);
+ if (edje_file->image_dir)
+ {
+ for (l = edje_file->image_dir->entries; l; l = l->next)
+ {
+ Edje_Image_Directory_Entry *ei;
+
+ ei = l->data;
+ if ((ei->source_type) && (ei->entry))
+ {
+ DATA32 *pix;
+ int w, h, alpha, comp, qual, lossy;
+ char buf[4096];
+
+ snprintf(buf, sizeof(buf), "images/%i", ei->id);
+ pix = eet_data_image_read(ef, buf, &w, &h, &alpha, &comp, &qual, &lossy);
+ if (pix)
+ {
+ Imlib_Image im;
+ char out[4096];
+ char *pp;
+
+ snprintf(out, sizeof(out), "%s/%s", outdir, ei->entry);
+ pp = strdup(out);
+ p = strrchr(pp, '/');
+ *p = 0;
+ e_file_mkpath(pp);
+ free(pp);
+ printf("Output Image: %s\n", out);
+ im = imlib_create_image_using_data(w, h, pix);
+ imlib_context_set_image(im);
+ if (alpha)
+ imlib_image_set_has_alpha(1);
+ if ((lossy) && (!alpha))
+ {
+ imlib_image_set_format("jpg");
+ imlib_image_attach_data_value("quality", NULL, qual, NULL);
+ }
+ else
+ {
+ imlib_image_set_format("png");
+ }
+ imlib_save_image(out);
+ imlib_free_image();
+ free(pix);
+ }
+ }
+ }
+ }
+ for (l = srcfiles->list; l; l = l->next)
+ {
+ SrcFile *sf;
+ char out[4096];
+ FILE *f;
+ char *pp;
+
+ sf = l->data;
+ snprintf(out, sizeof(out), "%s/%s", outdir, sf->name);
+ printf("Output Source File: %s\n", out);
+ pp = strdup(out);
+ p = strrchr(pp, '/');
+ *p = 0;
+ e_file_mkpath(pp);
+ free(pp);
+ f = fopen(out, "w");
+ fputs(sf->file, f);
+ fclose(f);
+ }
+ if (fontlist)
+ {
+ for (l = fontlist->list; l; l = l->next)
+ {
+ Font *fn;
+ void *font;
+ int fontsize;
+ char out[4096];
+
+ fn = l->data;
+ snprintf(out, sizeof(out), "fonts/%s", fn->name);
+ font = eet_read(ef, out, &fontsize);
+ if (font)
+ {
+ FILE *f;
+
+ snprintf(out, sizeof(out), "%s/%s", outdir, fn->file);
+ printf("Output Font: %s\n", out);
+ f = fopen(out, "w");
+ fwrite(font, fontsize, 1, f);
+ fclose(f);
+ free(font);
+ }
+ }
+ }
+ {
+ char out[4096];
+ FILE *f;
+
+ snprintf(out, sizeof(out), "%s/build.sh", outdir);
+ printf("Output Build Script: %s\n", out);
+ f = fopen(out, "w");
+ fprintf(f, "#!/bin/sh\n");
+ fprintf(f, "edje_cc -id . -fd . main_edje_source.edc %s.eet\n", outdir);
+ fclose(f);
+ chmod(out, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP);
+ }
+ eet_close(ef);
+}
+
+int
+e_file_is_dir(char *file)
+{
+ struct stat st;
+
+ if (stat(file, &st) < 0) return 0;
+ if (S_ISDIR(st.st_mode)) return 1;
+ return 0;
+}
+
+static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
+
+int
+e_file_mkdir(char *dir)
+{
+ if (mkdir(dir, default_mode) < 0) return 0;
+ return 1;
+}
+
+int
+e_file_mkpath(char *path)
+{
+ char ss[PATH_MAX];
+ int i, ii;
+
+ ss[0] = 0;
+ i = 0;
+ ii = 0;
+ while (path[i])
+ {
+ if (ii == sizeof(ss) - 1) return 0;
+ ss[ii++] = path[i];
+ ss[ii] = 0;
+ if (path[i] == '/')
+ {
+ if (!e_file_is_dir(ss)) e_file_mkdir(ss);
+ else if (!e_file_is_dir(ss)) return 0;
+ }
+ i++;
+ }
+ if (!e_file_is_dir(ss)) e_file_mkdir(ss);
+ else if (!e_file_is_dir(ss)) return 0;
+ return 1;
+}
diff --git a/legacy/edje/src/bin/edje_decc.h b/legacy/edje/src/bin/edje_decc.h
new file mode 100644
index 0000000000..bce6c3d562
--- /dev/null
+++ b/legacy/edje/src/bin/edje_decc.h
@@ -0,0 +1,64 @@
+#ifndef EDJE_DECC_H
+#define EDJE_DECC_H
+
+#include "edje_main.h"
+/* Imlib2 stuff for loading up input images */
+#define X_DISPLAY_MISSING
+#include
+/* done Imlib2 stuff */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#ifdef HAVE_ALLOCA_H
+#include
+#endif
+
+/* types */
+typedef struct _Font Font;
+typedef struct _Font_List Font_List;
+typedef struct _SrcFile SrcFile;
+typedef struct _SrcFile_List SrcFile_List;
+
+struct _Font
+{
+ char *file;
+ char *name;
+};
+
+struct _Font_List
+{
+ Evas_List *list;
+};
+
+struct _SrcFile
+{
+ char *name;
+ char *file;
+};
+
+struct _SrcFile_List
+{
+ Evas_List *list;
+};
+
+void source_edd(void);
+void source_fetch(void);
+int source_append(Eet_File *ef);
+SrcFile_List *source_load(Eet_File *ef);
+int source_fontmap_save(Eet_File *ef, Evas_List *fonts);
+Font_List *source_fontmap_load(Eet_File *ef);
+
+void *mem_alloc(size_t size);
+char *mem_strdup(const char *s);
+#define SZ sizeof
+
+#endif