Ejemplo n.º 1
0
static int dt_imageio_load_module_format(dt_imageio_module_format_t *module, const char *libname,
                                         const char *plugin_name)
{
  module->widget = NULL;
  module->parameter_lua_type = LUAA_INVALID_TYPE;
  g_strlcpy(module->plugin_name, plugin_name, sizeof(module->plugin_name));
  dt_print(DT_DEBUG_CONTROL, "[imageio_load_module] loading format module `%s' from %s\n", plugin_name, libname);
  module->module = g_module_open(libname, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
  if(!module->module) goto error;
  int (*version)();
  if(!g_module_symbol(module->module, "dt_module_dt_version", (gpointer) & (version))) goto error;
  if(version() != dt_version())
  {
    fprintf(
        stderr,
        "[imageio_load_module] `%s' is compiled for another version of dt (module %d (%s) != dt %d (%s)) !\n",
        libname, abs(version()), version() < 0 ? "debug" : "opt", abs(dt_version()),
        dt_version() < 0 ? "debug" : "opt");
    goto error;
  }
  if(!g_module_symbol(module->module, "dt_module_mod_version", (gpointer) & (module->version))) goto error;
  if(!g_module_symbol(module->module, "name", (gpointer) & (module->name))) goto error;
  if(!g_module_symbol(module->module, "init", (gpointer) & (module->init))) goto error;
  if(!g_module_symbol(module->module, "cleanup", (gpointer) & (module->cleanup))) goto error;
  if(!g_module_symbol(module->module, "gui_reset", (gpointer) & (module->gui_reset))) goto error;
  if(darktable.gui)
  {
    if(!g_module_symbol(module->module, "gui_init", (gpointer) & (module->gui_init))) goto error;
  }
  else
  {
    module->gui_init = _default_format_gui_init;
  }
  if(!g_module_symbol(module->module, "gui_cleanup", (gpointer) & (module->gui_cleanup))) goto error;

  if(!g_module_symbol(module->module, "mime", (gpointer) & (module->mime))) goto error;
  if(!g_module_symbol(module->module, "extension", (gpointer) & (module->extension))) goto error;
  if(!g_module_symbol(module->module, "dimension", (gpointer) & (module->dimension)))
    module->dimension = _default_format_dimension;
  if(!g_module_symbol(module->module, "legacy_params", (gpointer) & (module->legacy_params)))
    module->legacy_params = NULL;
  if(!g_module_symbol(module->module, "params_size", (gpointer) & (module->params_size))) goto error;
  if(!g_module_symbol(module->module, "get_params", (gpointer) & (module->get_params))) goto error;
  if(!g_module_symbol(module->module, "free_params", (gpointer) & (module->free_params))) goto error;
  if(!g_module_symbol(module->module, "set_params", (gpointer) & (module->set_params))) goto error;
  if(!g_module_symbol(module->module, "write_image", (gpointer) & (module->write_image))) goto error;
  if(!g_module_symbol(module->module, "bpp", (gpointer) & (module->bpp))) goto error;
  if(!g_module_symbol(module->module, "flags", (gpointer) & (module->flags)))
    module->flags = _default_format_flags;
  if(!g_module_symbol(module->module, "levels", (gpointer) & (module->levels)))
    module->levels = _default_format_levels;
  if(!g_module_symbol(module->module, "read_image", (gpointer) & (module->read_image)))
    module->read_image = NULL;

#ifdef USE_LUA
  {
    char pseudo_type_name[1024];
    snprintf(pseudo_type_name, sizeof(pseudo_type_name), "dt_imageio_module_format_data_%s",
             module->plugin_name);
    luaA_Type my_type
        = luaA_type_add(darktable.lua_state.state, pseudo_type_name, module->params_size(module));
    module->parameter_lua_type = dt_lua_init_type_type(darktable.lua_state.state, my_type);
    luaA_struct_type(darktable.lua_state.state, my_type);
    dt_lua_register_format_type(darktable.lua_state.state, module, my_type);
#endif
    module->init(module);
#ifdef USE_LUA
    lua_pushcfunction(darktable.lua_state.state, dt_lua_type_member_luaautoc);
    dt_lua_type_register_struct_type(darktable.lua_state.state, my_type);
  }
#endif

  return 0;
error:
  fprintf(stderr, "[imageio_load_module] failed to open format `%s': %s\n", plugin_name, g_module_error());
  if(module->module) g_module_close(module->module);
  return 1;
}
Ejemplo n.º 2
0
static int
dt_imageio_load_module_storage (dt_imageio_module_storage_t *module, const char *libname, const char *plugin_name)
{
  module->widget = NULL;
  module->parameter_lua_type = LUAA_INVALID_TYPE;
  g_strlcpy(module->plugin_name, plugin_name, sizeof(module->plugin_name));
  module->module = g_module_open(libname, G_MODULE_BIND_LAZY);
  if(!module->module) goto error;
  int (*version)();
  if(!g_module_symbol(module->module, "dt_module_dt_version", (gpointer)&(version))) goto error;
  if(version() != dt_version())
  {
    fprintf(stderr, "[imageio_load_module] `%s' is compiled for another version of dt (module %d (%s) != dt %d (%s)) !\n", libname, abs(version()), version() < 0 ? "debug" : "opt", abs(dt_version()), dt_version() < 0 ? "debug" : "opt");
    goto error;
  }
  if(!g_module_symbol(module->module, "name",                   (gpointer)&(module->name)))                   goto error;
  if(!g_module_symbol(module->module, "gui_reset",              (gpointer)&(module->gui_reset)))              goto error;
  if(darktable.gui)
  {
    if(!g_module_symbol(module->module, "gui_init",               (gpointer)&(module->gui_init)))             goto error;
  }
  else
  {
    module->gui_init = _default_storage_nop;
  }
  if(!g_module_symbol(module->module, "gui_cleanup",            (gpointer)&(module->gui_cleanup)))            goto error;
  if(!g_module_symbol(module->module, "init",                   (gpointer)&(module->init)))                   goto error;

  if(!g_module_symbol(module->module, "store",                  (gpointer)&(module->store)))                  goto error;
  if(!g_module_symbol(module->module, "params_size",             (gpointer)&(module->params_size)))           goto error;
  if(!g_module_symbol(module->module, "get_params",             (gpointer)&(module->get_params)))             goto error;
  if(!g_module_symbol(module->module, "free_params",            (gpointer)&(module->free_params)))            goto error;
  if(!g_module_symbol(module->module, "initialize_store",         (gpointer)&(module->initialize_store)))     module->initialize_store = NULL;
  if(!g_module_symbol(module->module, "finalize_store",         (gpointer)&(module->finalize_store)))         module->finalize_store = NULL;
  if(!g_module_symbol(module->module, "set_params",             (gpointer)&(module->set_params)))             goto error;

  if(!g_module_symbol(module->module, "supported",              (gpointer)&(module->supported)))              module->supported = _default_supported;
  if(!g_module_symbol(module->module, "dimension",              (gpointer)&(module->dimension)))              module->dimension = _default_storage_dimension;
  if(!g_module_symbol(module->module, "recommended_dimension",  (gpointer)&(module->recommended_dimension)))  module->recommended_dimension = _default_storage_dimension;
  if(!g_module_symbol(module->module, "export_dispatched",      (gpointer)&(module->export_dispatched)))      module->export_dispatched = _default_storage_nop;
#ifdef USE_LUA
  {
    char pseudo_type_name[1024];
    snprintf(pseudo_type_name,sizeof(pseudo_type_name),"dt_imageio_module_storage_data_%s",module->plugin_name);
    luaA_Type my_type = luaA_type_add(darktable.lua_state.state,pseudo_type_name,module->params_size(module));
    module->parameter_lua_type = dt_lua_init_type_type(darktable.lua_state.state,my_type);
    luaA_struct_type(darktable.lua_state.state,my_type);
    dt_lua_register_storage_type(darktable.lua_state.state,module,my_type);
#endif
  module->init(module);
#ifdef USE_LUA
    lua_pushcfunction(darktable.lua_state.state,dt_lua_type_member_luaautoc);
    dt_lua_type_register_struct_type(darktable.lua_state.state,my_type);
  }
#endif

  return 0;
error:
  fprintf(stderr, "[imageio_load_module] failed to open storage `%s': %s\n", plugin_name, g_module_error());
  if(module->module) g_module_close(module->module);
  return 1;
}