/*
This file is part of darktable,
copyright (c) 2009--2010 johannes hanika.
darktable is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
darktable is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with darktable. If not, see .
*/
#ifndef DT_IMAGEIO_MODULE_H
#define DT_IMAGEIO_MODULE_H
#include
#include
#include
#include
#ifdef USE_LUA
#include "lua/types.h"
#include "lua/modules.h"
#include "lua/format.h"
#include "lua/storage.h"
#include "lua/events.h"
#include "lua/call.h"
#endif
/** Flag for the format modules */
typedef enum dt_imageio_format_flags_t
{
FORMAT_FLAGS_SUPPORT_XMP = 1,
FORMAT_FLAGS_NO_TMPFILE = 2
} dt_imageio_format_flags_t;
/**
* defines the plugin structure for image import and export.
*
* io is handled by the module_format plugins, which in turn is
* called by the module_storage plugins, which handles the type of export,
* such as flickr upload or simple on-disk storage.
*/
/*
* custom data for the module. append private stuff after width and height.
* this will be inited once when the export button is hit, so the user can make
* gui adjustments that won't affect the currently running export.
*/
typedef struct dt_imageio_module_data_t
{
int max_width, max_height;
int width, height;
char style[128];
gboolean style_append;
} dt_imageio_module_data_t;
struct dt_imageio_module_format_t;
/* responsible for image encoding, such as jpg,png,etc */
typedef struct dt_imageio_module_format_t
{
// office use only:
char plugin_name[128];
GModule *module;
// gui stuff:
GtkWidget *widget;
// data for you to initialize
void *gui_data;
// gui and management:
/** version */
int (*version)();
/* get translated module name */
const char *(*name)();
/* construct widget above */
void (*gui_init)(struct dt_imageio_module_format_t *self);
/* destroy resources */
void (*gui_cleanup)(struct dt_imageio_module_format_t *self);
/* reset options to defaults */
void (*gui_reset)(struct dt_imageio_module_format_t *self);
/* construct widget above */
void (*init)(struct dt_imageio_module_format_t *self);
/* construct widget above */
void (*cleanup)(struct dt_imageio_module_format_t *self);
/* gets the current export parameters from gui/conf and stores in this struct for later use. */
void *(*legacy_params)(struct dt_imageio_module_format_t *self, const void *const old_params,
const size_t old_params_size, const int old_version, const int new_version,
size_t *new_size);
size_t (*params_size)(struct dt_imageio_module_format_t *self);
void *(*get_params)(struct dt_imageio_module_format_t *self);
void (*free_params)(struct dt_imageio_module_format_t *self, dt_imageio_module_data_t *data);
/* resets the gui to the paramters as given here. return != 0 on fail. */
int (*set_params)(struct dt_imageio_module_format_t *self, const void *params, const int size);
/* returns the mime type of the exported image. */
const char *(*mime)(dt_imageio_module_data_t *data);
/* this extension (plus dot) is appended to the exported filename. */
const char *(*extension)(dt_imageio_module_data_t *data);
/* get storage max supported image dimension, return 0 if no dimension restrictions exists. */
int (*dimension)(struct dt_imageio_module_format_t *self, dt_imageio_module_data_t *data, uint32_t *width, uint32_t *height);
// writing functions:
/* bits per pixel and color channel we want to write: 8: char x3, 16: uint16_t x3, 32: float x3. */
int (*bpp)(dt_imageio_module_data_t *data);
/* write to file, with exif if not NULL, and icc profile if supported. */
int (*write_image)(dt_imageio_module_data_t *data, const char *filename, const void *in, void *exif,
int exif_len, int imgid, int num, int total);
/* flag that describes the available precision/levels of output format. mainly used for dithering. */
int (*levels)(dt_imageio_module_data_t *data);
// sometimes we want to tell the world about what we can do
int (*flags)(dt_imageio_module_data_t *data);
int (*read_image)(dt_imageio_module_data_t *data, uint8_t *out);
luaA_Type parameter_lua_type;
} dt_imageio_module_format_t;
/* responsible for image storage, such as flickr, harddisk, etc */
typedef struct dt_imageio_module_storage_t
{
// office use only:
char plugin_name[128];
GModule *module;
// gui stuff:
GtkWidget *widget;
// data for you to initialize
void *gui_data;
// gui and management:
/** version */
int (*version)();
/* get translated module name */
const char *(*name)(const struct dt_imageio_module_storage_t *self);
/* construct widget above */
void (*gui_init)(struct dt_imageio_module_storage_t *self);
/* destroy resources */
void (*gui_cleanup)(struct dt_imageio_module_storage_t *self);
/* reset options to defaults */
void (*gui_reset)(struct dt_imageio_module_storage_t *self);
/* allow the module to initialize itself */
void (*init)(struct dt_imageio_module_storage_t *self);
/* try and see if this format is supported? */
int (*supported)(struct dt_imageio_module_storage_t *self, struct dt_imageio_module_format_t *format);
/* get storage max supported image dimension, return 0 if no dimension restrictions exists. */
int (*dimension)(struct dt_imageio_module_storage_t *self, dt_imageio_module_data_t *data, uint32_t *width, uint32_t *height);
/* get storage recommended image dimension, return 0 if no recommendation exists. */
int (*recommended_dimension)(struct dt_imageio_module_storage_t *self, dt_imageio_module_data_t *data, uint32_t *width, uint32_t *height);
/* called once at the beginning (before exporting image), if implemented
* can change the list of exported images (including a NULL list)
*/
int (*initialize_store)(struct dt_imageio_module_storage_t *self, dt_imageio_module_data_t *data,
dt_imageio_module_format_t **format, dt_imageio_module_data_t **fdata,
GList **images, const gboolean high_quality, const gboolean upscale);
/* this actually does the work */
int (*store)(struct dt_imageio_module_storage_t *self, struct dt_imageio_module_data_t *self_data,
const int imgid, dt_imageio_module_format_t *format, dt_imageio_module_data_t *fdata,
const int num, const int total, const gboolean high_quality, const gboolean upscale);
/* called once at the end (after exporting all images), if implemented. */
void (*finalize_store)(struct dt_imageio_module_storage_t *self, dt_imageio_module_data_t *data);
void *(*legacy_params)(struct dt_imageio_module_storage_t *self, const void *const old_params,
const size_t old_params_size, const int old_version, const int new_version,
size_t *new_size);
size_t (*params_size)(struct dt_imageio_module_storage_t *self);
void *(*get_params)(struct dt_imageio_module_storage_t *self);
void (*free_params)(struct dt_imageio_module_storage_t *self, dt_imageio_module_data_t *data);
int (*set_params)(struct dt_imageio_module_storage_t *self, const void *params, const int size);
void (*export_dispatched)(struct dt_imageio_module_storage_t *self);
luaA_Type parameter_lua_type;
} dt_imageio_module_storage_t;
/* main struct */
typedef struct dt_imageio_t
{
GList *plugins_format;
GList *plugins_storage;
} dt_imageio_t;
/* load all modules */
void dt_imageio_init(dt_imageio_t *iio);
/* cleanup */
void dt_imageio_cleanup(dt_imageio_t *iio);
/* get selected imageio plugin for export */
dt_imageio_module_format_t *dt_imageio_get_format();
/* get selected imageio plugin for export */
dt_imageio_module_storage_t *dt_imageio_get_storage();
/* get by name. */
dt_imageio_module_format_t *dt_imageio_get_format_by_name(const char *name);
dt_imageio_module_storage_t *dt_imageio_get_storage_by_name(const char *name);
/* get by index */
dt_imageio_module_format_t *dt_imageio_get_format_by_index(int index);
dt_imageio_module_storage_t *dt_imageio_get_storage_by_index(int index);
int dt_imageio_get_index_of_format(dt_imageio_module_format_t *format);
int dt_imageio_get_index_of_storage(dt_imageio_module_storage_t *storage);
/* add a module into the known module list */
void dt_imageio_insert_storage(dt_imageio_module_storage_t *storage);
#endif
// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.sh
// vim: shiftwidth=2 expandtab tabstop=2 cindent
// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-space on;