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_load(const char *file, const char *key, const char *shmfile, Slave_Msg_Image_Load *params, Slave_Msg_Image_Loaded *result, const char *loader) { Evas_Module *module; Eina_File *fd; Evas_Image_Load_Func *funcs = NULL; Evas_Image_Load_Opts *opts = ¶ms->opts; Evas_Image_Property property; Evas_Image_Animated animated; Error_Type ret = CSERVE2_GENERIC; void *loader_data = NULL; Eina_Bool ok; Eina_Stringshare *skey = NULL; int error; fd = eina_file_open(file, EINA_FALSE); if (!fd) { return CSERVE2_DOES_NOT_EXIST; // FIXME: maybe check errno } char *map = _cserve2_shm_map(shmfile, params->shm.mmap_size, params->shm.mmap_offset); if (map == MAP_FAILED) { eina_file_close(fd); return CSERVE2_RESOURCE_ALLOCATION_FAILED; } module = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_LOADER, loader); if (!module) { printf("LOAD failed at %s:%d: no module found for loader %s\n", __FUNCTION__, __LINE__, loader); goto done; } memset(&property, 0, sizeof (property)); property.w = params->w; property.h = params->h; skey = eina_stringshare_add(key); loader_data = _image_file_open(fd, skey, opts, module, &property, &animated, &funcs); if (!loader_data) { printf("LOAD failed at %s:%d: could not open image %s:%s\n", __FUNCTION__, __LINE__, file, skey); goto done; } ok = funcs->file_data(loader_data, &property, map, &error); if (!ok || (error != EVAS_LOAD_ERROR_NONE)) { printf("LOAD failed at %s:%d: file_data failed for loader %s: error %d\n", __FUNCTION__, __LINE__, loader, error); goto done; } result->w = property.w; result->h = property.h; if (property.alpha) { result->alpha_sparse = evas_cserve2_image_premul_data((unsigned int *) map, result->w * result->h); } //printf("LOAD successful: %dx%d alpha_sparse %d\n", // result->w, result->h, result->alpha_sparse); ret = CSERVE2_NONE; done: eina_file_close(fd); _cserve2_shm_unmap(map, params->shm.mmap_size); if (funcs) { if (loader_data) funcs->file_close(loader_data); evas_module_unload(module); } eina_stringshare_del(skey); return ret; }