static Error_Type image_load(const char *file, const char *key, const char *shmfile, Slave_Msg_Image_Load *params, Slave_Msg_Image_Loaded *result, const char *loader) { Evas_Img_Load_Params ilp; Evas_Loader_Module_Api *api; int err; Error_Type ret = CSERVE2_NONE; char *map = cserve2_shm_map(shmfile, params->shm.mmap_size, params->shm.mmap_offset); if (map == MAP_FAILED) return CSERVE2_RESOURCE_ALLOCATION_FAILED; memset(&ilp, 0, sizeof(ilp)); api = loader_module_find(loader); if (!api) { ret = CSERVE2_GENERIC; goto done; } ilp.w = params->w; ilp.h = params->h; ilp.alpha = params->alpha; #define SETOPT(v) ilp.opts.v = params->opts.v SETOPT(w); SETOPT(h); SETOPT(rx); SETOPT(ry); SETOPT(rw); SETOPT(rh); SETOPT(scale_down_by); SETOPT(dpi); SETOPT(orientation); #undef SETOPT ilp.buffer = map + params->shm.image_offset; if (!api->data_load(&ilp, file, key, &err)) ret = err; result->alpha_sparse = ilp.alpha_sparse; done: cserve2_shm_unmap(map, params->shm.mmap_size); return ret; }
static Error_Type image_open(const char *file, const char *key, Image_Load_Opts *opts, Slave_Msg_Image_Opened *result, const char **use_loader) { Evas_Img_Load_Params ilp; Evas_Loader_Module_Api *api; const char *loader = NULL, *end; unsigned int i; int len; int err; memset(&ilp, 0, sizeof(ilp)); if (opts) { #define SETOPT(v) ilp.opts.v = opts->v SETOPT(w); SETOPT(h); SETOPT(rx); SETOPT(ry); SETOPT(rw); SETOPT(rh); SETOPT(scale_down_by); SETOPT(dpi); SETOPT(orientation); #undef SETOPT ilp.has_opts = EINA_TRUE; } if (!*use_loader) goto try_extension; loader = *use_loader; api = loader_module_find(loader); if (!api) goto try_extension; if (api->head_load(&ilp, file, key, &err)) goto done; try_extension: len = strlen(file); end = file + len; for (i = 0; i < (sizeof (map_loaders) / sizeof(struct ext_loader_s)); i++) { int len2 = strlen(map_loaders[i].extension); if (len2 > len) continue; if (!strcasecmp(end - len2, map_loaders[i].extension)) { loader = map_loaders[i].loader; break; } } if (!loader) goto try_all_known; api = loader_module_find(loader); if (!api) goto try_all_known; if (api->head_load(&ilp, file, key, &err)) goto done; try_all_known: for (i = 0; i < (sizeof(loaders_name) / sizeof(loaders_name[0])); i++) { loader = loaders_name[i]; api = loader_module_find(loader); if (!api) continue; if (api->head_load(&ilp, file, key, &err)) goto done; } /* find every module available and try them, even if we don't know they * exist. That will be our generic loader */ return err; done: *use_loader = loader; result->w = ilp.w; result->h = ilp.h; if ((result->rotated = ilp.rotated)) { result->degree = ilp.degree; } if ((result->animated = ilp.animated)) { result->frame_count = ilp.frame_count; result->loop_count = ilp.loop_count; result->loop_hint = ilp.loop_hint; } result->scale = ilp.scale; result->alpha = ilp.alpha; return CSERVE2_NONE; }