1997-11-25 06:05:25 +08:00
/* The GIMP -- an image manipulation program
* Copyright ( C ) 1995 Spencer Kimball and Peter Mattis
*
* 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
*/
# include <stdlib.h>
# include <stdio.h>
# include <math.h>
# include "appenv.h"
# include "asupsample.h"
# include "blend.h"
# include "brush_select.h"
# include "buildmenu.h"
1999-01-11 07:36:29 +08:00
# include "cursorutil.h"
1997-11-25 06:05:25 +08:00
# include "draw_core.h"
# include "drawable.h"
# include "errors.h"
# include "fuzzy_select.h"
# include "gdisplay.h"
# include "gimage_mask.h"
# include "gradient.h"
# include "interface.h"
# include "paint_funcs.h"
# include "palette.h"
# include "selection.h"
# include "tools.h"
# include "undo.h"
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
# include "libgimp/gimpintl.h"
1998-08-12 01:35:34 +08:00
# include "tile.h"
1998-07-08 14:41:58 +08:00
1997-11-25 06:05:25 +08:00
/* target size */
# define TARGET_HEIGHT 15
# define TARGET_WIDTH 15
# define SQR(x) ((x) * (x))
1998-03-19 07:40:52 +08:00
# ifndef M_PI
# define M_PI 3.14159265358979323846
# endif /* M_PI */
1998-07-27 05:49:42 +08:00
# define STATUSBAR_SIZE 128
1997-11-25 06:05:25 +08:00
/* the Blend structures */
typedef enum
{
Linear ,
BiLinear ,
Radial ,
Square ,
ConicalSymmetric ,
ConicalAsymmetric ,
ShapeburstAngular ,
ShapeburstSpherical ,
1999-01-05 07:56:37 +08:00
ShapeburstDimpled ,
SpiralClockwise ,
SpiralAntiClockwise ,
GradientTypeLast
1997-11-25 06:05:25 +08:00
} GradientType ;
typedef enum
{
FG_BG_RGB_MODE ,
FG_BG_HSV_MODE ,
FG_TRANS_MODE ,
1999-01-05 07:56:37 +08:00
CUSTOM_MODE ,
BLEND_MODE_LAST
1997-11-25 06:05:25 +08:00
} BlendMode ;
typedef enum
{
REPEAT_NONE ,
REPEAT_SAWTOOTH ,
1999-01-05 07:56:37 +08:00
REPEAT_TRIANGULAR ,
REPEAT_LAST
1997-11-25 06:05:25 +08:00
} RepeatMode ;
typedef double ( * RepeatFunc ) ( double ) ;
typedef struct _BlendTool BlendTool ;
struct _BlendTool
{
DrawCore * core ; /* Core select object */
int startx ; /* starting x coord */
int starty ; /* starting y coord */
int endx ; /* ending x coord */
int endy ; /* ending y coord */
1998-07-27 05:49:42 +08:00
guint context_id ; /* for the statusbar */
1997-11-25 06:05:25 +08:00
} ;
typedef struct _BlendOptions BlendOptions ;
struct _BlendOptions
{
double opacity ;
double offset ;
BlendMode blend_mode ;
int paint_mode ;
GradientType gradient_type ;
RepeatMode repeat ;
1998-04-02 02:48:34 +08:00
GtkWidget * repeat_mode_menu ;
1997-11-25 06:05:25 +08:00
int supersample ;
GtkWidget * frame ;
int max_depth ;
double threshold ;
} ;
typedef struct {
double offset ;
double sx , sy ;
BlendMode blend_mode ;
GradientType gradient_type ;
color_t fg , bg ;
double dist ;
double vec [ 2 ] ;
RepeatFunc repeat_func ;
} RenderBlendData ;
typedef struct {
PixelRegion * PR ;
unsigned char * row_data ;
int bytes ;
int width ;
} PutPixelData ;
/* local function prototypes */
static void blend_scale_update ( GtkAdjustment * , double * ) ;
static void gradient_type_callback ( GtkWidget * , gpointer ) ;
static void blend_mode_callback ( GtkWidget * , gpointer ) ;
static void paint_mode_callback ( GtkWidget * , gpointer ) ;
static void repeat_type_callback ( GtkWidget * , gpointer ) ;
static void supersample_toggle_update ( GtkWidget * , gpointer ) ;
static void max_depth_scale_update ( GtkAdjustment * , int * ) ;
static void threshold_scale_update ( GtkAdjustment * , double * ) ;
static void blend_button_press ( Tool * , GdkEventButton * , gpointer ) ;
static void blend_button_release ( Tool * , GdkEventButton * , gpointer ) ;
static void blend_motion ( Tool * , GdkEventMotion * , gpointer ) ;
static void blend_cursor_update ( Tool * , GdkEventMotion * , gpointer ) ;
static void blend_control ( Tool * , int , gpointer ) ;
1998-01-22 15:02:57 +08:00
static void blend ( GImage * gimage , GimpDrawable * drawable ,
1997-11-25 06:05:25 +08:00
BlendMode blend_mode , int paint_mode ,
GradientType gradient_type ,
double opacity , double offset ,
RepeatMode repeat ,
int supersample , int max_depth , double threshold ,
double startx , double starty ,
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
double endx , double endy ,
progress_func_t progress_callback ,
void * progress_data ) ;
1997-11-25 06:05:25 +08:00
static double gradient_calc_conical_sym_factor ( double dist , double * axis , double offset ,
double x , double y ) ;
static double gradient_calc_conical_asym_factor ( double dist , double * axis , double offset ,
double x , double y ) ;
static double gradient_calc_square_factor ( double dist , double offset ,
double x , double y ) ;
static double gradient_calc_radial_factor ( double dist , double offset ,
double x , double y ) ;
static double gradient_calc_linear_factor ( double dist , double * vec ,
double x , double y ) ;
static double gradient_calc_bilinear_factor ( double dist , double * vec , double offset ,
double x , double y ) ;
1999-01-05 07:56:37 +08:00
static double gradient_calc_spiral_factor ( double dist , double * axis , double offset ,
double x , double y , gint cwise ) ;
1997-11-25 06:05:25 +08:00
static double gradient_calc_shapeburst_angular_factor ( double x , double y ) ;
static double gradient_calc_shapeburst_spherical_factor ( double x , double y ) ;
static double gradient_calc_shapeburst_dimpled_factor ( double x , double y ) ;
static double gradient_repeat_none ( double val ) ;
static double gradient_repeat_sawtooth ( double val ) ;
static double gradient_repeat_triangular ( double val ) ;
1998-01-22 15:02:57 +08:00
static void gradient_precalc_shapeburst ( GImage * gimage , GimpDrawable * drawable , PixelRegion * PR , double dist ) ;
1997-11-25 06:05:25 +08:00
static void gradient_render_pixel ( double x , double y , color_t * color , void * render_data ) ;
static void gradient_put_pixel ( int x , int y , color_t color , void * put_pixel_data ) ;
1998-01-22 15:02:57 +08:00
static void gradient_fill_region ( GImage * gimage , GimpDrawable * drawable , PixelRegion * PR ,
1997-11-25 06:05:25 +08:00
int width , int height ,
BlendMode blend_mode , GradientType gradient_type ,
double offset , RepeatMode repeat ,
int supersample , int max_depth , double threshold ,
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
double sx , double sy , double ex , double ey ,
progress_func_t progress_callback ,
void * progress_data ) ;
1997-11-25 06:05:25 +08:00
static void calc_rgb_to_hsv ( double * r , double * g , double * b ) ;
static void calc_hsv_to_rgb ( double * h , double * s , double * v ) ;
static BlendOptions * create_blend_options ( void ) ;
static Argument * blend_invoker ( Argument * ) ;
/* variables for the shapeburst algs */
static PixelRegion distR =
{
NULL , /* data */
NULL , /* tiles */
0 , /* rowstride */
0 , 0 , /* w, h */
0 , 0 , /* x, y */
4 , /* bytes */
0 /* process count */
} ;
/* the blend option menu items -- the blend modes */
1999-01-02 11:30:04 +08:00
static MenuItem blend_option_items [ ] =
1997-11-25 06:05:25 +08:00
{
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
{ N_ ( " FG to BG RGB " ) , 0 , 0 , blend_mode_callback , ( gpointer ) FG_BG_RGB_MODE , NULL , NULL } ,
{ N_ ( " FG to BG HSV " ) , 0 , 0 , blend_mode_callback , ( gpointer ) FG_BG_HSV_MODE , NULL , NULL } ,
{ N_ ( " FG to Transparent " ) , 0 , 0 , blend_mode_callback , ( gpointer ) FG_TRANS_MODE , NULL , NULL } ,
{ N_ ( " Custom from editor " ) , 0 , 0 , blend_mode_callback , ( gpointer ) CUSTOM_MODE , NULL , NULL } ,
1997-11-25 06:05:25 +08:00
{ NULL , 0 , 0 , NULL , NULL , NULL , NULL }
} ;
/* the gradient option menu items -- the gradient modes */
1999-01-02 11:30:04 +08:00
static MenuItem gradient_option_items [ ] =
1997-11-25 06:05:25 +08:00
{
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
{ N_ ( " Linear " ) , 0 , 0 , gradient_type_callback , ( gpointer ) Linear , NULL , NULL } ,
{ N_ ( " Bi-Linear " ) , 0 , 0 , gradient_type_callback , ( gpointer ) BiLinear , NULL , NULL } ,
{ N_ ( " Radial " ) , 0 , 0 , gradient_type_callback , ( gpointer ) Radial , NULL , NULL } ,
{ N_ ( " Square " ) , 0 , 0 , gradient_type_callback , ( gpointer ) Square , NULL , NULL } ,
{ N_ ( " Conical (symmetric) " ) , 0 , 0 , gradient_type_callback , ( gpointer ) ConicalSymmetric , NULL , NULL } ,
{ N_ ( " Conical (asymmetric) " ) , 0 , 0 , gradient_type_callback , ( gpointer ) ConicalAsymmetric , NULL , NULL } ,
{ N_ ( " Shapeburst (angular) " ) , 0 , 0 , gradient_type_callback , ( gpointer ) ShapeburstAngular , NULL , NULL } ,
{ N_ ( " Shapeburst (spherical) " ) , 0 , 0 , gradient_type_callback , ( gpointer ) ShapeburstSpherical , NULL , NULL } ,
{ N_ ( " Shapeburst (dimpled) " ) , 0 , 0 , gradient_type_callback , ( gpointer ) ShapeburstDimpled , NULL , NULL } ,
1999-01-05 07:56:37 +08:00
{ N_ ( " Spiral (clockwise) " ) , 0 , 0 , gradient_type_callback , ( gpointer ) SpiralClockwise , NULL , NULL } ,
{ N_ ( " Spiral (anticlockwise) " ) , 0 , 0 , gradient_type_callback , ( gpointer ) SpiralAntiClockwise , NULL , NULL } ,
1997-11-25 06:05:25 +08:00
{ NULL , 0 , 0 , NULL , NULL , NULL , NULL }
} ;
/* blend options */
static BlendOptions * blend_options = NULL ;
/* repeat menu items */
1999-01-02 11:30:04 +08:00
static MenuItem repeat_option_items [ ] =
1997-11-25 06:05:25 +08:00
{
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
{ N_ ( " None " ) , 0 , 0 , repeat_type_callback , ( gpointer ) REPEAT_NONE , NULL , NULL } ,
{ N_ ( " Sawtooth wave " ) , 0 , 0 , repeat_type_callback , ( gpointer ) REPEAT_SAWTOOTH , NULL , NULL } ,
{ N_ ( " Triangular wave " ) , 0 , 0 , repeat_type_callback , ( gpointer ) REPEAT_TRIANGULAR , NULL , NULL } ,
1997-11-25 06:05:25 +08:00
{ NULL , 0 , 0 , NULL , NULL , NULL , NULL }
} ;
static void
blend_scale_update ( GtkAdjustment * adjustment ,
double * scale_val )
{
* scale_val = adjustment - > value ;
}
static void
gradient_type_callback ( GtkWidget * w ,
gpointer client_data )
{
blend_options - > gradient_type = ( GradientType ) client_data ;
1998-04-02 02:48:34 +08:00
gtk_widget_set_sensitive ( blend_options - > repeat_mode_menu ,
( blend_options - > gradient_type < 6 ) ) ;
1997-11-25 06:05:25 +08:00
}
static void
blend_mode_callback ( GtkWidget * w ,
gpointer client_data )
{
blend_options - > blend_mode = ( BlendMode ) client_data ;
}
static void
paint_mode_callback ( GtkWidget * w ,
gpointer client_data )
{
blend_options - > paint_mode = ( long ) client_data ;
}
static void
repeat_type_callback ( GtkWidget * widget ,
gpointer client_data )
{
blend_options - > repeat = ( RepeatMode ) client_data ;
}
static void
supersample_toggle_update ( GtkWidget * widget ,
gpointer client_data )
{
if ( GTK_TOGGLE_BUTTON ( widget ) - > active )
{
blend_options - > supersample = TRUE ;
gtk_widget_set_sensitive ( blend_options - > frame , TRUE ) ;
}
else
{
blend_options - > supersample = FALSE ;
gtk_widget_set_sensitive ( blend_options - > frame , FALSE ) ;
}
}
static void
max_depth_scale_update ( GtkAdjustment * adjustment ,
int * scale_val )
{
* scale_val = ( int ) adjustment - > value ;
}
static void
threshold_scale_update ( GtkAdjustment * adjustment ,
double * scale_val )
{
* scale_val = adjustment - > value ;
}
static BlendOptions *
create_blend_options ( )
{
BlendOptions * options ;
GtkWidget * vbox ;
GtkWidget * frame ;
GtkWidget * label ;
GtkWidget * bm_option_menu ;
GtkWidget * bm_menu ;
GtkWidget * pm_option_menu ;
GtkWidget * pm_menu ;
GtkWidget * gt_option_menu ;
GtkWidget * gt_menu ;
GtkWidget * rt_option_menu ;
GtkWidget * rt_menu ;
GtkWidget * opacity_scale ;
GtkWidget * table ;
GtkWidget * offset_scale ;
GtkObject * opacity_scale_data ;
GtkObject * offset_scale_data ;
GtkWidget * button ;
GtkObject * depth_scale_data ;
GtkWidget * depth_scale ;
GtkObject * threshold_scale_data ;
GtkWidget * threshold_scale ;
/* the new options structure */
options = ( BlendOptions * ) g_malloc ( sizeof ( BlendOptions ) ) ;
options - > opacity = 100.0 ;
options - > offset = 0.0 ;
options - > blend_mode = FG_BG_RGB_MODE ;
options - > paint_mode = NORMAL ;
options - > gradient_type = Linear ;
options - > repeat = REPEAT_NONE ;
options - > supersample = FALSE ;
options - > max_depth = 3 ;
options - > threshold = 0.2 ;
/* the main vbox */
vbox = gtk_vbox_new ( FALSE , 2 ) ;
/* the main label */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
label = gtk_label_new ( _ ( " Blend Options " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , FALSE , FALSE , 0 ) ;
gtk_widget_show ( label ) ;
/* the table */
table = gtk_table_new ( 6 , 2 , FALSE ) ;
gtk_container_border_width ( GTK_CONTAINER ( table ) , 2 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , table , TRUE , TRUE , 0 ) ;
/* the opacity scale */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
label = gtk_label_new ( _ ( " Opacity: " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0.0 , 1.0 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , label , 0 , 1 , 0 , 1 ,
GTK_SHRINK | GTK_FILL , GTK_SHRINK | GTK_FILL , 0 , 2 ) ;
gtk_widget_show ( label ) ;
opacity_scale_data = gtk_adjustment_new ( 100.0 , 0.0 , 100.0 , 1.0 , 1.0 , 0.0 ) ;
opacity_scale = gtk_hscale_new ( GTK_ADJUSTMENT ( opacity_scale_data ) ) ;
gtk_table_attach ( GTK_TABLE ( table ) , opacity_scale , 1 , 2 , 0 , 1 ,
GTK_EXPAND | GTK_SHRINK | GTK_FILL , GTK_SHRINK , 4 , 2 ) ;
gtk_scale_set_value_pos ( GTK_SCALE ( opacity_scale ) , GTK_POS_TOP ) ;
gtk_range_set_update_policy ( GTK_RANGE ( opacity_scale ) , GTK_UPDATE_DELAYED ) ;
gtk_signal_connect ( GTK_OBJECT ( opacity_scale_data ) , " value_changed " ,
( GtkSignalFunc ) blend_scale_update ,
& options - > opacity ) ;
gtk_widget_show ( opacity_scale ) ;
/* the offset scale */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
label = gtk_label_new ( _ ( " Offset: " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0.0 , 1.0 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , label , 0 , 1 , 1 , 2 ,
GTK_SHRINK | GTK_FILL , GTK_SHRINK | GTK_FILL , 0 , 2 ) ;
gtk_widget_show ( label ) ;
offset_scale_data = gtk_adjustment_new ( 0.0 , 0.0 , 100.0 , 1.0 , 1.0 , 0.0 ) ;
offset_scale = gtk_hscale_new ( GTK_ADJUSTMENT ( offset_scale_data ) ) ;
gtk_table_attach ( GTK_TABLE ( table ) , offset_scale , 1 , 2 , 1 , 2 ,
GTK_EXPAND | GTK_SHRINK | GTK_FILL , GTK_SHRINK , 4 , 2 ) ;
gtk_scale_set_value_pos ( GTK_SCALE ( offset_scale ) , GTK_POS_TOP ) ;
gtk_range_set_update_policy ( GTK_RANGE ( offset_scale ) , GTK_UPDATE_DELAYED ) ;
gtk_signal_connect ( GTK_OBJECT ( offset_scale_data ) , " value_changed " ,
( GtkSignalFunc ) blend_scale_update ,
& options - > offset ) ;
gtk_widget_show ( offset_scale ) ;
/* the paint mode menu */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
label = gtk_label_new ( _ ( " Mode: " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0.0 , 0.5 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , label , 0 , 1 , 2 , 3 ,
GTK_SHRINK | GTK_FILL , GTK_SHRINK | GTK_FILL , 0 , 2 ) ;
1998-09-19 08:40:27 +08:00
pm_menu = create_paint_mode_menu ( paint_mode_callback , NULL ) ;
1997-11-25 06:05:25 +08:00
pm_option_menu = gtk_option_menu_new ( ) ;
gtk_table_attach ( GTK_TABLE ( table ) , pm_option_menu , 1 , 2 , 2 , 3 ,
GTK_EXPAND | GTK_SHRINK | GTK_FILL , GTK_SHRINK , 4 , 2 ) ;
gtk_widget_show ( label ) ;
gtk_widget_show ( pm_option_menu ) ;
/* the blend mode menu */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
label = gtk_label_new ( _ ( " Blend: " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0.0 , 0.5 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , label , 0 , 1 , 3 , 4 ,
GTK_SHRINK | GTK_FILL , GTK_SHRINK | GTK_FILL , 0 , 2 ) ;
bm_menu = build_menu ( blend_option_items , NULL ) ;
bm_option_menu = gtk_option_menu_new ( ) ;
gtk_table_attach ( GTK_TABLE ( table ) , bm_option_menu , 1 , 2 , 3 , 4 ,
GTK_EXPAND | GTK_SHRINK | GTK_FILL , GTK_SHRINK , 4 , 2 ) ;
gtk_widget_show ( label ) ;
gtk_widget_show ( bm_option_menu ) ;
/* the gradient type menu */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
label = gtk_label_new ( _ ( " Gradient: " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0.0 , 0.5 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , label , 0 , 1 , 4 , 5 ,
GTK_SHRINK | GTK_FILL , GTK_SHRINK | GTK_FILL , 0 , 2 ) ;
gt_menu = build_menu ( gradient_option_items , NULL ) ;
gt_option_menu = gtk_option_menu_new ( ) ;
gtk_table_attach ( GTK_TABLE ( table ) , gt_option_menu , 1 , 2 , 4 , 5 ,
GTK_EXPAND | GTK_SHRINK | GTK_FILL , GTK_SHRINK , 4 , 2 ) ;
gtk_widget_show ( label ) ;
gtk_widget_show ( gt_option_menu ) ;
/* the repeat option */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
label = gtk_label_new ( _ ( " Repeat: " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0.0 , 0.5 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , label , 0 , 1 , 5 , 6 ,
GTK_SHRINK | GTK_FILL , GTK_SHRINK | GTK_FILL , 0 , 2 ) ;
rt_menu = build_menu ( repeat_option_items , NULL ) ;
rt_option_menu = gtk_option_menu_new ( ) ;
gtk_table_attach ( GTK_TABLE ( table ) , rt_option_menu , 1 , 2 , 5 , 6 ,
GTK_EXPAND | GTK_SHRINK | GTK_FILL , GTK_SHRINK , 4 , 2 ) ;
gtk_widget_show ( label ) ;
gtk_widget_show ( rt_option_menu ) ;
1998-04-02 02:48:34 +08:00
options - > repeat_mode_menu = rt_option_menu ;
1997-11-25 06:05:25 +08:00
/* show the whole table */
gtk_widget_show ( table ) ;
/* supersampling toggle */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
button = gtk_check_button_new_with_label ( _ ( " Adaptive supersampling " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
gtk_signal_connect ( GTK_OBJECT ( button ) , " toggled " ,
( GtkSignalFunc ) supersample_toggle_update ,
NULL ) ;
gtk_toggle_button_set_state ( GTK_TOGGLE_BUTTON ( button ) , FALSE ) ;
gtk_widget_show ( button ) ;
/* frame for supersampling options */
frame = gtk_frame_new ( NULL ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame ) , GTK_SHADOW_ETCHED_IN ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , TRUE , TRUE , 0 ) ;
/* table for supersamplign options */
table = gtk_table_new ( 2 , 2 , FALSE ) ;
gtk_container_border_width ( GTK_CONTAINER ( table ) , 2 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , table ) ;
/* max depth scale */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
label = gtk_label_new ( _ ( " Max depth: " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0.0 , 1.0 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , label , 0 , 1 , 0 , 1 ,
GTK_SHRINK | GTK_FILL , GTK_SHRINK | GTK_FILL , 0 , 2 ) ;
gtk_widget_show ( label ) ;
depth_scale_data = gtk_adjustment_new ( 3.0 , 1.0 , 10.0 , 1.0 , 1.0 , 1.0 ) ;
depth_scale = gtk_hscale_new ( GTK_ADJUSTMENT ( depth_scale_data ) ) ;
gtk_scale_set_digits ( GTK_SCALE ( depth_scale ) , 0 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , depth_scale , 1 , 2 , 0 , 1 ,
GTK_EXPAND | GTK_SHRINK | GTK_FILL , GTK_SHRINK , 4 , 2 ) ;
gtk_scale_set_value_pos ( GTK_SCALE ( depth_scale ) , GTK_POS_TOP ) ;
gtk_signal_connect ( GTK_OBJECT ( depth_scale_data ) , " value_changed " ,
( GtkSignalFunc ) max_depth_scale_update ,
& options - > max_depth ) ;
gtk_widget_show ( depth_scale ) ;
/* threshold scale */
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
label = gtk_label_new ( _ ( " Threshold: " ) ) ;
1997-11-25 06:05:25 +08:00
gtk_misc_set_alignment ( GTK_MISC ( label ) , 0.0 , 1.0 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , label , 0 , 1 , 1 , 2 ,
GTK_SHRINK | GTK_FILL , GTK_SHRINK | GTK_FILL , 0 , 2 ) ;
gtk_widget_show ( label ) ;
threshold_scale_data = gtk_adjustment_new ( 0.2 , 0.0 , 4.0 , 0.01 , 0.01 , 0.0 ) ;
threshold_scale = gtk_hscale_new ( GTK_ADJUSTMENT ( threshold_scale_data ) ) ;
gtk_scale_set_digits ( GTK_SCALE ( threshold_scale ) , 2 ) ;
gtk_table_attach ( GTK_TABLE ( table ) , threshold_scale , 1 , 2 , 1 , 2 ,
GTK_EXPAND | GTK_SHRINK | GTK_FILL , GTK_SHRINK , 4 , 2 ) ;
gtk_scale_set_value_pos ( GTK_SCALE ( threshold_scale ) , GTK_POS_TOP ) ;
gtk_signal_connect ( GTK_OBJECT ( threshold_scale_data ) , " value_changed " ,
( GtkSignalFunc ) threshold_scale_update ,
& options - > threshold ) ;
gtk_widget_show ( threshold_scale ) ;
/* show table */
gtk_widget_show ( table ) ;
/* show frame */
gtk_widget_show ( frame ) ;
gtk_widget_set_sensitive ( frame , FALSE ) ;
options - > frame = frame ;
/* Register this selection options widget with the main tools options dialog */
tools_register_options ( BLEND , vbox ) ;
/* Post initialization */
gtk_option_menu_set_menu ( GTK_OPTION_MENU ( bm_option_menu ) , bm_menu ) ;
gtk_option_menu_set_menu ( GTK_OPTION_MENU ( gt_option_menu ) , gt_menu ) ;
gtk_option_menu_set_menu ( GTK_OPTION_MENU ( pm_option_menu ) , pm_menu ) ;
gtk_option_menu_set_menu ( GTK_OPTION_MENU ( rt_option_menu ) , rt_menu ) ;
return options ;
}
static void
blend_button_press ( Tool * tool ,
GdkEventButton * bevent ,
gpointer gdisp_ptr )
{
GDisplay * gdisp ;
BlendTool * blend_tool ;
gdisp = ( GDisplay * ) gdisp_ptr ;
blend_tool = ( BlendTool * ) tool - > private ;
switch ( drawable_type ( gimage_active_drawable ( gdisp - > gimage ) ) )
{
case INDEXED_GIMAGE : case INDEXEDA_GIMAGE :
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
g_message ( _ ( " Blend: Invalid for indexed images. " ) ) ;
1997-11-25 06:05:25 +08:00
return ;
break ;
default :
break ;
}
/* Keep the coordinates of the target */
gdisplay_untransform_coords ( gdisp , bevent - > x , bevent - > y ,
& blend_tool - > startx , & blend_tool - > starty , FALSE , 1 ) ;
blend_tool - > endx = blend_tool - > startx ;
blend_tool - > endy = blend_tool - > starty ;
/* Make the tool active and set the gdisplay which owns it */
gdk_pointer_grab ( gdisp - > canvas - > window , FALSE ,
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_RELEASE_MASK ,
NULL , NULL , bevent - > time ) ;
tool - > gdisp_ptr = gdisp_ptr ;
tool - > state = ACTIVE ;
1998-07-27 05:49:42 +08:00
/* initialize the statusbar display */
blend_tool - > context_id = gtk_statusbar_get_context_id ( GTK_STATUSBAR ( gdisp - > statusbar ) , " blend " ) ;
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
gtk_statusbar_push ( GTK_STATUSBAR ( gdisp - > statusbar ) , blend_tool - > context_id , _ ( " Blend: 0, 0 " ) ) ;
1998-07-27 05:49:42 +08:00
1997-11-25 06:05:25 +08:00
/* Start drawing the blend tool */
draw_core_start ( blend_tool - > core , gdisp - > canvas - > window , tool ) ;
}
static void
blend_button_release ( Tool * tool ,
GdkEventButton * bevent ,
gpointer gdisp_ptr )
{
1998-07-27 05:49:42 +08:00
GDisplay * gdisp ;
1997-11-25 06:05:25 +08:00
GImage * gimage ;
BlendTool * blend_tool ;
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
# ifdef BLEND_UI_CALLS_VIA_PDB
1997-11-25 06:05:25 +08:00
Argument * return_vals ;
int nreturn_vals ;
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
# else
gimp_progress * progress ;
# endif
1997-11-25 06:05:25 +08:00
1998-07-27 05:49:42 +08:00
gdisp = ( GDisplay * ) gdisp_ptr ;
gimage = gdisp - > gimage ;
1997-11-25 06:05:25 +08:00
blend_tool = ( BlendTool * ) tool - > private ;
gdk_pointer_ungrab ( bevent - > time ) ;
gdk_flush ( ) ;
1998-07-27 05:49:42 +08:00
gtk_statusbar_pop ( GTK_STATUSBAR ( gdisp - > statusbar ) , blend_tool - > context_id ) ;
1997-11-25 06:05:25 +08:00
draw_core_stop ( blend_tool - > core , tool ) ;
tool - > state = INACTIVE ;
/* if the 3rd button isn't pressed, fill the selected region */
if ( ! ( bevent - > state & GDK_BUTTON3_MASK ) & &
( ( blend_tool - > startx ! = blend_tool - > endx ) | |
( blend_tool - > starty ! = blend_tool - > endy ) ) )
{
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
/* we can't do callbacks easily with the PDB, so this UI/backend
* separation ( though good ) is ignored for the moment */
# ifdef BLEND_UI_CALLS_VIA_PDB
1997-11-25 06:05:25 +08:00
return_vals = procedural_db_run_proc ( " gimp_blend " ,
& nreturn_vals ,
1998-01-22 15:02:57 +08:00
PDB_DRAWABLE , drawable_ID ( gimage_active_drawable ( gimage ) ) ,
1997-11-25 06:05:25 +08:00
PDB_INT32 , ( gint32 ) blend_options - > blend_mode ,
PDB_INT32 , ( gint32 ) blend_options - > paint_mode ,
PDB_INT32 , ( gint32 ) blend_options - > gradient_type ,
PDB_FLOAT , ( gdouble ) blend_options - > opacity ,
PDB_FLOAT , ( gdouble ) blend_options - > offset ,
PDB_INT32 , ( gint32 ) blend_options - > repeat ,
PDB_INT32 , ( gint32 ) blend_options - > supersample ,
PDB_INT32 , ( gint32 ) blend_options - > max_depth ,
PDB_FLOAT , ( gdouble ) blend_options - > threshold ,
PDB_FLOAT , ( gdouble ) blend_tool - > startx ,
PDB_FLOAT , ( gdouble ) blend_tool - > starty ,
PDB_FLOAT , ( gdouble ) blend_tool - > endx ,
PDB_FLOAT , ( gdouble ) blend_tool - > endy ,
PDB_END ) ;
if ( return_vals [ 0 ] . value . pdb_int = = PDB_SUCCESS )
gdisplays_flush ( ) ;
else
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
g_message ( _ ( " Blend operation failed. " ) ) ;
1997-11-25 06:05:25 +08:00
procedural_db_destroy_args ( return_vals , nreturn_vals ) ;
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
# else /* ! BLEND_UI_CALLS_VIA_PDB */
progress = progress_start ( gdisp , _ ( " Blending... " ) , FALSE , NULL , NULL ) ;
blend ( gimage ,
gimage_active_drawable ( gimage ) ,
blend_options - > blend_mode ,
blend_options - > paint_mode ,
blend_options - > gradient_type ,
blend_options - > opacity ,
blend_options - > offset ,
blend_options - > repeat ,
blend_options - > supersample ,
blend_options - > max_depth ,
blend_options - > threshold ,
blend_tool - > startx ,
blend_tool - > starty ,
blend_tool - > endx ,
blend_tool - > endy ,
progress ? progress_update_and_flush : NULL , progress ) ;
if ( progress )
progress_end ( progress ) ;
gdisplays_flush ( ) ;
# endif /* ! BLEND_UI_CALLS_VIA_PDB */
1997-11-25 06:05:25 +08:00
}
}
static void
blend_motion ( Tool * tool ,
GdkEventMotion * mevent ,
gpointer gdisp_ptr )
{
GDisplay * gdisp ;
BlendTool * blend_tool ;
1998-07-27 05:49:42 +08:00
gchar vector [ STATUSBAR_SIZE ] ;
1997-11-25 06:05:25 +08:00
gdisp = ( GDisplay * ) gdisp_ptr ;
blend_tool = ( BlendTool * ) tool - > private ;
/* undraw the current tool */
draw_core_pause ( blend_tool - > core , tool ) ;
/* Get the current coordinates */
gdisplay_untransform_coords ( gdisp , mevent - > x , mevent - > y ,
& blend_tool - > endx , & blend_tool - > endy , FALSE , 1 ) ;
1998-07-27 05:49:42 +08:00
gtk_statusbar_pop ( GTK_STATUSBAR ( gdisp - > statusbar ) , blend_tool - > context_id ) ;
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
g_snprintf ( vector , STATUSBAR_SIZE , _ ( " Blend: %d, %d " ) ,
1998-07-27 05:49:42 +08:00
abs ( blend_tool - > endx - blend_tool - > startx ) ,
abs ( blend_tool - > endy - blend_tool - > starty ) ) ;
gtk_statusbar_push ( GTK_STATUSBAR ( gdisp - > statusbar ) , blend_tool - > context_id , vector ) ;
1997-11-25 06:05:25 +08:00
/* redraw the current tool */
draw_core_resume ( blend_tool - > core , tool ) ;
}
static void
blend_cursor_update ( Tool * tool ,
GdkEventMotion * mevent ,
gpointer gdisp_ptr )
{
GDisplay * gdisp ;
gdisp = ( GDisplay * ) gdisp_ptr ;
switch ( drawable_type ( gimage_active_drawable ( gdisp - > gimage ) ) )
{
case INDEXED_GIMAGE : case INDEXEDA_GIMAGE :
gdisplay_install_tool_cursor ( gdisp , GDK_TOP_LEFT_ARROW ) ;
break ;
default :
gdisplay_install_tool_cursor ( gdisp , GDK_TCROSS ) ;
break ;
}
}
static void
blend_draw ( Tool * tool )
{
GDisplay * gdisp ;
BlendTool * blend_tool ;
int tx1 , ty1 , tx2 , ty2 ;
gdisp = ( GDisplay * ) tool - > gdisp_ptr ;
blend_tool = ( BlendTool * ) tool - > private ;
gdisplay_transform_coords ( gdisp , blend_tool - > startx , blend_tool - > starty ,
& tx1 , & ty1 , 1 ) ;
gdisplay_transform_coords ( gdisp , blend_tool - > endx , blend_tool - > endy ,
& tx2 , & ty2 , 1 ) ;
/* Draw start target */
gdk_draw_line ( blend_tool - > core - > win , blend_tool - > core - > gc ,
tx1 - ( TARGET_WIDTH > > 1 ) , ty1 ,
tx1 + ( TARGET_WIDTH > > 1 ) , ty1 ) ;
gdk_draw_line ( blend_tool - > core - > win , blend_tool - > core - > gc ,
tx1 , ty1 - ( TARGET_HEIGHT > > 1 ) ,
tx1 , ty1 + ( TARGET_HEIGHT > > 1 ) ) ;
/* Draw end target */
gdk_draw_line ( blend_tool - > core - > win , blend_tool - > core - > gc ,
tx2 - ( TARGET_WIDTH > > 1 ) , ty2 ,
tx2 + ( TARGET_WIDTH > > 1 ) , ty2 ) ;
gdk_draw_line ( blend_tool - > core - > win , blend_tool - > core - > gc ,
tx2 , ty2 - ( TARGET_HEIGHT > > 1 ) ,
tx2 , ty2 + ( TARGET_HEIGHT > > 1 ) ) ;
/* Draw the line between the start and end coords */
gdk_draw_line ( blend_tool - > core - > win , blend_tool - > core - > gc ,
tx1 , ty1 , tx2 , ty2 ) ;
}
static void
blend_control ( Tool * tool ,
int action ,
gpointer gdisp_ptr )
{
BlendTool * blend_tool ;
blend_tool = ( BlendTool * ) tool - > private ;
switch ( action )
{
case PAUSE :
draw_core_pause ( blend_tool - > core , tool ) ;
break ;
case RESUME :
draw_core_resume ( blend_tool - > core , tool ) ;
break ;
case HALT :
draw_core_stop ( blend_tool - > core , tool ) ;
break ;
}
}
/*****/
/* The actual blending procedure */
static void
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
blend ( GImage * gimage ,
GimpDrawable * drawable ,
BlendMode blend_mode ,
int paint_mode ,
GradientType gradient_type ,
double opacity ,
double offset ,
RepeatMode repeat ,
int supersample ,
int max_depth ,
double threshold ,
double startx ,
double starty ,
double endx ,
double endy ,
progress_func_t progress_callback ,
void * progress_data )
1997-11-25 06:05:25 +08:00
{
TileManager * buf_tiles ;
PixelRegion bufPR ;
int has_alpha ;
int has_selection ;
int bytes ;
int x1 , y1 , x2 , y2 ;
1999-01-11 07:36:29 +08:00
gimp_add_busy_cursors ( ) ;
1998-01-22 15:02:57 +08:00
has_selection = drawable_mask_bounds ( drawable , & x1 , & y1 , & x2 , & y2 ) ;
1997-11-25 06:05:25 +08:00
1998-01-22 15:02:57 +08:00
has_alpha = drawable_has_alpha ( drawable ) ;
bytes = drawable_bytes ( drawable ) ;
1997-11-25 06:05:25 +08:00
/* Always create an alpha temp buf (for generality) */
if ( ! has_alpha )
{
has_alpha = TRUE ;
bytes + = 1 ;
}
buf_tiles = tile_manager_new ( ( x2 - x1 ) , ( y2 - y1 ) , bytes ) ;
pixel_region_init ( & bufPR , buf_tiles , 0 , 0 , ( x2 - x1 ) , ( y2 - y1 ) , TRUE ) ;
1998-01-22 15:02:57 +08:00
gradient_fill_region ( gimage , drawable ,
1998-11-15 20:58:37 +08:00
& bufPR , ( x2 - x1 ) , ( y2 - y1 ) ,
1997-11-25 06:05:25 +08:00
blend_mode , gradient_type , offset , repeat ,
supersample , max_depth , threshold ,
( startx - x1 ) , ( starty - y1 ) ,
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
( endx - x1 ) , ( endy - y1 ) ,
progress_callback , progress_data ) ;
1997-11-25 06:05:25 +08:00
pixel_region_init ( & bufPR , buf_tiles , 0 , 0 , ( x2 - x1 ) , ( y2 - y1 ) , FALSE ) ;
1998-01-22 15:02:57 +08:00
gimage_apply_image ( gimage , drawable , & bufPR , TRUE ,
1997-11-25 06:05:25 +08:00
( opacity * 255 ) / 100 , paint_mode , NULL , x1 , y1 ) ;
/* update the image */
1998-01-22 15:02:57 +08:00
drawable_update ( drawable , x1 , y1 , ( x2 - x1 ) , ( y2 - y1 ) ) ;
1997-11-25 06:05:25 +08:00
/* free the temporary buffer */
tile_manager_destroy ( buf_tiles ) ;
1999-01-11 07:36:29 +08:00
gimp_remove_busy_cursors ( ) ;
1997-11-25 06:05:25 +08:00
}
static double
gradient_calc_conical_sym_factor ( double dist ,
double * axis ,
double offset ,
double x ,
double y )
{
double vec [ 2 ] ;
double r ;
double rat ;
if ( dist = = 0.0 )
rat = 0.0 ;
else
if ( ( x ! = 0 ) | | ( y ! = 0 ) )
{
/* Calculate offset from the start in pixels */
r = sqrt ( x * x + y * y ) ;
vec [ 0 ] = x / r ;
vec [ 1 ] = y / r ;
rat = axis [ 0 ] * vec [ 0 ] + axis [ 1 ] * vec [ 1 ] ; /* Dot product */
if ( rat > 1.0 )
rat = 1.0 ;
else if ( rat < - 1.0 )
rat = - 1.0 ;
/* This cool idea is courtesy Josh MacDonald,
* Ali Rahimi - - - two more XCF losers . */
rat = acos ( rat ) / M_PI ;
rat = pow ( rat , ( offset / 10 ) + 1 ) ;
rat = BOUNDS ( rat , 0.0 , 1.0 ) ;
}
else
rat = 0.5 ;
return rat ;
} /* gradient_calc_conical_sym_factor */
/*****/
static double
gradient_calc_conical_asym_factor ( double dist ,
double * axis ,
double offset ,
double x ,
double y )
{
double ang0 , ang1 ;
double ang ;
double rat ;
if ( dist = = 0.0 )
rat = 0.0 ;
else
{
if ( ( x ! = 0 ) | | ( y ! = 0 ) )
{
ang0 = atan2 ( axis [ 0 ] , axis [ 1 ] ) + M_PI ;
ang1 = atan2 ( x , y ) + M_PI ;
ang = ang1 - ang0 ;
if ( ang < 0.0 )
ang + = ( 2.0 * M_PI ) ;
rat = ang / ( 2.0 * M_PI ) ;
rat = pow ( rat , ( offset / 10 ) + 1 ) ;
rat = BOUNDS ( rat , 0.0 , 1.0 ) ;
}
else
rat = 0.5 ; /* We are on middle point */
} /* else */
return rat ;
} /* gradient_calc_conical_asym_factor */
/*****/
static double
gradient_calc_square_factor ( double dist ,
double offset ,
double x ,
double y )
{
double r ;
double rat ;
if ( dist = = 0.0 )
rat = 0.0 ;
else
{
/* Calculate offset from start as a value in [0, 1] */
offset = offset / 100.0 ;
r = MAXIMUM ( abs ( x ) , abs ( y ) ) ;
rat = r / dist ;
if ( rat < offset )
rat = 0.0 ;
1997-12-15 08:21:15 +08:00
else if ( offset = = 1 )
rat = ( rat > = 1 ) ? 1 : 0 ;
1997-11-25 06:05:25 +08:00
else
rat = ( rat - offset ) / ( 1.0 - offset ) ;
} /* else */
return rat ;
} /* gradient_calc_square_factor */
/*****/
static double
gradient_calc_radial_factor ( double dist ,
double offset ,
double x ,
double y )
{
double r ;
double rat ;
if ( dist = = 0.0 )
rat = 0.0 ;
else
{
/* Calculate radial offset from start as a value in [0, 1] */
offset = offset / 100.0 ;
r = sqrt ( SQR ( x ) + SQR ( y ) ) ;
rat = r / dist ;
if ( rat < offset )
rat = 0.0 ;
1997-12-15 08:21:15 +08:00
else if ( offset = = 1 )
rat = ( rat > = 1 ) ? 1 : 0 ;
1997-11-25 06:05:25 +08:00
else
rat = ( rat - offset ) / ( 1.0 - offset ) ;
} /* else */
return rat ;
} /* gradient_calc_radial_factor */
/*****/
static double
gradient_calc_linear_factor ( double dist ,
double * vec ,
double x ,
double y )
{
double r ;
double rat ;
if ( dist = = 0.0 )
rat = 0.0 ;
else
{
r = vec [ 0 ] * x + vec [ 1 ] * y ;
rat = r / dist ;
} /* else */
return rat ;
} /* gradient_calc_linear_factor */
/*****/
static double
gradient_calc_bilinear_factor ( double dist ,
double * vec ,
double offset ,
double x ,
double y )
{
double r ;
double rat ;
if ( dist = = 0.0 )
rat = 0.0 ;
else
{
/* Calculate linear offset from the start line outward */
offset = offset / 100.0 ;
r = vec [ 0 ] * x + vec [ 1 ] * y ;
rat = r / dist ;
if ( fabs ( rat ) < offset )
rat = 0.0 ;
1997-12-15 08:21:15 +08:00
else if ( offset = = 1 )
rat = ( rat > = 1 ) ? 1 : 0 ;
1997-11-25 06:05:25 +08:00
else
rat = ( fabs ( rat ) - offset ) / ( 1.0 - offset ) ;
} /* else */
return rat ;
} /* gradient_calc_bilinear_factor */
1999-01-05 07:56:37 +08:00
static double
gradient_calc_spiral_factor ( double dist ,
double * axis ,
double offset ,
double x ,
double y ,
gint cwise )
{
double ang0 , ang1 ;
double ang , r ;
double rat ;
if ( dist = = 0.0 )
rat = 0.0 ;
else
{
if ( x ! = 0.0 | | y ! = 0.0 )
{
ang0 = atan2 ( axis [ 0 ] , axis [ 1 ] ) + M_PI ;
ang1 = atan2 ( x , y ) + M_PI ;
if ( ! cwise )
ang = ang0 - ang1 ;
else
ang = ang1 - ang0 ;
if ( ang < 0.0 )
ang + = ( 2.0 * M_PI ) ;
r = sqrt ( x * x + y * y ) / dist ;
rat = ang / ( 2.0 * M_PI ) + r + offset ;
rat = fmod ( rat , 1.0 ) ;
}
else
rat = 0.5 ; /* We are on the middle point */
}
return rat ;
}
1997-11-25 06:05:25 +08:00
static double
gradient_calc_shapeburst_angular_factor ( double x ,
double y )
{
int ix , iy ;
Tile * tile ;
float value ;
ix = ( int ) BOUNDS ( x , 0 , distR . w ) ;
iy = ( int ) BOUNDS ( y , 0 , distR . h ) ;
1998-08-16 03:17:36 +08:00
tile = tile_manager_get_tile ( distR . tiles , ix , iy , TRUE , FALSE ) ;
1998-08-12 01:35:34 +08:00
value = 1.0 - * ( ( float * ) tile_data_pointer ( tile , ix % TILE_WIDTH , iy % TILE_HEIGHT ) ) ;
1998-07-10 10:43:12 +08:00
tile_release ( tile , FALSE ) ;
1997-11-25 06:05:25 +08:00
return value ;
}
static double
gradient_calc_shapeburst_spherical_factor ( double x ,
double y )
{
int ix , iy ;
Tile * tile ;
float value ;
ix = ( int ) BOUNDS ( x , 0 , distR . w ) ;
iy = ( int ) BOUNDS ( y , 0 , distR . h ) ;
1998-08-16 03:17:36 +08:00
tile = tile_manager_get_tile ( distR . tiles , ix , iy , TRUE , FALSE ) ;
1998-08-12 01:35:34 +08:00
value = * ( ( float * ) tile_data_pointer ( tile , ix % TILE_WIDTH , iy % TILE_HEIGHT ) ) ;
1997-11-25 06:05:25 +08:00
value = 1.0 - sin ( 0.5 * M_PI * value ) ;
1998-07-10 10:43:12 +08:00
tile_release ( tile , FALSE ) ;
1997-11-25 06:05:25 +08:00
return value ;
}
static double
gradient_calc_shapeburst_dimpled_factor ( double x ,
double y )
{
int ix , iy ;
Tile * tile ;
float value ;
ix = ( int ) BOUNDS ( x , 0 , distR . w ) ;
iy = ( int ) BOUNDS ( y , 0 , distR . h ) ;
1998-08-16 03:17:36 +08:00
tile = tile_manager_get_tile ( distR . tiles , ix , iy , TRUE , FALSE ) ;
1998-08-12 01:35:34 +08:00
value = * ( ( float * ) tile_data_pointer ( tile , ix % TILE_WIDTH , iy % TILE_HEIGHT ) ) ;
1997-11-25 06:05:25 +08:00
value = cos ( 0.5 * M_PI * value ) ;
1998-07-10 10:43:12 +08:00
tile_release ( tile , FALSE ) ;
1997-11-25 06:05:25 +08:00
return value ;
}
static double
gradient_repeat_none ( double val )
{
return BOUNDS ( val , 0.0 , 1.0 ) ;
}
static double
gradient_repeat_sawtooth ( double val )
{
if ( val > = 0.0 )
return fmod ( val , 1.0 ) ;
else
return 1.0 - fmod ( - val , 1.0 ) ;
}
static double
gradient_repeat_triangular ( double val )
{
int ival ;
if ( val < 0.0 )
val = - val ;
ival = ( int ) val ;
if ( ival & 1 )
return 1.0 - fmod ( val , 1.0 ) ;
else
return fmod ( val , 1.0 ) ;
}
/*****/
static void
gradient_precalc_shapeburst ( GImage * gimage ,
1998-01-22 15:02:57 +08:00
GimpDrawable * drawable ,
1997-11-25 06:05:25 +08:00
PixelRegion * PR ,
double dist )
{
Channel * mask ;
PixelRegion tempR ;
float max_iteration ;
float * distp ;
int size ;
void * pr ;
1998-01-25 09:24:46 +08:00
unsigned char white [ 1 ] = { OPAQUE_OPACITY } ;
1997-11-25 06:05:25 +08:00
/* allocate the distance map */
if ( distR . tiles )
tile_manager_destroy ( distR . tiles ) ;
distR . tiles = tile_manager_new ( PR - > w , PR - > h , sizeof ( float ) ) ;
/* allocate the selection mask copy */
tempR . tiles = tile_manager_new ( PR - > w , PR - > h , 1 ) ;
pixel_region_init ( & tempR , tempR . tiles , 0 , 0 , PR - > w , PR - > h , TRUE ) ;
/* If the gimage mask is not empty, use it as the shape burst source */
if ( ! gimage_mask_is_empty ( gimage ) )
{
PixelRegion maskR ;
int x1 , y1 , x2 , y2 ;
int offx , offy ;
1998-01-22 15:02:57 +08:00
drawable_mask_bounds ( drawable , & x1 , & y1 , & x2 , & y2 ) ;
drawable_offsets ( drawable , & offx , & offy ) ;
1997-11-25 06:05:25 +08:00
/* the selection mask */
mask = gimage_get_mask ( gimage ) ;
1998-01-22 15:02:57 +08:00
pixel_region_init ( & maskR , drawable_data ( GIMP_DRAWABLE ( mask ) ) ,
x1 + offx , y1 + offy , ( x2 - x1 ) , ( y2 - y1 ) , FALSE ) ;
1997-11-25 06:05:25 +08:00
/* copy the mask to the temp mask */
copy_region ( & maskR , & tempR ) ;
}
/* otherwise... */
else
{
/* If the intended drawable has an alpha channel, use that */
1998-01-22 15:02:57 +08:00
if ( drawable_has_alpha ( drawable ) )
1997-11-25 06:05:25 +08:00
{
PixelRegion drawableR ;
1998-01-22 15:02:57 +08:00
pixel_region_init ( & drawableR , drawable_data ( drawable ) , PR - > x , PR - > y , PR - > w , PR - > h , FALSE ) ;
1997-11-25 06:05:25 +08:00
extract_alpha_region ( & drawableR , NULL , & tempR ) ;
}
/* Otherwise, just fill the shapeburst to white */
else
color_region ( & tempR , white ) ;
}
pixel_region_init ( & tempR , tempR . tiles , 0 , 0 , PR - > w , PR - > h , TRUE ) ;
pixel_region_init ( & distR , distR . tiles , 0 , 0 , PR - > w , PR - > h , TRUE ) ;
max_iteration = shapeburst_region ( & tempR , & distR ) ;
/* normalize the shapeburst with the max iteration */
if ( max_iteration > 0 )
{
pixel_region_init ( & distR , distR . tiles , 0 , 0 , PR - > w , PR - > h , TRUE ) ;
for ( pr = pixel_regions_register ( 1 , & distR ) ; pr ! = NULL ; pr = pixel_regions_process ( pr ) )
{
distp = ( float * ) distR . data ;
size = distR . w * distR . h ;
while ( size - - )
* distp + + / = max_iteration ;
}
pixel_region_init ( & distR , distR . tiles , 0 , 0 , PR - > w , PR - > h , FALSE ) ;
}
tile_manager_destroy ( tempR . tiles ) ;
}
static void
gradient_render_pixel ( double x , double y , color_t * color , void * render_data )
{
RenderBlendData * rbd ;
double factor ;
rbd = render_data ;
/* Calculate blending factor */
switch ( rbd - > gradient_type )
{
case Radial :
factor = gradient_calc_radial_factor ( rbd - > dist , rbd - > offset ,
x - rbd - > sx , y - rbd - > sy ) ;
break ;
case ConicalSymmetric :
factor = gradient_calc_conical_sym_factor ( rbd - > dist , rbd - > vec , rbd - > offset ,
x - rbd - > sx , y - rbd - > sy ) ;
break ;
case ConicalAsymmetric :
factor = gradient_calc_conical_asym_factor ( rbd - > dist , rbd - > vec , rbd - > offset ,
x - rbd - > sx , y - rbd - > sy ) ;
break ;
case Square :
factor = gradient_calc_square_factor ( rbd - > dist , rbd - > offset ,
x - rbd - > sx , y - rbd - > sy ) ;
break ;
case Linear :
factor = gradient_calc_linear_factor ( rbd - > dist , rbd - > vec ,
x - rbd - > sx , y - rbd - > sy ) ;
break ;
case BiLinear :
factor = gradient_calc_bilinear_factor ( rbd - > dist , rbd - > vec , rbd - > offset ,
x - rbd - > sx , y - rbd - > sy ) ;
break ;
case ShapeburstAngular :
factor = gradient_calc_shapeburst_angular_factor ( x , y ) ;
break ;
case ShapeburstSpherical :
factor = gradient_calc_shapeburst_spherical_factor ( x , y ) ;
break ;
case ShapeburstDimpled :
factor = gradient_calc_shapeburst_dimpled_factor ( x , y ) ;
break ;
1999-01-05 07:56:37 +08:00
case SpiralClockwise :
factor = gradient_calc_spiral_factor ( rbd - > dist , rbd - > vec , rbd - > offset ,
x - rbd - > sx , y - rbd - > sy , TRUE ) ;
break ;
case SpiralAntiClockwise :
factor = gradient_calc_spiral_factor ( rbd - > dist , rbd - > vec , rbd - > offset ,
x - rbd - > sx , y - rbd - > sy , FALSE ) ;
break ;
1997-11-25 06:05:25 +08:00
default :
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
fatal_error ( _ ( " gradient_render_pixel(): unknown gradient type %d " ) ,
1997-11-25 06:05:25 +08:00
( int ) rbd - > gradient_type ) ;
return ;
}
/* Adjust for repeat */
factor = ( * rbd - > repeat_func ) ( factor ) ;
/* Blend the colors */
if ( rbd - > blend_mode = = CUSTOM_MODE )
grad_get_color_at ( factor , & color - > r , & color - > g , & color - > b , & color - > a ) ;
else
{
/* Blend values */
color - > r = rbd - > fg . r + ( rbd - > bg . r - rbd - > fg . r ) * factor ;
color - > g = rbd - > fg . g + ( rbd - > bg . g - rbd - > fg . g ) * factor ;
color - > b = rbd - > fg . b + ( rbd - > bg . b - rbd - > fg . b ) * factor ;
color - > a = rbd - > fg . a + ( rbd - > bg . a - rbd - > fg . a ) * factor ;
if ( rbd - > blend_mode = = FG_BG_HSV_MODE )
calc_hsv_to_rgb ( & color - > r , & color - > g , & color - > b ) ;
}
}
static void
gradient_put_pixel ( int x , int y , color_t color , void * put_pixel_data )
{
PutPixelData * ppd ;
unsigned char * data ;
ppd = put_pixel_data ;
/* Paint */
data = ppd - > row_data + ppd - > bytes * x ;
if ( ppd - > bytes > = 3 )
{
* data + + = color . r * 255.0 ;
* data + + = color . g * 255.0 ;
* data + + = color . b * 255.0 ;
* data + + = color . a * 255.0 ;
}
else
{
/* Convert to grayscale */
* data + + = 255.0 * ( 0.30 * color . r +
0.59 * color . g +
0.11 * color . b ) ;
* data + + = color . a * 255.0 ;
}
/* Paint whole row if we are on the rightmost pixel */
if ( x = = ( ppd - > width - 1 ) )
pixel_region_set_row ( ppd - > PR , 0 , y , ppd - > width , ppd - > row_data ) ;
}
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
1997-11-25 06:05:25 +08:00
static void
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
gradient_fill_region ( GImage * gimage ,
GimpDrawable * drawable ,
PixelRegion * PR ,
int width ,
int height ,
BlendMode blend_mode ,
GradientType gradient_type ,
double offset ,
RepeatMode repeat ,
int supersample ,
int max_depth ,
double threshold ,
double sx ,
double sy ,
double ex ,
double ey ,
progress_func_t progress_callback ,
void * progress_data )
1997-11-25 06:05:25 +08:00
{
RenderBlendData rbd ;
PutPixelData ppd ;
unsigned char r , g , b ;
int x , y ;
int endx , endy ;
void * pr ;
unsigned char * data ;
color_t color ;
/* Get foreground and background colors, normalized */
palette_get_foreground ( & r , & g , & b ) ;
rbd . fg . r = r / 255.0 ;
rbd . fg . g = g / 255.0 ;
rbd . fg . b = b / 255.0 ;
rbd . fg . a = 1.0 ; /* Foreground is always opaque */
palette_get_background ( & r , & g , & b ) ;
rbd . bg . r = r / 255.0 ;
rbd . bg . g = g / 255.0 ;
rbd . bg . b = b / 255.0 ;
rbd . bg . a = 1.0 ; /* opaque, for now */
switch ( blend_mode )
{
case FG_BG_RGB_MODE :
break ;
case FG_BG_HSV_MODE :
/* Convert to HSV */
calc_rgb_to_hsv ( & rbd . fg . r , & rbd . fg . g , & rbd . fg . b ) ;
calc_rgb_to_hsv ( & rbd . bg . r , & rbd . bg . g , & rbd . bg . b ) ;
break ;
case FG_TRANS_MODE :
/* Color does not change, just the opacity */
rbd . bg = rbd . fg ;
rbd . bg . a = 0.0 ; /* transparent */
break ;
case CUSTOM_MODE :
break ;
default :
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
fatal_error ( _ ( " gradient_fill_region(): unknown blend mode %d " ) ,
1997-11-25 06:05:25 +08:00
( int ) blend_mode ) ;
break ;
}
/* Calculate type-specific parameters */
switch ( gradient_type )
{
case Radial :
rbd . dist = sqrt ( SQR ( ex - sx ) + SQR ( ey - sy ) ) ;
break ;
case Square :
rbd . dist = MAXIMUM ( fabs ( ex - sx ) , fabs ( ey - sy ) ) ;
break ;
case ConicalSymmetric :
case ConicalAsymmetric :
1999-01-05 07:56:37 +08:00
case SpiralClockwise :
case SpiralAntiClockwise :
1997-11-25 06:05:25 +08:00
case Linear :
case BiLinear :
rbd . dist = sqrt ( SQR ( ex - sx ) + SQR ( ey - sy ) ) ;
if ( rbd . dist > 0.0 )
{
rbd . vec [ 0 ] = ( ex - sx ) / rbd . dist ;
rbd . vec [ 1 ] = ( ey - sy ) / rbd . dist ;
}
break ;
case ShapeburstAngular :
case ShapeburstSpherical :
case ShapeburstDimpled :
rbd . dist = sqrt ( SQR ( ex - sx ) + SQR ( ey - sy ) ) ;
1998-01-22 15:02:57 +08:00
gradient_precalc_shapeburst ( gimage , drawable , PR , rbd . dist ) ;
1997-11-25 06:05:25 +08:00
break ;
default :
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
fatal_error ( _ ( " gradient_fill_region(): unknown gradient type %d " ) ,
1997-11-25 06:05:25 +08:00
( int ) gradient_type ) ;
break ;
}
/* Set repeat function */
switch ( repeat )
{
case REPEAT_NONE :
rbd . repeat_func = gradient_repeat_none ;
break ;
case REPEAT_SAWTOOTH :
rbd . repeat_func = gradient_repeat_sawtooth ;
break ;
case REPEAT_TRIANGULAR :
rbd . repeat_func = gradient_repeat_triangular ;
break ;
default :
Lots of ii8n stuff here and some additions to the de.po. Applied
Wed Oct 14 17:46:15 EDT 1998 Adrian Likins <adrian@gimp.org>
* app/*, po/de.po, de/POTFILES.in, libgimp/gimpintl.h:
Lots of ii8n stuff here and some additions to the de.po.
Applied gimp-egger-981005-1 ,gimp-egger-981006-1,
gimp-egger-981007-1, gimp-egger-981008-1,
gimp-egger-981009-1.patch, gimp-egger-981010-1.patch
* plug-in/guillotine/guillotine.c: added the coordinates
of the split images from the original image to the title.
ie foo.jpg (0,0) for the image in the topleft.
* plug-in/script-fu/scripts/neon-logo.scm,
perspective-shadow.scm, predator.scm,rendermap.scm,
ripply-anim.scm, select_to_image.scm,swirltile.scm,
xach-effect.scm: updated scripts to use new script-fu stuff
wooo boy! a big un!
in testing this, it looks like some of the po files are busted.
but the code stuff seems okay.
-adrian
1998-10-15 07:23:52 +08:00
fatal_error ( _ ( " gradient_fill_region(): unknown repeat mode %d " ) ,
1997-11-25 06:05:25 +08:00
( int ) repeat ) ;
break ;
}
/* Initialize render data */
rbd . offset = offset ;
rbd . sx = sx ;
rbd . sy = sy ;
rbd . blend_mode = blend_mode ;
rbd . gradient_type = gradient_type ;
/* Render the gradient! */
if ( supersample )
{
/* Initialize put pixel data */
ppd . PR = PR ;
ppd . row_data = g_malloc ( width * PR - > bytes ) ;
ppd . bytes = PR - > bytes ;
ppd . width = width ;
/* Render! */
adaptive_supersample_area ( 0 , 0 , ( width - 1 ) , ( height - 1 ) ,
max_depth , threshold ,
gradient_render_pixel , & rbd ,
gradient_put_pixel , & ppd ,
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
progress_callback , progress_data ) ;
1997-11-25 06:05:25 +08:00
/* Clean up */
g_free ( ppd . row_data ) ;
}
else
{
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
int max_progress = PR - > w * PR - > h ;
int progress = 0 ;
1997-11-25 06:05:25 +08:00
for ( pr = pixel_regions_register ( 1 , PR ) ; pr ! = NULL ; pr = pixel_regions_process ( pr ) )
{
data = PR - > data ;
endx = PR - > x + PR - > w ;
endy = PR - > y + PR - > h ;
for ( y = PR - > y ; y < endy ; y + + )
for ( x = PR - > x ; x < endx ; x + + )
{
gradient_render_pixel ( x , y , & color , & rbd ) ;
if ( PR - > bytes > = 3 )
{
* data + + = color . r * 255.0 ;
* data + + = color . g * 255.0 ;
* data + + = color . b * 255.0 ;
* data + + = color . a * 255.0 ;
}
else
{
/* Convert to grayscale */
* data + + = 255.0 * ( 0.30 * color . r +
0.59 * color . g +
0.11 * color . b ) ;
* data + + = color . a * 255.0 ;
}
}
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
progress + = PR - > w * PR - > h ;
if ( progress_callback )
( * progress_callback ) ( 0 , max_progress , progress , progress_data ) ;
1997-11-25 06:05:25 +08:00
}
}
}
static void
calc_rgb_to_hsv ( double * r , double * g , double * b )
{
double red , green , blue ;
double h , s , v ;
double min , max ;
double delta ;
red = * r ;
green = * g ;
blue = * b ;
h = 0.0 ; /* Shut up -Wall */
if ( red > green )
{
if ( red > blue )
max = red ;
else
max = blue ;
if ( green < blue )
min = green ;
else
min = blue ;
}
else
{
if ( green > blue )
max = green ;
else
max = blue ;
if ( red < blue )
min = red ;
else
min = blue ;
}
v = max ;
if ( max ! = 0.0 )
s = ( max - min ) / max ;
else
s = 0.0 ;
if ( s = = 0.0 )
h = 0.0 ;
else
{
delta = max - min ;
if ( red = = max )
h = ( green - blue ) / delta ;
else if ( green = = max )
h = 2 + ( blue - red ) / delta ;
else if ( blue = = max )
h = 4 + ( red - green ) / delta ;
h / = 6.0 ;
if ( h < 0.0 )
h + = 1.0 ;
else if ( h > 1.0 )
h - = 1.0 ;
}
* r = h ;
* g = s ;
* b = v ;
}
static void
calc_hsv_to_rgb ( double * h , double * s , double * v )
{
double hue , saturation , value ;
double f , p , q , t ;
if ( * s = = 0.0 )
{
* h = * v ;
* s = * v ;
* v = * v ; /* heh */
}
else
{
hue = * h * 6.0 ;
saturation = * s ;
value = * v ;
if ( hue = = 6.0 )
hue = 0.0 ;
f = hue - ( int ) hue ;
p = value * ( 1.0 - saturation ) ;
q = value * ( 1.0 - saturation * f ) ;
t = value * ( 1.0 - saturation * ( 1.0 - f ) ) ;
switch ( ( int ) hue )
{
case 0 :
* h = value ;
* s = t ;
* v = p ;
break ;
case 1 :
* h = q ;
* s = value ;
* v = p ;
break ;
case 2 :
* h = p ;
* s = value ;
* v = t ;
break ;
case 3 :
* h = p ;
* s = q ;
* v = value ;
break ;
case 4 :
* h = t ;
* s = p ;
* v = value ;
break ;
case 5 :
* h = value ;
* s = p ;
* v = q ;
break ;
}
}
}
/****************************/
/* Global blend functions */
/****************************/
Tool *
tools_new_blend ( )
{
Tool * tool ;
BlendTool * private ;
if ( ! blend_options )
blend_options = create_blend_options ( ) ;
tool = ( Tool * ) g_malloc ( sizeof ( Tool ) ) ;
private = ( BlendTool * ) g_malloc ( sizeof ( BlendTool ) ) ;
private - > core = draw_core_new ( blend_draw ) ;
tool - > type = BLEND ;
tool - > state = INACTIVE ;
tool - > scroll_lock = 1 ; /* Disallow scrolling */
tool - > auto_snap_to = TRUE ;
tool - > private = private ;
tool - > button_press_func = blend_button_press ;
tool - > button_release_func = blend_button_release ;
tool - > motion_func = blend_motion ;
tool - > arrow_keys_func = standard_arrow_keys_func ;
tool - > cursor_update_func = blend_cursor_update ;
tool - > control_func = blend_control ;
1998-03-31 15:23:50 +08:00
tool - > preserve = TRUE ;
1997-11-25 06:05:25 +08:00
return tool ;
}
void
tools_free_blend ( Tool * tool )
{
BlendTool * blend_tool ;
blend_tool = ( BlendTool * ) tool - > private ;
if ( tool - > state = = ACTIVE )
draw_core_stop ( blend_tool - > core , tool ) ;
draw_core_free ( blend_tool - > core ) ;
/* free the distance map data if it exists */
if ( distR . tiles )
tile_manager_destroy ( distR . tiles ) ;
distR . tiles = NULL ;
g_free ( blend_tool ) ;
}
/* The blend procedure definition */
ProcArg blend_args [ ] =
{
{ PDB_DRAWABLE ,
" drawable " ,
1998-12-16 08:37:09 +08:00
" The affected drawable "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_INT32 ,
" blend_mode " ,
1998-12-16 08:37:09 +08:00
" The type of blend: { FG-BG-RGB (0), FG-BG-HSV (1), FG-TRANS (2), CUSTOM (3) } "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_INT32 ,
" paint_mode " ,
1998-12-16 08:37:09 +08:00
" the paint application mode: { NORMAL (0), DISSOLVE (1), BEHIND (2), MULTIPLY/BURN (3), SCREEN (4), OVERLAY (5) DIFFERENCE (6), ADDITION (7), SUBTRACT (8), DARKEN-ONLY (9), LIGHTEN-ONLY (10), HUE (11), SATURATION (12), COLOR (13), VALUE (14), DIVIDE/DODGE (15) } "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_INT32 ,
" gradient_type " ,
1999-01-05 07:56:37 +08:00
" The type of gradient: { LINEAR (0), BILINEAR (1), RADIAL (2), SQUARE (3), CONICAL-SYMMETRIC (4), CONICAL-ASYMMETRIC (5), SHAPEBURST-ANGULAR (6), SHAPEBURST-SPHERICAL (7), SHAPEBURST-DIMPLED (8), SPIRAL-CLOCKWISE(9), SPRIAL-ANTICLOCKWISE(10) } "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_FLOAT ,
" opacity " ,
1998-12-16 08:37:09 +08:00
" The opacity of the final blend (0 <= opacity <= 100) "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_FLOAT ,
" offset " ,
1998-12-16 08:37:09 +08:00
" Offset relates to the starting and ending coordinates specified for the blend. This parameter is mode depndent (0 <= offset) "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_INT32 ,
" repeat " ,
1998-12-16 08:37:09 +08:00
" Repeat mode: { REPEAT-NONE (0), REPEAT-SAWTOOTH (1), REPEAT-TRIANGULAR (2) } "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_INT32 ,
" supersample " ,
1998-12-16 08:37:09 +08:00
" Do adaptive supersampling (true / false) "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_INT32 ,
" max_depth " ,
1998-12-16 08:37:09 +08:00
" Maximum recursion levels for supersampling "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_FLOAT ,
" threshold " ,
1998-12-16 08:37:09 +08:00
" Supersampling threshold "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_FLOAT ,
" x1 " ,
1998-12-16 08:37:09 +08:00
" The x coordinate of this blend's starting point "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_FLOAT ,
" y1 " ,
1998-12-16 08:37:09 +08:00
" The y coordinate of this blend's starting point "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_FLOAT ,
" x2 " ,
1998-12-16 08:37:09 +08:00
" The x coordinate of this blend's ending point "
1997-11-25 06:05:25 +08:00
} ,
{ PDB_FLOAT ,
" y2 " ,
1998-12-16 08:37:09 +08:00
" The y coordinate of this blend's ending point "
1997-11-25 06:05:25 +08:00
}
} ;
ProcRecord blend_proc =
{
" gimp_blend " ,
1998-12-16 08:37:09 +08:00
" Blend between the starting and ending coordinates with the specified blend mode and gradient type. " ,
" This tool requires information on the paint application mode, the blend mode, and the gradient type. It creates the specified variety of blend using the starting and ending coordinates as defined for each gradient type. " ,
1997-11-25 06:05:25 +08:00
" Spencer Kimball & Peter Mattis & Federico Mena Quintero " ,
" Spencer Kimball & Peter Mattis & Federico Mena Quintero " ,
" 1995-1996 " ,
PDB_INTERNAL ,
/* Input arguments */
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
14 ,
1997-11-25 06:05:25 +08:00
blend_args ,
/* Output arguments */
0 ,
NULL ,
/* Exec method */
{ { blend_invoker } } ,
} ;
static Argument *
blend_invoker ( Argument * args )
{
int success = TRUE ;
GImage * gimage ;
1998-01-22 15:02:57 +08:00
GimpDrawable * drawable ;
1997-11-25 06:05:25 +08:00
BlendMode blend_mode ;
int paint_mode ;
GradientType gradient_type ;
double opacity ;
double offset ;
RepeatMode repeat ;
int supersample ;
int max_depth ;
double threshold ;
double x1 , y1 ;
double x2 , y2 ;
int int_value ;
double fp_value ;
1998-01-22 15:02:57 +08:00
drawable = NULL ;
1997-11-25 06:05:25 +08:00
blend_mode = FG_BG_RGB_MODE ;
paint_mode = NORMAL_MODE ;
gradient_type = Linear ;
opacity = 100.0 ;
offset = 0.0 ;
repeat = REPEAT_NONE ;
supersample = FALSE ;
max_depth = 0 ;
threshold = 0.0 ;
/* the drawable */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
int_value = args [ 0 ] . value . pdb_int ;
1998-01-22 15:02:57 +08:00
drawable = drawable_get_ID ( int_value ) ;
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
if ( drawable = = NULL )
1997-11-25 06:05:25 +08:00
success = FALSE ;
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
else
gimage = drawable_gimage ( drawable ) ;
1997-11-25 06:05:25 +08:00
}
/* blend mode */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
int_value = args [ 1 ] . value . pdb_int ;
1999-01-05 07:56:37 +08:00
if ( int_value > = 0 & & int_value < BLEND_MODE_LAST )
blend_mode = ( BlendMode ) int_value ;
else
success = FALSE ;
1997-11-25 06:05:25 +08:00
}
/* paint mode */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
int_value = args [ 2 ] . value . pdb_int ;
1998-11-15 20:58:37 +08:00
if ( int_value > = NORMAL_MODE & & int_value < = DIVIDE_MODE )
1997-11-25 06:05:25 +08:00
paint_mode = int_value ;
else
success = FALSE ;
}
/* gradient type */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
int_value = args [ 3 ] . value . pdb_int ;
1999-01-05 07:56:37 +08:00
if ( int_value > = 0 & & int_value < GradientTypeLast )
gradient_type = ( GradientType ) int_value ;
else
success = FALSE ;
1997-11-25 06:05:25 +08:00
}
/* opacity */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
fp_value = args [ 4 ] . value . pdb_float ;
1997-11-25 06:05:25 +08:00
if ( fp_value > = 0.0 & & fp_value < = 100.0 )
opacity = fp_value ;
else
success = FALSE ;
}
/* offset */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
fp_value = args [ 5 ] . value . pdb_float ;
1997-11-25 06:05:25 +08:00
if ( fp_value > = 0.0 )
offset = fp_value ;
else
success = FALSE ;
}
/* repeat */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
int_value = args [ 6 ] . value . pdb_int ;
1999-01-05 07:56:37 +08:00
if ( int_value > = 0 & & int_value < REPEAT_LAST )
repeat = ( RepeatMode ) int_value ;
else
success = FALSE ;
1997-11-25 06:05:25 +08:00
}
/* supersampling */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
int_value = args [ 7 ] . value . pdb_int ;
1997-11-25 06:05:25 +08:00
supersample = ( int_value ? TRUE : FALSE ) ;
}
/* max_depth */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
int_value = args [ 8 ] . value . pdb_int ;
1997-11-25 06:05:25 +08:00
if ( ( ( int_value > = 1 ) & & ( int_value < = 9 ) ) | | ! supersample )
max_depth = int_value ;
else
success = FALSE ;
}
/* threshold */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
fp_value = args [ 9 ] . value . pdb_float ;
1997-11-25 06:05:25 +08:00
if ( ( ( fp_value > = 0.0 ) & & ( fp_value < = 4.0 ) ) | | ! supersample )
threshold = fp_value ;
else
success = FALSE ;
}
/* x1, y1, x2, y2 */
if ( success )
{
API-mega-break-it-all patch part one: removed the unnecessary PDB_IMAGE
* airbrush.c, blend.c, brightness_contrast.c, bucket_fill.c
by_color_select.c, channel_ops.c, clone.c, color_balance.c
color_picker.c, convolve.c, curves.c, desaturate.c, edit_cmds.c
equalize.c, eraser.c, flip_tool.c, fuzzy_select.c,
gimage_mask_cmds.c histogram_tool.c, hue_saturation.c, invert.c,
levels.c, pencil.c paintbrush.c, perspective_tool.c, posterize.c,
rotate_tool.c scale_tool.c, shear_tool.c, text_tool.c, threshold.c:
API-mega-break-it-all patch part one: removed the unnecessary
PDB_IMAGE argument from many functions.
Affected functions:
gimp_airbrush gimp_blend gimp_brightness_contrast gimp_bucket_fill
gimp_by_color_select gimp_channel_ops_offset gimp_clone gimp_color_balance
gimp_color_picker gimp_convolve gimp_curves_explicit gimp_curves_spline
gimp_desaturate gimp_edit_clear gimp_edit_copy gimp_edit_cut gimp_edit_fill
gimp_edit_paste gimp_edit_stroke gimp_equalize gimp_eraser
gimp_eraser_extended gimp_flip gimp_fuzzy_select gimp_histogram
gimp_hue_saturation gimp_invert gimp_levels gimp_paintbrush
gimp_paintbrush_extended gimp_pencil gimp_perspective gimp_posterize
gimp_rotate gimp_scale gimp_selection_float gimp_selection_layer_alpha
gimp_selection_load gimp_shear gimp_threshold
1998-11-14 04:40:00 +08:00
x1 = args [ 10 ] . value . pdb_float ;
y1 = args [ 11 ] . value . pdb_float ;
x2 = args [ 12 ] . value . pdb_float ;
y2 = args [ 13 ] . value . pdb_float ;
1997-11-25 06:05:25 +08:00
}
/* call the blend procedure */
if ( success )
{
1998-01-22 15:02:57 +08:00
blend ( gimage , drawable , blend_mode , paint_mode , gradient_type ,
Bit of a large checkin this - it's basically three things: 1 - GimpModules
Sun Jan 11 00:24:21 GMT 1999 Austin Donnelly <austin@greenend.org.uk>
Bit of a large checkin this - it's basically three things:
1 - GimpModules using gmodules to dynamically load and
initialise modules at gimp start of day.
2 - Color selectors now register themselves with a color
notebook.
3 - progress bars have been cleaned up a bit, so now have
progress indictations on all transform tool and gradient
fill operations. Not done bucket fill, but that seems to
be the next candidate.
New directories:
* modules/: new directory for dynamically loadable modules.
New files:
* modules/.cvsignore
* modules/Makefile.am
* modules/colorsel_gtk.c: GTK color selector wrapped up as a
color selector the gimp can use.
* app/gimpprogress.[ch]: progress bars within gimp core, either as
popups, or in the status bar. This is mainly code moved out
of plug-in.c
* app/color_notebook.[ch]: color selector notebook, implementing
very similar interface to color_select.h so it can be used as
a drop-in replacement for it.
* libgimp/color_selector.h: API color selectors need to implement
to become a page in the color_notebook.
* libgimp/gimpmodule.h: API gimp modules need to implement to be
initialised by gimp at start of day.
Modified files:
* Makefile.am: add modules/ to SUBDIRS
* libgimp/Makefile.am: install gimpmodule.h and color_selector.h
* app/gimprc.[ch]: recognise module-path variable.
* gimprc.in: set module-path variable to something sensible
(currently "${gimp_dir}/modules:${gimp_plugin_dir}/modules").
* app/Makefile.am: build color notebook and gimpprogress
* app/app_procs.c: register internal GIMP color selector with
color notebook.
* app/asupsample.c: call progress function less frequently for
better performance.
* app/asupsample.h: progress_func_t typedef moved to gimpprogress.h
* app/blend.c: make callbacks to a progress function
* app/color_area.c: use a color notebook rather than a color selector
* app/color_panel.c: ditto
* app/color_select.c: export color selector interface for notebook
* app/color_select.h: color_select_init() prototype
* app/flip_tool.c: flip the image every time, rather than every
second click.
* app/interface.c: move progress bar stuff out to
gimpprogress.c. Make the code actually work while we're at it.
* app/interface.h: move prototypes for progress functions out to
gimpprogress.h
* app/plug_in.c: load and initialise modules (if possible). Move
progress bar handling code out to gimpprogress.c
* app/plug_in.h: keep only a gimp_progress * for each plugin, not
a whole bunch of GtkWidgets.
* app/scale_tool.c
* app/rotate_tool.c
* app/shear_tool.c
* app/perspective_tool.c: progress bar during operation.
De-sensitise the dialog to discourage the user from running
two transforms in parallel.
* app/transform_core.c: recalculate grid coords when bounding box
changes. Only initialise the action area of the dialog once,
to avoid multiple "ok" / "reset" buttons appearing. Undraw
transform tool with correct matrix to get rid of handle
remains on screen. Call a progress function as we apply the
transform matrix. A few new i18n markups. Invalidate
floating selection marching ants after applying matrix.
* app/transform_core.h: transform_core_do() takes an optional
progress callback argument (and data).
* plug-ins/oilify/oilify.c: send progress bar updates after every
pixel region, not only if they processed a multiple of 5
pixels (which was quite unlikely, and therefore gave a jerky
progress indication).
1999-01-11 08:57:33 +08:00
opacity , offset , repeat , supersample , max_depth , threshold ,
x1 , y1 , x2 , y2 , NULL , NULL ) ;
1997-11-25 06:05:25 +08:00
}
return procedural_db_return_args ( & blend_proc , success ) ;
}