move around - flatter.
[profile/ivi/evas.git] / src / modules / loaders / edb / evas_image_load_edb.c
1 #include "evas_common.h"
2 #include "evas_private.h"
3
4 #include <Edb.h>
5 #include <zlib.h>
6
7
8 #define SWAP32(x) (x) = ((((x) & 0x000000ff ) << 24) | (((x) & 0x0000ff00 ) << 8) | (((x) & 0x00ff0000 ) >> 8) | (((x) & 0xff000000 ) >> 24))
9
10
11 int evas_image_load_file_head_edb(Image_Entry *ie, const char *file, const char *key);
12 int evas_image_load_file_data_edb(Image_Entry *ie, const char *file, const char *key);
13
14 Evas_Image_Load_Func evas_image_load_edb_func =
15 {
16   evas_image_load_file_head_edb,
17   evas_image_load_file_data_edb
18 };
19
20
21 int
22 evas_image_load_file_head_edb(Image_Entry *ie, const char *file, const char *key)
23 {
24    int                  w, h, alpha, compression, size;
25    E_DB_File           *db;
26    DATA32              *ret;
27    DATA32               header[8];
28
29    if ((!file) || (!key)) return 0;
30    db = e_db_open_read((char *)file);
31    if (!db) return 0;
32    ret = e_db_data_get(db, (char *)key, &size);
33    if (!ret)
34      {
35         e_db_close(db);
36         return 0;
37      }
38    if (size < 32)
39      {
40         free(ret);
41         e_db_close(db);
42         return 0;
43      }
44    memcpy(header, ret, 32);
45 #ifdef WORDS_BIGENDIAN
46      {
47         int i;
48
49         for (i = 0; i < 8; i++) SWAP32(header[i]);
50      }
51 #endif
52    if (header[0] != 0xac1dfeed)
53      {
54         free(ret);
55         e_db_close(db);
56         return 0;
57      }
58    w = header[1];
59    h = header[2];
60    if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192))
61      {
62         free(ret);
63         e_db_close(db);
64         return 0;
65      }
66    alpha = header[3];
67    compression = header[4];
68    
69    if ((compression == 0) && (size < ((w * h * 4) + 32)))
70      {
71         free(ret);
72         e_db_close(db);
73         return 0;
74      }
75    if (alpha) ie->flags.alpha = 1;
76    ie->w = w;
77    ie->h = h;
78    free(ret);
79    e_db_close(db);
80    return 1;
81 }
82
83 int
84 evas_image_load_file_data_edb(Image_Entry *ie, const char *file, const char *key)
85 {
86    int                  w, h, alpha, compression, size;
87    E_DB_File           *db;
88    DATA32              *ret;
89    DATA32              *body;
90    DATA32              *surface;
91    DATA32               header[8];
92
93    if ((!file) || (!key)) return 0;
94    db = e_db_open_read((char *)file);
95    if (!db) return 0;
96    ret = e_db_data_get(db, (char *)key, &size);
97    if (!ret)
98      {
99         e_db_close(db);
100         return 0;
101      }
102    if (size < 32)
103      {
104         free(ret);
105         e_db_close(db);
106         return 0;
107      }
108    memcpy(header, ret, 32);
109 #ifdef WORDS_BIGENDIAN
110      {
111         int i;
112
113         for (i = 0; i < 8; i++) SWAP32(header[i]);
114      }
115 #endif
116    if (header[0] != 0xac1dfeed)
117      {
118         free(ret);
119         e_db_close(db);
120         return 0;
121      }
122    w = header[1];
123    h = header[2];
124    if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192))
125      {
126         free(ret);
127         e_db_close(db);
128         return 0;
129      }
130    
131    alpha = header[3];
132    compression = header[4];
133    
134    if ((compression == 0) && (size < ((w * h * 4) + 32)))
135      {
136         free(ret);
137         e_db_close(db);
138         return 0;
139      }
140    if (alpha) ie->flags.alpha = 1;
141    body = &(ret[8]);
142    evas_cache_image_surface_alloc(ie, w, h);
143    surface = evas_cache_image_pixels(ie);
144    if (!surface)
145      {
146         free(ret);
147         e_db_close(db);
148         return 0;
149      }
150    if (!compression)
151      {
152 #ifdef WORDS_BIGENDIAN
153           {
154              int x;
155
156              memcpy(surface, body, w * h * sizeof(DATA32));
157              for (x = 0; x < (w * h); x++) SWAP32(surface[x]);
158           }
159 #else
160         memcpy(surface, body, w * h * sizeof(DATA32));
161 #endif
162      }
163    else
164      {
165         uLongf dlen;
166
167         dlen = w * h * sizeof(DATA32);
168         uncompress((Bytef *)surface, &dlen, (Bytef *)body,
169                    (uLongf)(size - 32));
170 #ifdef WORDS_BIGENDIAN
171           {
172              int x;
173
174              for (x = 0; x < (w * h); x++) SWAP32(surface[x]);
175           }
176 #endif
177      }
178    evas_common_image_premul(ie);
179    free(ret);
180    e_db_close(db);
181    return 1;
182 }
183
184 EAPI int
185 module_open(Evas_Module *em)
186 {
187    if (!em) return 0;
188    em->functions = (void *)(&evas_image_load_edb_func);
189    return 1;
190 }
191
192 EAPI void
193 module_close(void)
194 {
195    
196 }
197
198 EAPI Evas_Module_Api evas_modapi =
199 {
200    EVAS_MODULE_API_VERSION,
201      EVAS_MODULE_TYPE_IMAGE_LOADER,
202      "edb",
203      "none"
204 };