/*
*
* Gimp-Print color module interface.
*
* Copyright (C) 2003 Roger Leigh (rleigh@debian.org)
*
* This program 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 2 of the License, or (at your option)
* any later version.
*
* This program 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 this program. If not, see .
*/
/*
* This file must include only standard C header files. The core code must
* compile on generic platforms that don't support glib, gimp, gtk, etc.
*/
#ifdef HAVE_CONFIG_H
#include
#endif
#include
#include "gutenprint-internal.h"
#include
#include
#include
static const char* stpi_color_namefunc(const void *item);
static const char* stpi_color_long_namefunc(const void *item);
static stp_list_t *color_list = NULL;
static int
stpi_init_color_list(void)
{
STPI_ASSERT(color_list == NULL, NULL);
color_list = stp_list_create();
stp_list_set_namefunc(color_list, stpi_color_namefunc);
stp_list_set_long_namefunc(color_list, stpi_color_long_namefunc);
/* stp_list_set_sortfunc(color_list, stpi_color_sortfunc); */
return 0;
}
static inline void
check_list(void)
{
if (color_list == NULL)
{
stp_erprintf("No color drivers found: "
"are STP_DATA_PATH and STP_MODULE_PATH correct?\n");
stpi_init_color_list();
}
}
int
stp_color_count(void)
{
if (color_list == NULL)
{
stp_erprintf("No color modules found: "
"is STP_MODULE_PATH correct?\n");
stpi_init_color_list();
}
return stp_list_get_length(color_list);
}
#define CHECK_COLOR(c) STPI_ASSERT(c != NULL, NULL)
const stp_color_t *
stp_get_color_by_index(int idx)
{
stp_list_item_t *color;
check_list();
color = stp_list_get_item_by_index(color_list, idx);
if (color == NULL)
return NULL;
return (const stp_color_t *) stp_list_item_get_data(color);
}
static const char *
stpi_color_namefunc(const void *item)
{
const stp_color_t *color = (const stp_color_t *) item;
CHECK_COLOR(color);
return color->short_name;
}
static const char *
stpi_color_long_namefunc(const void *item)
{
const stp_color_t *color = (const stp_color_t *) item;
CHECK_COLOR(color);
return color->long_name;
}
const char *
stp_color_get_name(const stp_color_t *c)
{
const stp_color_t *val = (const stp_color_t *) c;
CHECK_COLOR(val);
return val->short_name;
}
const char *
stp_color_get_long_name(const stp_color_t *c)
{
const stp_color_t *val = (const stp_color_t *) c;
CHECK_COLOR(val);
return gettext(val->long_name);
}
static const stp_colorfuncs_t *
stpi_get_colorfuncs(const stp_color_t *c)
{
const stp_color_t *val = (const stp_color_t *) c;
CHECK_COLOR(val);
return val->colorfuncs;
}
const stp_color_t *
stp_get_color_by_name(const char *name)
{
stp_list_item_t *color;
check_list();
color = stp_list_get_item_by_name(color_list, name);
if (!color)
return NULL;
return (const stp_color_t *) stp_list_item_get_data(color);
}
const stp_color_t *
stp_get_color_by_colorfuncs(stp_colorfuncs_t *colorfuncs)
{
stp_list_item_t *color_item;
stp_color_t *color;
check_list();
color_item = stp_list_get_start(color_list);
while (color_item)
{
color = (stp_color_t *) stp_list_item_get_data(color_item);
if (color->colorfuncs == colorfuncs)
return color;
color_item = stp_list_item_next(color_item);
}
return NULL;
}
int
stp_color_init(stp_vars_t *v,
stp_image_t *image,
size_t steps)
{
const stp_colorfuncs_t *colorfuncs =
stpi_get_colorfuncs(stp_get_color_by_name(stp_get_color_conversion(v)));
return colorfuncs->init(v, image, steps);
}
int
stp_color_get_row(stp_vars_t *v,
stp_image_t *image,
int row,
unsigned *zero_mask)
{
const stp_colorfuncs_t *colorfuncs =
stpi_get_colorfuncs(stp_get_color_by_name(stp_get_color_conversion(v)));
return colorfuncs->get_row(v, image, row, zero_mask);
}
stp_parameter_list_t
stp_color_list_parameters(const stp_vars_t *v)
{
const stp_colorfuncs_t *colorfuncs =
stpi_get_colorfuncs(stp_get_color_by_name(stp_get_color_conversion(v)));
return colorfuncs->list_parameters(v);
}
void
stp_color_describe_parameter(const stp_vars_t *v, const char *name,
stp_parameter_t *description)
{
const stp_colorfuncs_t *colorfuncs =
stpi_get_colorfuncs(stp_get_color_by_name(stp_get_color_conversion(v)));
colorfuncs->describe_parameter(v, name, description);
}
int
stp_color_register(const stp_color_t *color)
{
if (color_list == NULL)
{
stpi_init_color_list();
stp_deprintf(STP_DBG_COLORFUNC,
"stpi_color_register(): initialising color_list...\n");
}
CHECK_COLOR(color);
if (color)
{
/* Add new color algorithm if it does not already exist */
if (stp_get_color_by_name(color->short_name) == NULL)
{
stp_deprintf
(STP_DBG_COLORFUNC,
"stpi_color_register(): registered colour module \"%s\"\n",
color->short_name);
stp_list_item_create(color_list, NULL, color);
}
}
return 0;
}
int
stp_color_unregister(const stp_color_t *color)
{
stp_list_item_t *color_item;
stp_color_t *color_data;
if (color_list == NULL)
{
stpi_init_color_list();
stp_deprintf
(STP_DBG_COLORFUNC,
"stpi_family_unregister(): initialising color_list...\n");
}
CHECK_COLOR(color);
color_item = stp_list_get_start(color_list);
while (color_item)
{
color_data = (stp_color_t *) stp_list_item_get_data(color_item);
if (strcmp(color->short_name, color_data->short_name) == 0)
{
stp_deprintf
(STP_DBG_COLORFUNC,
"stpi_color_unregister(): unregistered colour module \"%s\"\n",
color->short_name);
stp_list_item_destroy(color_list, color_item);
break;
}
color_item = stp_list_item_next(color_item);
}
return 0;
}