1997-11-25 06:05:25 +08:00
|
|
|
/* The GIMP -- an image manipulation program
|
|
|
|
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
2000-02-04 23:12:17 +08:00
|
|
|
*
|
1999-06-06 05:20:19 +08:00
|
|
|
* Compose plug-in (C) 1997,1999 Peter Kirchgessner
|
|
|
|
* e-mail: peter@kirchgessner.net, WWW: http://www.kirchgessner.net
|
1997-11-25 06:05:25 +08:00
|
|
|
*
|
|
|
|
* 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, write to the Free Software
|
1998-04-13 13:44:11 +08:00
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
1997-11-25 06:05:25 +08:00
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This plug-in composes RGB-images from several types of channels
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Event history:
|
|
|
|
* V 1.00, PK, 29-Jul-97, Creation
|
1997-12-26 15:08:20 +08:00
|
|
|
* V 1.01, nn, 20-Dec-97, Add default case in switch for hsv_to_rgb ()
|
1999-06-06 05:20:19 +08:00
|
|
|
* V 1.02, PK, 18-Sep-98, Change variable names in Parameter definition.
|
|
|
|
* Otherwise script-fu merges parameters (reported by Patrick Valsecchi)
|
|
|
|
* Check images for same width/height (interactive mode)
|
|
|
|
* Use drawables in interactive menu
|
|
|
|
* Use g_message in interactive mode
|
|
|
|
* Check sensitivity of menues (thanks to Kevin Turner,
|
|
|
|
* kevint@poboxes.com)
|
|
|
|
* V1.03, PK, 17-Mar-99, Update for GIMP 1.1.3
|
|
|
|
* Allow image ID 0
|
|
|
|
* Prepare for localization
|
1997-11-25 06:05:25 +08:00
|
|
|
*/
|
1999-06-06 05:20:19 +08:00
|
|
|
static char ident[] = "@(#) GIMP Compose plug-in v1.03 17-Mar-99";
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <ctype.h>
|
2000-01-07 00:40:17 +08:00
|
|
|
|
|
|
|
#include <gtk/gtk.h>
|
|
|
|
|
2000-01-11 23:48:00 +08:00
|
|
|
#include <libgimp/gimp.h>
|
|
|
|
#include <libgimp/gimpui.h>
|
|
|
|
|
1999-05-30 00:35:47 +08:00
|
|
|
#include "libgimp/stdplugins-intl.h"
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Declare local functions
|
|
|
|
*/
|
|
|
|
static void query (void);
|
2001-12-29 21:26:29 +08:00
|
|
|
static void run (gchar *name,
|
|
|
|
gint nparams,
|
|
|
|
GimpParam *param,
|
|
|
|
gint *nreturn_vals,
|
|
|
|
GimpParam **return_vals);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2001-12-29 21:26:29 +08:00
|
|
|
static gint32 compose (gchar *compose_type,
|
1999-06-06 05:20:19 +08:00
|
|
|
gint32 *compose_ID,
|
2001-12-29 21:26:29 +08:00
|
|
|
gint compose_by_drawable);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
static gint32 create_new_image (gchar *filename,
|
|
|
|
guint width,
|
|
|
|
guint height,
|
2000-08-22 09:26:57 +08:00
|
|
|
GimpImageType gdtype,
|
2000-02-04 23:12:17 +08:00
|
|
|
gint32 *layer_ID,
|
2001-12-29 21:26:29 +08:00
|
|
|
GimpDrawable **drawable,
|
|
|
|
GimpPixelRgn *pixel_rgn);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
static void compose_rgb (guchar **src, gint *incr, gint numpix, guchar *dst);
|
|
|
|
static void compose_rgba (guchar **src, gint *incr, gint numpix, guchar *dst);
|
|
|
|
static void compose_hsv (guchar **src, gint *incr, gint numpix, guchar *dst);
|
|
|
|
static void compose_cmy (guchar **src, gint *incr, gint numpix, guchar *dst);
|
|
|
|
static void compose_cmyk (guchar **src, gint *incr, gint numpix, guchar *dst);
|
2002-10-24 06:20:23 +08:00
|
|
|
static void compose_ycbcr470 (guchar **src, gint *incr, gint numpix, guchar *dst);
|
|
|
|
static void compose_ycbcr709 (guchar **src, gint *incr, gint numpix, guchar *dst);
|
|
|
|
static void compose_ycbcr470f(guchar **src, gint *incr, gint numpix, guchar *dst);
|
|
|
|
static void compose_ycbcr709f(guchar **src, gint *incr, gint numpix, guchar *dst);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2001-12-29 21:26:29 +08:00
|
|
|
static gint compose_dialog (gchar *compose_type,
|
|
|
|
gint32 drawable_ID);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2001-12-29 21:26:29 +08:00
|
|
|
static gint check_gray (gint32 image_id,
|
|
|
|
gint32 drawable_id,
|
|
|
|
gpointer data);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
static void image_menu_callback (gint32 id,
|
|
|
|
gpointer data);
|
|
|
|
|
|
|
|
static void compose_ok_callback (GtkWidget *widget,
|
|
|
|
gpointer data);
|
|
|
|
static void compose_type_toggle_update (GtkWidget *widget,
|
|
|
|
gpointer data);
|
|
|
|
|
|
|
|
/* Maximum number of images to compose */
|
|
|
|
#define MAX_COMPOSE_IMAGES 4
|
|
|
|
|
|
|
|
|
|
|
|
/* Description of a composition */
|
2000-02-04 23:12:17 +08:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
gchar *compose_type; /* Type of composition ("RGB", "RGBA",...) */
|
|
|
|
gint num_images; /* Number of input images needed */
|
|
|
|
gchar *channel_name[MAX_COMPOSE_IMAGES]; /* channel names for dialog */
|
|
|
|
gchar *filename; /* Name of new image */
|
|
|
|
/* Compose functon */
|
|
|
|
void (*compose_fun) (guchar **src, gint *incr_src, gint numpix, guchar *dst);
|
1997-11-25 06:05:25 +08:00
|
|
|
} COMPOSE_DSC;
|
|
|
|
|
|
|
|
/* Array of available compositions. */
|
1999-06-06 05:20:19 +08:00
|
|
|
#define CHNL_NA "-"
|
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
static COMPOSE_DSC compose_dsc[] =
|
|
|
|
{
|
|
|
|
{ N_("RGB"), 3, { N_("Red:"),
|
|
|
|
N_("Green:"),
|
|
|
|
N_("Blue:"),
|
2002-10-24 06:20:23 +08:00
|
|
|
CHNL_NA }, "rgb-compose", compose_rgb },
|
2001-12-29 21:26:29 +08:00
|
|
|
{ N_("RGBA"), 4, { N_("Red:"),
|
|
|
|
N_("Green:"),
|
|
|
|
N_("Blue:"),
|
2002-10-24 06:20:23 +08:00
|
|
|
N_("Alpha:") }, "rgba-compose", compose_rgba },
|
2001-12-29 21:26:29 +08:00
|
|
|
{ N_("HSV"), 3, { N_("Hue:"),
|
|
|
|
N_("Saturation:"),
|
|
|
|
N_("Value:"),
|
2002-10-24 06:20:23 +08:00
|
|
|
CHNL_NA }, "hsv-compose", compose_hsv },
|
2001-12-29 21:26:29 +08:00
|
|
|
{ N_("CMY"), 3, { N_("Cyan:"),
|
|
|
|
N_("Magenta:"),
|
|
|
|
N_("Yellow:"),
|
2002-10-24 06:20:23 +08:00
|
|
|
CHNL_NA }, "cmy-compose", compose_cmy },
|
2001-12-29 21:26:29 +08:00
|
|
|
{ N_("CMYK"), 4, { N_("Cyan:"),
|
|
|
|
N_("Magenta:"),
|
|
|
|
N_("Yellow:"),
|
2002-10-24 06:20:23 +08:00
|
|
|
N_("Black:") }, "cmyk-compose", compose_cmyk },
|
|
|
|
{ "YCbCr_ITU_R470",
|
|
|
|
3, { N_("Luma_y470:"),
|
|
|
|
N_("Blueness_cb470:"),
|
|
|
|
N_("Redness_cr470:"),
|
|
|
|
CHNL_NA }, "ycbcr470-compose", compose_ycbcr470 },
|
|
|
|
{ "YCbCr_ITU_R709",
|
|
|
|
3, { N_("Luma_y709:"),
|
|
|
|
N_("Blueness_cb709:"),
|
|
|
|
N_("Redness_cr709:"),
|
|
|
|
CHNL_NA }, "ycbcr709-compose", compose_ycbcr709 },
|
|
|
|
{ "YCbCr_ITU_R470_256",
|
|
|
|
3, { N_("Luma_y470f:"),
|
|
|
|
N_("Blueness_cb470f:"),
|
|
|
|
N_("Redness_cr470f:"),
|
|
|
|
CHNL_NA }, "ycbcr470F-compose", compose_ycbcr470f },
|
|
|
|
{ "YCbCr_ITU_R709_256",
|
|
|
|
3, { N_("Luma_y709f:"),
|
|
|
|
N_("Blueness_cb709f:"),
|
|
|
|
N_("Redness_cr709f:"),
|
|
|
|
CHNL_NA }, "ycbcr709F-compose", compose_ycbcr709f },
|
1997-11-25 06:05:25 +08:00
|
|
|
};
|
|
|
|
|
2001-12-06 10:28:58 +08:00
|
|
|
#define MAX_COMPOSE_TYPES (G_N_ELEMENTS (compose_dsc))
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
typedef struct
|
|
|
|
{
|
1997-11-25 06:05:25 +08:00
|
|
|
gint32 compose_ID[MAX_COMPOSE_IMAGES]; /* Image IDs of input images */
|
2000-02-04 23:12:17 +08:00
|
|
|
gchar compose_type[32]; /* type of composition */
|
1997-11-25 06:05:25 +08:00
|
|
|
} ComposeVals;
|
|
|
|
|
|
|
|
/* Dialog structure */
|
2000-02-04 23:12:17 +08:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
gint width, height; /* Size of selected image */
|
1999-06-06 05:20:19 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
GtkWidget *channel_label[MAX_COMPOSE_IMAGES]; /* The labels to change */
|
1999-06-06 05:20:19 +08:00
|
|
|
GtkWidget *channel_menu[MAX_COMPOSE_IMAGES]; /* The menues */
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
gint32 select_ID[MAX_COMPOSE_IMAGES]; /* Image Ids selected by menu */
|
|
|
|
gint compose_flag[MAX_COMPOSE_TYPES]; /* toggle data of compose type */
|
|
|
|
gint run;
|
1997-11-25 06:05:25 +08:00
|
|
|
} ComposeInterface;
|
|
|
|
|
2000-08-22 09:26:57 +08:00
|
|
|
GimpPlugInInfo PLUG_IN_INFO =
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
NULL, /* init_proc */
|
|
|
|
NULL, /* quit_proc */
|
|
|
|
query, /* query_proc */
|
|
|
|
run, /* run_proc */
|
1997-11-25 06:05:25 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
static ComposeVals composevals =
|
|
|
|
{
|
|
|
|
{ 0 }, /* Image IDs of images to compose */
|
|
|
|
"rgb" /* Type of composition */
|
|
|
|
};
|
|
|
|
|
|
|
|
static ComposeInterface composeint =
|
|
|
|
{
|
1999-06-06 05:20:19 +08:00
|
|
|
0, 0, /* width, height */
|
1997-11-25 06:05:25 +08:00
|
|
|
{ NULL }, /* Label Widgets */
|
1999-06-06 05:20:19 +08:00
|
|
|
{ NULL }, /* Menu Widgets */
|
1997-11-25 06:05:25 +08:00
|
|
|
{ 0 }, /* Image IDs from menues */
|
|
|
|
{ 0 }, /* Compose type toggle flags */
|
|
|
|
FALSE /* run */
|
|
|
|
};
|
|
|
|
|
2001-12-19 08:13:16 +08:00
|
|
|
static GimpRunMode run_mode;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
|
|
|
|
MAIN ()
|
|
|
|
|
|
|
|
static void
|
2000-02-04 23:12:17 +08:00
|
|
|
query (void)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
static GimpParamDef args[] =
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
{ GIMP_PDB_INT32, "run_mode", "Interactive, non-interactive" },
|
|
|
|
{ GIMP_PDB_IMAGE, "image1", "First input image" },
|
|
|
|
{ GIMP_PDB_DRAWABLE, "drawable", "Input drawable (not used)" },
|
|
|
|
{ GIMP_PDB_IMAGE, "image2", "Second input image" },
|
|
|
|
{ GIMP_PDB_IMAGE, "image3", "Third input image" },
|
|
|
|
{ GIMP_PDB_IMAGE, "image4", "Fourth input image" },
|
|
|
|
{ GIMP_PDB_STRING, "compose_type", "What to compose: RGB, RGBA, HSV, CMY, CMYK" }
|
1997-11-25 06:05:25 +08:00
|
|
|
};
|
2000-08-22 09:26:57 +08:00
|
|
|
static GimpParamDef return_vals[] =
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
{ GIMP_PDB_IMAGE, "new_image", "Output image" }
|
1997-11-25 06:05:25 +08:00
|
|
|
};
|
|
|
|
|
2000-08-22 09:26:57 +08:00
|
|
|
static GimpParamDef drw_args[] =
|
1999-06-06 05:20:19 +08:00
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
{ GIMP_PDB_INT32, "run_mode", "Interactive, non-interactive" },
|
|
|
|
{ GIMP_PDB_IMAGE, "image1", "First input image (not used)" },
|
|
|
|
{ GIMP_PDB_DRAWABLE, "drawable1", "First input drawable" },
|
|
|
|
{ GIMP_PDB_DRAWABLE, "drawable2", "Second input drawable" },
|
|
|
|
{ GIMP_PDB_DRAWABLE, "drawable3", "Third input drawable" },
|
|
|
|
{ GIMP_PDB_DRAWABLE, "drawable4", "Fourth input drawable" },
|
|
|
|
{ GIMP_PDB_STRING, "compose_type", "What to compose: RGB, RGBA, HSV, CMY, CMYK" }
|
1999-06-06 05:20:19 +08:00
|
|
|
};
|
2000-08-22 09:26:57 +08:00
|
|
|
static GimpParamDef drw_return_vals[] =
|
1999-06-06 05:20:19 +08:00
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
{ GIMP_PDB_IMAGE, "new_image", "Output image" }
|
1999-06-06 05:20:19 +08:00
|
|
|
};
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
gimp_install_procedure ("plug_in_compose",
|
2000-01-31 10:32:30 +08:00
|
|
|
"Compose an image from multiple gray images",
|
|
|
|
"This function creates a new image from "
|
|
|
|
"multiple gray images",
|
1997-11-25 06:05:25 +08:00
|
|
|
"Peter Kirchgessner",
|
1999-06-06 05:20:19 +08:00
|
|
|
"Peter Kirchgessner (peter@kirchgessner.net)",
|
1997-11-25 06:05:25 +08:00
|
|
|
"1997",
|
2003-03-05 07:21:09 +08:00
|
|
|
N_("<Image>/Filters/Colors/Compose..."),
|
1999-06-06 05:20:19 +08:00
|
|
|
"GRAY*",
|
2000-08-22 09:26:57 +08:00
|
|
|
GIMP_PLUGIN,
|
2001-12-06 10:28:58 +08:00
|
|
|
G_N_ELEMENTS (args),
|
|
|
|
G_N_ELEMENTS (return_vals),
|
1997-11-25 06:05:25 +08:00
|
|
|
args, return_vals);
|
1999-06-06 05:20:19 +08:00
|
|
|
|
|
|
|
gimp_install_procedure ("plug_in_drawable_compose",
|
2000-01-31 10:32:30 +08:00
|
|
|
"Compose an image from multiple drawables of gray images",
|
|
|
|
"This function creates a new image from "
|
|
|
|
"multiple drawables of gray images",
|
1999-06-06 05:20:19 +08:00
|
|
|
"Peter Kirchgessner",
|
|
|
|
"Peter Kirchgessner (peter@kirchgessner.net)",
|
|
|
|
"1998",
|
|
|
|
NULL, /* It is not available in interactive mode */
|
|
|
|
"GRAY*",
|
2000-08-22 09:26:57 +08:00
|
|
|
GIMP_PLUGIN,
|
2001-12-06 10:28:58 +08:00
|
|
|
G_N_ELEMENTS (drw_args),
|
|
|
|
G_N_ELEMENTS (drw_return_vals),
|
1999-06-06 05:20:19 +08:00
|
|
|
drw_args, drw_return_vals);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
1999-06-06 05:20:19 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
static void
|
2001-12-29 21:26:29 +08:00
|
|
|
run (gchar *name,
|
|
|
|
gint nparams,
|
2000-08-22 09:26:57 +08:00
|
|
|
GimpParam *param,
|
2001-12-29 21:26:29 +08:00
|
|
|
gint *nreturn_vals,
|
2000-08-22 09:26:57 +08:00
|
|
|
GimpParam **return_vals)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
2001-12-29 21:26:29 +08:00
|
|
|
static GimpParam values[2];
|
2000-08-22 09:26:57 +08:00
|
|
|
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
|
2001-12-29 21:26:29 +08:00
|
|
|
gint32 image_ID, drawable_ID;
|
|
|
|
gint compose_by_drawable;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-08-29 03:23:22 +08:00
|
|
|
INIT_I18N_UI ();
|
1999-05-30 00:35:47 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
run_mode = param[0].data.d_int32;
|
1999-06-06 05:20:19 +08:00
|
|
|
compose_by_drawable = (strcmp (name, "plug_in_drawable_compose") == 0);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
*nreturn_vals = 2;
|
2001-12-29 21:26:29 +08:00
|
|
|
*return_vals = values;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2001-12-29 21:26:29 +08:00
|
|
|
values[0].type = GIMP_PDB_STATUS;
|
1997-11-25 06:05:25 +08:00
|
|
|
values[0].data.d_status = status;
|
2001-12-29 21:26:29 +08:00
|
|
|
values[1].type = GIMP_PDB_IMAGE;
|
|
|
|
values[1].data.d_int32 = -1;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
switch (run_mode)
|
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
case GIMP_RUN_INTERACTIVE:
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Possibly retrieve data */
|
1999-06-06 05:20:19 +08:00
|
|
|
gimp_get_data (name , &composevals);
|
|
|
|
|
|
|
|
/* The dialog is now drawable based. Get a drawable-ID of the image */
|
|
|
|
if (strcmp (name, "plug_in_compose") == 0)
|
|
|
|
{
|
2001-12-29 21:26:29 +08:00
|
|
|
gint32 *layer_list;
|
|
|
|
gint nlayers;
|
|
|
|
|
|
|
|
layer_list = gimp_image_get_layers (param[1].data.d_int32, &nlayers);
|
|
|
|
if ((layer_list == NULL) || (nlayers <= 0))
|
|
|
|
{
|
2002-10-24 06:20:23 +08:00
|
|
|
g_message (_("Compose: Could not get layers for image %d"),
|
2001-12-29 21:26:29 +08:00
|
|
|
(gint) param[1].data.d_int32);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
drawable_ID = layer_list[0];
|
|
|
|
g_free (layer_list);
|
1999-06-06 05:20:19 +08:00
|
|
|
}
|
|
|
|
else
|
2001-12-29 21:26:29 +08:00
|
|
|
{
|
|
|
|
drawable_ID = param[2].data.d_int32;
|
|
|
|
}
|
1999-06-06 05:20:19 +08:00
|
|
|
|
|
|
|
compose_by_drawable = 1;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* First acquire information with a dialog */
|
1999-06-06 05:20:19 +08:00
|
|
|
if (! compose_dialog (composevals.compose_type, drawable_ID))
|
1997-11-25 06:05:25 +08:00
|
|
|
return;
|
1999-06-06 05:20:19 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
2000-08-22 09:26:57 +08:00
|
|
|
case GIMP_RUN_NONINTERACTIVE:
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Make sure all the arguments are there! */
|
|
|
|
if (nparams != 7)
|
2000-02-04 23:12:17 +08:00
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
status = GIMP_PDB_CALLING_ERROR;
|
2000-02-04 23:12:17 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
composevals.compose_ID[0] =
|
|
|
|
compose_by_drawable ? param[2].data.d_int32 : param[1].data.d_int32;
|
|
|
|
composevals.compose_ID[1] = param[3].data.d_int32;
|
|
|
|
composevals.compose_ID[2] = param[4].data.d_int32;
|
|
|
|
composevals.compose_ID[3] = param[5].data.d_int32;
|
|
|
|
strncpy (composevals.compose_type, param[6].data.d_string,
|
|
|
|
sizeof (composevals.compose_type));
|
|
|
|
composevals.compose_type[sizeof (composevals.compose_type)-1] = '\0';
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
2000-08-22 09:26:57 +08:00
|
|
|
case GIMP_RUN_WITH_LAST_VALS:
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Possibly retrieve data */
|
1999-06-06 05:20:19 +08:00
|
|
|
gimp_get_data (name, &composevals);
|
1997-11-25 06:05:25 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2000-08-22 09:26:57 +08:00
|
|
|
if (status == GIMP_PDB_SUCCESS)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
if (run_mode != GIMP_RUN_NONINTERACTIVE)
|
1999-05-30 00:35:47 +08:00
|
|
|
gimp_progress_init (_("Composing..."));
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
image_ID = compose (composevals.compose_type,
|
|
|
|
composevals.compose_ID,
|
1999-06-06 05:20:19 +08:00
|
|
|
compose_by_drawable);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
1999-06-06 05:20:19 +08:00
|
|
|
if (image_ID < 0)
|
2000-02-04 23:12:17 +08:00
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
status = GIMP_PDB_EXECUTION_ERROR;
|
2000-02-04 23:12:17 +08:00
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
else
|
2000-02-04 23:12:17 +08:00
|
|
|
{
|
|
|
|
values[1].data.d_int32 = image_ID;
|
|
|
|
gimp_image_undo_enable (image_ID);
|
|
|
|
gimp_image_clean_all (image_ID);
|
2000-08-22 09:26:57 +08:00
|
|
|
if (run_mode != GIMP_RUN_NONINTERACTIVE)
|
2000-02-04 23:12:17 +08:00
|
|
|
gimp_display_new (image_ID);
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Store data */
|
2000-08-22 09:26:57 +08:00
|
|
|
if (run_mode == GIMP_RUN_INTERACTIVE)
|
1999-06-06 05:20:19 +08:00
|
|
|
gimp_set_data (name, &composevals, sizeof (ComposeVals));
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
values[0].data.d_status = status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Compose an image from several gray-images */
|
|
|
|
static gint32
|
2000-02-04 23:12:17 +08:00
|
|
|
compose (gchar *compose_type,
|
1999-06-06 05:20:19 +08:00
|
|
|
gint32 *compose_ID,
|
2000-02-04 23:12:17 +08:00
|
|
|
gint compose_by_drawable)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
gint width, height, tile_height, scan_lines;
|
|
|
|
gint num_images, compose_idx, incr_src[MAX_COMPOSE_IMAGES];
|
|
|
|
gint i, j;
|
1999-10-16 11:51:45 +08:00
|
|
|
gint num_layers;
|
|
|
|
gint32 layer_ID_dst, image_ID_dst;
|
2000-01-07 00:40:17 +08:00
|
|
|
guchar *src[MAX_COMPOSE_IMAGES], *dst = (guchar *)ident;
|
2000-08-22 09:26:57 +08:00
|
|
|
GimpImageType gdtype_dst;
|
|
|
|
GimpDrawable *drawable_src[MAX_COMPOSE_IMAGES], *drawable_dst;
|
|
|
|
GimpPixelRgn pixel_rgn_src[MAX_COMPOSE_IMAGES], pixel_rgn_dst;
|
1999-10-16 11:51:45 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Search type of composing */
|
|
|
|
compose_idx = -1;
|
|
|
|
for (j = 0; j < MAX_COMPOSE_TYPES; j++)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
2001-08-30 01:48:28 +08:00
|
|
|
if (g_ascii_strcasecmp (compose_type, compose_dsc[j].compose_type) == 0)
|
1999-10-16 11:51:45 +08:00
|
|
|
compose_idx = j;
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
if (compose_idx < 0)
|
|
|
|
return (-1);
|
1999-10-16 11:51:45 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
num_images = compose_dsc[compose_idx].num_images;
|
|
|
|
tile_height = gimp_tile_height ();
|
1999-10-16 11:51:45 +08:00
|
|
|
|
1999-06-06 05:20:19 +08:00
|
|
|
/* Check image sizes */
|
|
|
|
if (compose_by_drawable)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1999-10-16 11:51:45 +08:00
|
|
|
width = gimp_drawable_width (compose_ID[0]);
|
|
|
|
height = gimp_drawable_height (compose_ID[0]);
|
|
|
|
|
|
|
|
for (j = 1; j < num_images; j++)
|
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
if ((width != (gint)gimp_drawable_width (compose_ID[j])) ||
|
|
|
|
(height != (gint)gimp_drawable_height (compose_ID[j])))
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
g_message (_("Compose: Drawables have different size"));
|
1999-10-16 11:51:45 +08:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (j = 0; j < num_images; j++)
|
|
|
|
drawable_src[j] = gimp_drawable_get (compose_ID[j]);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
1999-06-06 05:20:19 +08:00
|
|
|
else /* Compose by image ID */
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1999-10-16 11:51:45 +08:00
|
|
|
width = gimp_image_width (compose_ID[0]);
|
|
|
|
height = gimp_image_height (compose_ID[0]);
|
|
|
|
|
|
|
|
for (j = 1; j < num_images; j++)
|
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
if ((width != (gint)gimp_image_width (compose_ID[j])) ||
|
|
|
|
(height != (gint)gimp_image_height (compose_ID[j])))
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
g_message (_("Compose: Images have different size"));
|
1999-10-16 11:51:45 +08:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get first layer/drawable for all input images */
|
|
|
|
for (j = 0; j < num_images; j++)
|
2000-02-04 23:12:17 +08:00
|
|
|
{
|
|
|
|
gint32 *g32;
|
1999-10-16 11:51:45 +08:00
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
/* Get first layer of image */
|
|
|
|
g32 = gimp_image_get_layers (compose_ID[j], &num_layers);
|
|
|
|
if ((g32 == NULL) || (num_layers <= 0))
|
|
|
|
{
|
|
|
|
g_message (_("Compose: Error in getting layer IDs"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get drawable for layer */
|
|
|
|
drawable_src[j] = gimp_drawable_get (g32[0]);
|
|
|
|
g_free (g32);
|
1999-10-16 11:51:45 +08:00
|
|
|
}
|
1999-06-06 05:20:19 +08:00
|
|
|
}
|
1999-10-16 11:51:45 +08:00
|
|
|
|
1999-06-06 05:20:19 +08:00
|
|
|
/* Get pixel region for all input drawables */
|
|
|
|
for (j = 0; j < num_images; j++)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
1999-10-16 11:51:45 +08:00
|
|
|
/* Check bytes per pixel */
|
|
|
|
incr_src[j] = drawable_src[j]->bpp;
|
|
|
|
if ((incr_src[j] != 1) && (incr_src[j] != 2))
|
1999-12-31 02:54:17 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
g_message (_("Compose: Image is not a gray image (bpp=%d)"),
|
|
|
|
incr_src[j]);
|
|
|
|
return -1;
|
1999-10-16 11:51:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Get pixel region */
|
|
|
|
gimp_pixel_rgn_init (&(pixel_rgn_src[j]), drawable_src[j], 0, 0,
|
|
|
|
width, height, FALSE, FALSE);
|
|
|
|
|
|
|
|
/* Get memory for retrieving information */
|
2000-02-04 23:12:17 +08:00
|
|
|
src[j] = g_new (guchar, tile_height * width * drawable_src[j]->bpp);
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
1999-10-16 11:51:45 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Create new image */
|
|
|
|
gdtype_dst = (compose_dsc[compose_idx].compose_fun == compose_rgba)
|
2000-08-22 09:26:57 +08:00
|
|
|
? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE;
|
1997-11-25 06:05:25 +08:00
|
|
|
image_ID_dst = create_new_image (compose_dsc[compose_idx].filename,
|
1999-10-16 11:51:45 +08:00
|
|
|
width, height, gdtype_dst,
|
|
|
|
&layer_ID_dst, &drawable_dst, &pixel_rgn_dst);
|
2000-02-04 23:12:17 +08:00
|
|
|
dst = g_new (guchar, tile_height * width * drawable_dst->bpp);
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
/* Do the composition */
|
|
|
|
i = 0;
|
|
|
|
while (i < height)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
|
|
|
scan_lines = (i+tile_height-1 < height) ? tile_height : (height-i);
|
2000-02-04 23:12:17 +08:00
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
/* Get source pixel regions */
|
|
|
|
for (j = 0; j < num_images; j++)
|
|
|
|
gimp_pixel_rgn_get_rect (&(pixel_rgn_src[j]), src[j], 0, i,
|
|
|
|
width, scan_lines);
|
2000-02-04 23:12:17 +08:00
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
/* Do the composition */
|
|
|
|
compose_dsc[compose_idx].compose_fun (src,incr_src,width*tile_height,dst);
|
2000-02-04 23:12:17 +08:00
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
/* Set destination pixel region */
|
|
|
|
gimp_pixel_rgn_set_rect (&pixel_rgn_dst, dst, 0, i, width, scan_lines);
|
2000-02-04 23:12:17 +08:00
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
i += scan_lines;
|
2000-02-04 23:12:17 +08:00
|
|
|
|
2000-08-22 09:26:57 +08:00
|
|
|
if (run_mode != GIMP_RUN_NONINTERACTIVE)
|
2000-02-04 23:12:17 +08:00
|
|
|
gimp_progress_update (((gdouble)i) / (gdouble)height);
|
1999-10-16 11:51:45 +08:00
|
|
|
}
|
2000-02-04 23:12:17 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
for (j = 0; j < num_images; j++)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
|
|
|
g_free (src[j]);
|
|
|
|
gimp_drawable_flush (drawable_src[j]);
|
|
|
|
gimp_drawable_detach (drawable_src[j]);
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
g_free (dst);
|
|
|
|
gimp_drawable_flush (drawable_dst);
|
|
|
|
gimp_drawable_detach (drawable_dst);
|
1999-10-16 11:51:45 +08:00
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
return image_ID_dst;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Create an image. Sets layer_ID, drawable and rgn. Returns image_ID */
|
|
|
|
static gint32
|
2000-02-04 23:12:17 +08:00
|
|
|
create_new_image (gchar *filename,
|
1999-10-16 11:51:45 +08:00
|
|
|
guint width,
|
|
|
|
guint height,
|
2000-08-22 09:26:57 +08:00
|
|
|
GimpImageType gdtype,
|
1999-10-16 11:51:45 +08:00
|
|
|
gint32 *layer_ID,
|
2000-08-22 09:26:57 +08:00
|
|
|
GimpDrawable **drawable,
|
|
|
|
GimpPixelRgn *pixel_rgn)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
|
|
|
gint32 image_ID;
|
2000-08-22 09:26:57 +08:00
|
|
|
GimpImageBaseType gitype;
|
2000-02-04 23:12:17 +08:00
|
|
|
|
2000-08-22 09:26:57 +08:00
|
|
|
if ((gdtype == GIMP_GRAY_IMAGE) || (gdtype == GIMP_GRAYA_IMAGE))
|
|
|
|
gitype = GIMP_GRAY;
|
|
|
|
else if ((gdtype == GIMP_INDEXED_IMAGE) || (gdtype == GIMP_INDEXEDA_IMAGE))
|
|
|
|
gitype = GIMP_INDEXED;
|
1999-10-16 11:51:45 +08:00
|
|
|
else
|
2000-08-22 09:26:57 +08:00
|
|
|
gitype = GIMP_RGB;
|
2000-02-04 23:12:17 +08:00
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
image_ID = gimp_image_new (width, height, gitype);
|
|
|
|
gimp_image_set_filename (image_ID, filename);
|
2000-02-04 23:12:17 +08:00
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
*layer_ID = gimp_layer_new (image_ID, _("Background"), width, height,
|
2000-08-22 09:26:57 +08:00
|
|
|
gdtype, 100, GIMP_NORMAL_MODE);
|
1999-10-16 11:51:45 +08:00
|
|
|
gimp_image_add_layer (image_ID, *layer_ID, 0);
|
2000-02-04 23:12:17 +08:00
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
*drawable = gimp_drawable_get (*layer_ID);
|
|
|
|
gimp_pixel_rgn_init (pixel_rgn, *drawable, 0, 0, (*drawable)->width,
|
|
|
|
(*drawable)->height, TRUE, FALSE);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
return image_ID;
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2000-02-04 23:12:17 +08:00
|
|
|
compose_rgb (guchar **src,
|
|
|
|
gint *incr_src,
|
|
|
|
gint numpix,
|
|
|
|
guchar *dst)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
register guchar *red_src = src[0];
|
|
|
|
register guchar *green_src = src[1];
|
|
|
|
register guchar *blue_src = src[2];
|
|
|
|
register guchar *rgb_dst = dst;
|
|
|
|
register gint count = numpix;
|
|
|
|
gint red_incr = incr_src[0], green_incr = incr_src[1], blue_incr = incr_src[2];
|
1999-10-16 11:51:45 +08:00
|
|
|
|
|
|
|
if ((red_incr == 1) && (green_incr == 1) && (blue_incr == 1))
|
|
|
|
{
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
*(rgb_dst++) = *(red_src++);
|
|
|
|
*(rgb_dst++) = *(green_src++);
|
|
|
|
*(rgb_dst++) = *(blue_src++);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
*(rgb_dst++) = *red_src; red_src += red_incr;
|
|
|
|
*(rgb_dst++) = *green_src; green_src += green_incr;
|
|
|
|
*(rgb_dst++) = *blue_src; blue_src += blue_incr;
|
|
|
|
}
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
2000-02-04 23:12:17 +08:00
|
|
|
compose_rgba (guchar **src,
|
|
|
|
gint *incr_src,
|
|
|
|
gint numpix,
|
|
|
|
guchar *dst)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
register guchar *red_src = src[0];
|
|
|
|
register guchar *green_src = src[1];
|
|
|
|
register guchar *blue_src = src[2];
|
|
|
|
register guchar *alpha_src = src[3];
|
|
|
|
register guchar *rgb_dst = dst;
|
|
|
|
register gint count = numpix;
|
|
|
|
gint red_incr = incr_src[0], green_incr = incr_src[1],
|
1999-10-16 11:51:45 +08:00
|
|
|
blue_incr = incr_src[2], alpha_incr = incr_src[3];
|
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
if ((red_incr == 1) && (green_incr == 1) && (blue_incr == 1) &&
|
|
|
|
(alpha_incr == 1))
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
*(rgb_dst++) = *(red_src++);
|
|
|
|
*(rgb_dst++) = *(green_src++);
|
|
|
|
*(rgb_dst++) = *(blue_src++);
|
|
|
|
*(rgb_dst++) = *(alpha_src++);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
*(rgb_dst++) = *red_src; red_src += red_incr;
|
|
|
|
*(rgb_dst++) = *green_src; green_src += green_incr;
|
|
|
|
*(rgb_dst++) = *blue_src; blue_src += blue_incr;
|
|
|
|
*(rgb_dst++) = *alpha_src; alpha_src += alpha_incr;
|
|
|
|
}
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
2000-02-04 23:12:17 +08:00
|
|
|
compose_hsv (guchar **src,
|
|
|
|
gint *incr_src,
|
|
|
|
gint numpix,
|
|
|
|
guchar *dst)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
register guchar *hue_src = src[0];
|
|
|
|
register guchar *sat_src = src[1];
|
|
|
|
register guchar *val_src = src[2];
|
|
|
|
register guchar *rgb_dst = dst;
|
|
|
|
register gint count = numpix;
|
|
|
|
gint hue_incr = incr_src[0], sat_incr = incr_src[1], val_incr = incr_src[2];
|
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
while (count-- > 0)
|
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
gimp_hsv_to_rgb4 (rgb_dst, (gdouble) *hue_src / 255.0,
|
|
|
|
(gdouble) *sat_src / 255.0,
|
|
|
|
(gdouble) *val_src / 255.0);
|
1999-10-16 11:51:45 +08:00
|
|
|
rgb_dst += 3;
|
|
|
|
hue_src += hue_incr;
|
|
|
|
sat_src += sat_incr;
|
|
|
|
val_src += val_incr;
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
2000-02-04 23:12:17 +08:00
|
|
|
compose_cmy (guchar **src,
|
|
|
|
gint *incr_src,
|
|
|
|
gint numpix,
|
|
|
|
guchar *dst)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
register guchar *cyan_src = src[0];
|
|
|
|
register guchar *magenta_src = src[1];
|
|
|
|
register guchar *yellow_src = src[2];
|
|
|
|
register guchar *rgb_dst = dst;
|
|
|
|
register gint count = numpix;
|
|
|
|
gint cyan_incr = incr_src[0];
|
|
|
|
gint magenta_incr = incr_src[1];
|
|
|
|
gint yellow_incr = incr_src[2];
|
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
if ((cyan_incr == 1) && (magenta_incr == 1) && (yellow_incr == 1))
|
|
|
|
{
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
*(rgb_dst++) = 255 - *(cyan_src++);
|
|
|
|
*(rgb_dst++) = 255 - *(magenta_src++);
|
|
|
|
*(rgb_dst++) = 255 - *(yellow_src++);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
*(rgb_dst++) = 255 - *cyan_src;
|
|
|
|
*(rgb_dst++) = 255 - *magenta_src;
|
|
|
|
*(rgb_dst++) = 255 - *yellow_src;
|
|
|
|
cyan_src += cyan_incr;
|
|
|
|
magenta_src += magenta_incr;
|
|
|
|
yellow_src += yellow_incr;
|
|
|
|
}
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
2000-02-04 23:12:17 +08:00
|
|
|
compose_cmyk (guchar **src,
|
|
|
|
gint *incr_src,
|
|
|
|
gint numpix,
|
|
|
|
guchar *dst)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
register guchar *cyan_src = src[0];
|
|
|
|
register guchar *magenta_src = src[1];
|
|
|
|
register guchar *yellow_src = src[2];
|
|
|
|
register guchar *black_src = src[3];
|
|
|
|
register guchar *rgb_dst = dst;
|
|
|
|
register gint count = numpix;
|
|
|
|
gint cyan, magenta, yellow, black;
|
|
|
|
gint cyan_incr = incr_src[0];
|
|
|
|
gint magenta_incr = incr_src[1];
|
|
|
|
gint yellow_incr = incr_src[2];
|
|
|
|
gint black_incr = incr_src[3];
|
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
while (count-- > 0)
|
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
black = (gint)*black_src;
|
1999-10-16 11:51:45 +08:00
|
|
|
if (black)
|
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
cyan = (gint) *cyan_src;
|
|
|
|
magenta = (gint) *magenta_src;
|
|
|
|
yellow = (gint) *yellow_src;
|
|
|
|
|
|
|
|
cyan += black; if (cyan > 255) cyan = 255;
|
1999-10-16 11:51:45 +08:00
|
|
|
magenta += black; if (magenta > 255) magenta = 255;
|
2000-02-04 23:12:17 +08:00
|
|
|
yellow += black; if (yellow > 255) yellow = 255;
|
|
|
|
|
1999-10-16 11:51:45 +08:00
|
|
|
*(rgb_dst++) = 255 - cyan;
|
|
|
|
*(rgb_dst++) = 255 - magenta;
|
|
|
|
*(rgb_dst++) = 255 - yellow;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*(rgb_dst++) = 255 - *cyan_src;
|
|
|
|
*(rgb_dst++) = 255 - *magenta_src;
|
|
|
|
*(rgb_dst++) = 255 - *yellow_src;
|
|
|
|
}
|
|
|
|
cyan_src += cyan_incr;
|
|
|
|
magenta_src += magenta_incr;
|
|
|
|
yellow_src += yellow_incr;
|
|
|
|
black_src += black_incr;
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
2002-10-24 06:20:23 +08:00
|
|
|
/* these are here so the code is more readable and we can use
|
|
|
|
the standart values instead of some scaled and rounded fixpoint values */
|
|
|
|
#define FIX(a) ((int)((a)*256.0*256.0 + 0.5))
|
|
|
|
#define FIXY(a) ((int)((a)*256.0*256.0*255.0/219.0 + 0.5))
|
|
|
|
#define FIXC(a) ((int)((a)*256.0*256.0*255.0/224.0 + 0.5))
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
compose_ycbcr470 (guchar **src,
|
|
|
|
gint *incr_src,
|
|
|
|
gint numpix,
|
|
|
|
guchar *dst)
|
|
|
|
{
|
|
|
|
register guchar *y_src = src[0];
|
|
|
|
register guchar *cb_src = src[1];
|
|
|
|
register guchar *cr_src = src[2];
|
|
|
|
register guchar *rgb_dst = dst;
|
|
|
|
register gint count = numpix;
|
|
|
|
gint y_incr = incr_src[0], cb_incr = incr_src[1], cr_incr = incr_src[2];
|
|
|
|
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
int r,g,b,y,cb,cr;
|
|
|
|
y = *y_src - 16;
|
|
|
|
cb= *cb_src - 128;
|
|
|
|
cr= *cr_src - 128;
|
|
|
|
y_src += y_incr;
|
|
|
|
cb_src += cb_incr;
|
|
|
|
cr_src += cr_incr;
|
|
|
|
|
|
|
|
r = (FIXY(1.0)*y + FIXC(1.4022)*cr + FIX(0.5))>>16;
|
|
|
|
g = (FIXY(1.0)*y - FIXC(0.3456)*cb - FIXC(0.7145)*cr + FIX(0.5))>>16;
|
|
|
|
b = (FIXY(1.0)*y + FIXC(1.7710)*cb + FIX(0.5))>>16;
|
|
|
|
|
|
|
|
if(((unsigned)r) > 255) r = ((r>>10)&255)^255;
|
|
|
|
if(((unsigned)g) > 255) g = ((g>>10)&255)^255;
|
|
|
|
if(((unsigned)b) > 255) b = ((b>>10)&255)^255;
|
|
|
|
|
|
|
|
*(rgb_dst++) = r;
|
|
|
|
*(rgb_dst++) = g;
|
|
|
|
*(rgb_dst++) = b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
compose_ycbcr709 (guchar **src,
|
|
|
|
gint *incr_src,
|
|
|
|
gint numpix,
|
|
|
|
guchar *dst)
|
|
|
|
{
|
|
|
|
register guchar *y_src = src[0];
|
|
|
|
register guchar *cb_src = src[1];
|
|
|
|
register guchar *cr_src = src[2];
|
|
|
|
register guchar *rgb_dst = dst;
|
|
|
|
register gint count = numpix;
|
|
|
|
gint y_incr = incr_src[0], cb_incr = incr_src[1], cr_incr = incr_src[2];
|
|
|
|
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
int r,g,b,y,cb,cr;
|
|
|
|
y = *y_src - 16;
|
|
|
|
cb= *cb_src - 128;
|
|
|
|
cr= *cr_src - 128;
|
|
|
|
y_src += y_incr;
|
|
|
|
cb_src += cb_incr;
|
|
|
|
cr_src += cr_incr;
|
|
|
|
|
|
|
|
r = (FIXY(1.0)*y + FIXC(1.5748)*cr + FIX(0.5))>>16;
|
|
|
|
g = (FIXY(1.0)*y - FIXC(0.1873)*cb - FIXC(0.4681)*cr + FIX(0.5))>>16;
|
|
|
|
b = (FIXY(1.0)*y + FIXC(1.8556)*cb + FIX(0.5))>>16;
|
|
|
|
|
|
|
|
if(((unsigned)r) > 255) r = ((r>>10)&255)^255;
|
|
|
|
if(((unsigned)g) > 255) g = ((g>>10)&255)^255;
|
|
|
|
if(((unsigned)b) > 255) b = ((b>>10)&255)^255;
|
|
|
|
|
|
|
|
*(rgb_dst++) = r;
|
|
|
|
*(rgb_dst++) = g;
|
|
|
|
*(rgb_dst++) = b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
compose_ycbcr470f (guchar **src,
|
|
|
|
gint *incr_src,
|
|
|
|
gint numpix,
|
|
|
|
guchar *dst)
|
|
|
|
{
|
|
|
|
register guchar *y_src = src[0];
|
|
|
|
register guchar *cb_src = src[1];
|
|
|
|
register guchar *cr_src = src[2];
|
|
|
|
register guchar *rgb_dst = dst;
|
|
|
|
register gint count = numpix;
|
|
|
|
gint y_incr = incr_src[0], cb_incr = incr_src[1], cr_incr = incr_src[2];
|
|
|
|
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
int r,g,b,y,cb,cr;
|
|
|
|
y = *y_src;
|
|
|
|
cb= *cb_src - 128;
|
|
|
|
cr= *cr_src - 128;
|
|
|
|
y_src += y_incr;
|
|
|
|
cb_src += cb_incr;
|
|
|
|
cr_src += cr_incr;
|
|
|
|
|
|
|
|
r = (FIX(1.0)*y + FIX(1.4022)*cr + FIX(0.5))>>16;
|
|
|
|
g = (FIX(1.0)*y - FIX(0.3456)*cb - FIX(0.7145)*cr + FIX(0.5))>>16;
|
|
|
|
b = (FIX(1.0)*y + FIX(1.7710)*cb + FIX(0.5))>>16;
|
|
|
|
|
|
|
|
if(((unsigned)r) > 255) r = ((r>>10)&255)^255;
|
|
|
|
if(((unsigned)g) > 255) g = ((g>>10)&255)^255;
|
|
|
|
if(((unsigned)b) > 255) b = ((b>>10)&255)^255;
|
|
|
|
|
|
|
|
*(rgb_dst++) = r;
|
|
|
|
*(rgb_dst++) = g;
|
|
|
|
*(rgb_dst++) = b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
compose_ycbcr709f (guchar **src,
|
|
|
|
gint *incr_src,
|
|
|
|
gint numpix,
|
|
|
|
guchar *dst)
|
|
|
|
{
|
|
|
|
register guchar *y_src = src[0];
|
|
|
|
register guchar *cb_src = src[1];
|
|
|
|
register guchar *cr_src = src[2];
|
|
|
|
register guchar *rgb_dst = dst;
|
|
|
|
register gint count = numpix;
|
|
|
|
gint y_incr = incr_src[0], cb_incr = incr_src[1], cr_incr = incr_src[2];
|
|
|
|
|
|
|
|
while (count-- > 0)
|
|
|
|
{
|
|
|
|
int r,g,b,y,cb,cr;
|
|
|
|
y = *y_src;
|
|
|
|
cb= *cb_src - 128;
|
|
|
|
cr= *cr_src - 128;
|
|
|
|
y_src += y_incr;
|
|
|
|
cb_src += cb_incr;
|
|
|
|
cr_src += cr_incr;
|
|
|
|
|
|
|
|
r = (FIX(1.0)*y + FIX(1.5748)*cr + FIX(0.5))>>16;
|
|
|
|
g = (FIX(1.0)*y - FIX(0.1873)*cb - FIX(0.4681)*cr + FIX(0.5))>>16;
|
|
|
|
b = (FIX(1.0)*y + FIX(1.8556)*cb + FIX(0.5))>>16;
|
|
|
|
|
|
|
|
if(((unsigned)r) > 255) r = ((r>>10)&255)^255;
|
|
|
|
if(((unsigned)g) > 255) g = ((g>>10)&255)^255;
|
|
|
|
if(((unsigned)b) > 255) b = ((b>>10)&255)^255;
|
|
|
|
|
|
|
|
*(rgb_dst++) = r;
|
|
|
|
*(rgb_dst++) = g;
|
|
|
|
*(rgb_dst++) = b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
static gint
|
2000-02-04 23:12:17 +08:00
|
|
|
compose_dialog (gchar *compose_type,
|
1999-10-16 11:51:45 +08:00
|
|
|
gint32 drawable_ID)
|
1997-11-25 06:05:25 +08:00
|
|
|
{
|
|
|
|
GtkWidget *dlg;
|
|
|
|
GtkWidget *toggle;
|
|
|
|
GtkWidget *left_frame, *right_frame;
|
|
|
|
GtkWidget *left_vbox, *right_vbox;
|
|
|
|
GtkWidget *hbox;
|
|
|
|
GtkWidget *label;
|
|
|
|
GtkWidget *table;
|
|
|
|
GtkWidget *image_option_menu, *image_menu;
|
2000-05-01 05:03:44 +08:00
|
|
|
GSList *group;
|
|
|
|
gint j, compose_idx, sensitive;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Check default compose type */
|
|
|
|
compose_idx = -1;
|
|
|
|
for (j = 0; j < MAX_COMPOSE_TYPES; j++)
|
2000-02-04 23:12:17 +08:00
|
|
|
{
|
2001-08-30 01:48:28 +08:00
|
|
|
if (g_ascii_strcasecmp (compose_type, compose_dsc[j].compose_type) == 0)
|
2000-02-04 23:12:17 +08:00
|
|
|
compose_idx = j;
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
if (compose_idx < 0) compose_idx = 0;
|
|
|
|
|
1999-06-06 05:20:19 +08:00
|
|
|
/* Save original image width/height */
|
2000-02-04 23:12:17 +08:00
|
|
|
composeint.width = gimp_drawable_width (drawable_ID);
|
1999-06-06 05:20:19 +08:00
|
|
|
composeint.height = gimp_drawable_height (drawable_ID);
|
|
|
|
|
2000-05-01 05:03:44 +08:00
|
|
|
gimp_ui_init ("compose", TRUE);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2000-01-07 00:40:17 +08:00
|
|
|
dlg = gimp_dialog_new (_("Compose"), "compose",
|
2000-05-23 01:10:28 +08:00
|
|
|
gimp_standard_help_func, "filters/compose.html",
|
2000-01-07 00:40:17 +08:00
|
|
|
GTK_WIN_POS_MOUSE,
|
|
|
|
FALSE, TRUE, FALSE,
|
|
|
|
|
2001-08-04 03:52:08 +08:00
|
|
|
GTK_STOCK_CANCEL, gtk_widget_destroy,
|
2000-01-07 00:40:17 +08:00
|
|
|
NULL, 1, NULL, FALSE, TRUE,
|
2001-11-29 21:23:44 +08:00
|
|
|
GTK_STOCK_OK, compose_ok_callback,
|
|
|
|
NULL, NULL, NULL, TRUE, FALSE,
|
2000-01-07 00:40:17 +08:00
|
|
|
|
|
|
|
NULL);
|
|
|
|
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (dlg, "destroy",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (gtk_main_quit),
|
|
|
|
NULL);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* parameter settings */
|
2000-01-11 23:48:00 +08:00
|
|
|
hbox = gtk_hbox_new (FALSE, 6);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), hbox, TRUE, TRUE, 0);
|
|
|
|
gtk_widget_show (hbox);
|
|
|
|
|
|
|
|
/* The left frame keeps the compose type toggles */
|
2000-01-11 23:48:00 +08:00
|
|
|
left_frame = gtk_frame_new (_("Compose Channels"));
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_frame_set_shadow_type (GTK_FRAME (left_frame), GTK_SHADOW_ETCHED_IN);
|
2000-01-11 23:48:00 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), left_frame, FALSE, FALSE, 0);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
2000-02-04 23:12:17 +08:00
|
|
|
left_vbox = gtk_vbox_new (FALSE, 1);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (left_vbox), 2);
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (left_frame), left_vbox);
|
|
|
|
|
|
|
|
/* The right frame keeps the selection menues for images. */
|
|
|
|
/* Because the labels within this frame will change when a toggle */
|
|
|
|
/* in the left frame is changed, fill in the right part first. */
|
|
|
|
/* Otherwise it can occur, that a non-existing label might be changed. */
|
|
|
|
|
2000-01-11 23:48:00 +08:00
|
|
|
right_frame = gtk_frame_new (_("Channel Representations"));
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_frame_set_shadow_type (GTK_FRAME (right_frame), GTK_SHADOW_ETCHED_IN);
|
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), right_frame, TRUE, TRUE, 0);
|
|
|
|
|
2000-01-11 23:48:00 +08:00
|
|
|
right_vbox = gtk_vbox_new (FALSE, 0);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (right_vbox), 4);
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (right_frame), right_vbox);
|
|
|
|
|
2000-01-11 23:48:00 +08:00
|
|
|
table = gtk_table_new (MAX_COMPOSE_IMAGES, 2, FALSE);
|
|
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
|
|
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
|
1997-11-25 06:05:25 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (right_vbox), table, TRUE, TRUE, 0);
|
|
|
|
gtk_widget_show (table);
|
|
|
|
|
|
|
|
/* Channel names */
|
|
|
|
for (j = 0; j < MAX_COMPOSE_IMAGES; j++)
|
2000-01-11 23:48:00 +08:00
|
|
|
{
|
|
|
|
composeint.channel_label[j] = label =
|
|
|
|
gtk_label_new (gettext (compose_dsc[compose_idx].channel_name[j]));
|
|
|
|
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
|
|
|
|
gtk_table_attach (GTK_TABLE (table), label, 0, 1, j, j+1,
|
|
|
|
GTK_FILL, GTK_FILL, 0, 0);
|
|
|
|
gtk_widget_show (label);
|
|
|
|
}
|
1999-06-06 05:20:19 +08:00
|
|
|
/* Set sensitivity of last label */
|
|
|
|
sensitive = (strcmp (compose_dsc[compose_idx].channel_name[3],
|
|
|
|
CHNL_NA) != 0);
|
|
|
|
gtk_widget_set_sensitive (composeint.channel_label[3], sensitive);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Menues to select images */
|
|
|
|
for (j = 0; j < MAX_COMPOSE_IMAGES; j++)
|
2000-01-11 23:48:00 +08:00
|
|
|
{
|
|
|
|
composeint.select_ID[j] = drawable_ID;
|
|
|
|
composeint.channel_menu[j] = image_option_menu = gtk_option_menu_new ();
|
|
|
|
image_menu = gimp_drawable_menu_new (check_gray, image_menu_callback,
|
|
|
|
&(composeint.select_ID[j]),
|
|
|
|
composeint.select_ID[j]);
|
|
|
|
gtk_table_attach (GTK_TABLE (table), image_option_menu, 1, 2, j, j+1,
|
|
|
|
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
|
|
|
|
|
|
|
|
gtk_widget_show (image_option_menu);
|
|
|
|
gtk_option_menu_set_menu (GTK_OPTION_MENU (image_option_menu), image_menu);
|
|
|
|
}
|
1999-06-06 05:20:19 +08:00
|
|
|
gtk_widget_set_sensitive (composeint.channel_menu[3], sensitive);
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
/* Compose types */
|
|
|
|
group = NULL;
|
|
|
|
for (j = 0; j < MAX_COMPOSE_TYPES; j++)
|
2000-01-11 23:48:00 +08:00
|
|
|
{
|
|
|
|
toggle = gtk_radio_button_new_with_label (group,
|
|
|
|
gettext(compose_dsc[j].compose_type));
|
2001-12-29 21:26:29 +08:00
|
|
|
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (toggle));
|
2000-01-11 23:48:00 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (left_vbox), toggle, TRUE, TRUE, 0);
|
|
|
|
composeint.compose_flag[j] = (j == compose_idx);
|
2001-12-29 21:26:29 +08:00
|
|
|
gtk_widget_show (toggle);
|
|
|
|
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2001-12-29 21:26:29 +08:00
|
|
|
GTK_SIGNAL_FUNC (compose_type_toggle_update),
|
|
|
|
&(composeint.compose_flag[j]));
|
|
|
|
|
2000-01-11 23:48:00 +08:00
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
|
|
|
|
composeint.compose_flag[j]);
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
gtk_widget_show (left_vbox);
|
|
|
|
gtk_widget_show (right_vbox);
|
|
|
|
gtk_widget_show (left_frame);
|
|
|
|
gtk_widget_show (right_frame);
|
|
|
|
gtk_widget_show (dlg);
|
|
|
|
|
|
|
|
gtk_main ();
|
|
|
|
gdk_flush ();
|
|
|
|
|
|
|
|
return composeint.run;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Compose interface functions */
|
|
|
|
|
|
|
|
static gint
|
1999-10-16 11:51:45 +08:00
|
|
|
check_gray (gint32 image_id,
|
|
|
|
gint32 drawable_id,
|
1997-11-25 06:05:25 +08:00
|
|
|
gpointer data)
|
|
|
|
|
|
|
|
{
|
2000-08-22 09:26:57 +08:00
|
|
|
return ((gimp_image_base_type (image_id) == GIMP_GRAY) &&
|
2000-02-04 23:12:17 +08:00
|
|
|
(gimp_image_width (image_id) == composeint.width) &&
|
|
|
|
(gimp_image_height (image_id) == composeint.height));
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
image_menu_callback (gint32 id,
|
|
|
|
gpointer data)
|
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
*(gint32 *) data = id;
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
compose_ok_callback (GtkWidget *widget,
|
|
|
|
gpointer data)
|
2000-01-11 23:48:00 +08:00
|
|
|
{
|
2000-02-04 23:12:17 +08:00
|
|
|
gint j;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
composeint.run = TRUE;
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (data));
|
|
|
|
|
|
|
|
for (j = 0; j < MAX_COMPOSE_IMAGES; j++)
|
|
|
|
composevals.compose_ID[j] = composeint.select_ID[j];
|
|
|
|
|
|
|
|
for (j = 0; j < MAX_COMPOSE_TYPES; j++)
|
|
|
|
{
|
1999-10-16 11:51:45 +08:00
|
|
|
if (composeint.compose_flag[j])
|
|
|
|
{
|
|
|
|
strcpy (composevals.compose_type, compose_dsc[j].compose_type);
|
|
|
|
break;
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
compose_type_toggle_update (GtkWidget *widget,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
gint *toggle_val;
|
2000-02-04 23:12:17 +08:00
|
|
|
gint compose_idx, j;
|
|
|
|
gint sensitive;
|
1997-11-25 06:05:25 +08:00
|
|
|
|
|
|
|
toggle_val = (gint *) data;
|
|
|
|
|
|
|
|
if (GTK_TOGGLE_BUTTON (widget)->active)
|
1999-10-16 11:51:45 +08:00
|
|
|
{
|
|
|
|
*toggle_val = TRUE;
|
|
|
|
compose_idx = toggle_val - &(composeint.compose_flag[0]);
|
|
|
|
for (j = 0; j < MAX_COMPOSE_IMAGES; j++)
|
|
|
|
gtk_label_set_text (GTK_LABEL (composeint.channel_label[j]),
|
|
|
|
compose_dsc[compose_idx].channel_name[j]);
|
|
|
|
|
|
|
|
/* Set sensitivity of last label */
|
|
|
|
sensitive = (strcmp (compose_dsc[compose_idx].channel_name[3],
|
|
|
|
CHNL_NA) != 0);
|
|
|
|
gtk_widget_set_sensitive (composeint.channel_label[3], sensitive);
|
|
|
|
gtk_widget_set_sensitive (composeint.channel_menu[3], sensitive);
|
|
|
|
}
|
1997-11-25 06:05:25 +08:00
|
|
|
else
|
|
|
|
*toggle_val = FALSE;
|
|
|
|
}
|