app/layer.c app/layers_dialog.c reviewed code in an attempt to fix the

2000-12-03  Sven Neumann  <sven@gimp.org>

	* app/layer.c
	* app/layers_dialog.c
	* plug-ins/common/jpeg.c: reviewed code in an attempt to fix the
	crash-on-jpeg-save. The only thing that I have changed (despite
	lots of indentation) is that we now connect the preview rewdraw
	using gtk_signal_connect_while_alive() which should keep gimp from
	trying to create previews of nonexistant drawables.

Updated german translation.
This commit is contained in:
Sven Neumann 2000-12-03 18:15:08 +00:00 committed by Sven Neumann
parent d7adc8ad08
commit 0d9382fb04
15 changed files with 2413 additions and 2059 deletions

View File

@ -1,3 +1,13 @@
2000-12-03 Sven Neumann <sven@gimp.org>
* app/layer.c
* app/layers_dialog.c
* plug-ins/common/jpeg.c: reviewed code in an attempt to fix the
crash-on-jpeg-save. The only thing that I have changed (despite
lots of indentation) is that we now connect the preview rewdraw
using gtk_signal_connect_while_alive() which should keep gimp from
trying to create previews of nonexistant drawables.
2000-12-03 Sven Neumann <sven@gimp.org> 2000-12-03 Sven Neumann <sven@gimp.org>
* libgimp/gimpunitmenu.c (gimp_unit_menu_new): set empty menu_items * libgimp/gimpunitmenu.c (gimp_unit_menu_new): set empty menu_items

View File

@ -97,7 +97,7 @@ gimp_layer_get_type (void)
static void static void
gimp_layer_class_init (GimpLayerClass *class) gimp_layer_class_init (GimpLayerClass *class)
{ {
GtkObjectClass *object_class; GtkObjectClass *object_class;
GimpDrawableClass *drawable_class; GimpDrawableClass *drawable_class;
object_class = (GtkObjectClass*) class; object_class = (GtkObjectClass*) class;
@ -210,9 +210,11 @@ transform_color (GImage *gimage,
GimpDrawable *drawable, GimpDrawable *drawable,
GimpImageBaseType type) GimpImageBaseType type)
{ {
int i, h; gint i;
unsigned char * s, * d; gint h;
void * pr; guchar *s;
guchar *d;
gpointer pr;
for (pr = pixel_regions_register (2, layerPR, bufPR); for (pr = pixel_regions_register (2, layerPR, bufPR);
pr != NULL; pr != NULL;
@ -252,7 +254,7 @@ layer_new (GimpImage *gimage,
gint opacity, gint opacity,
LayerModeEffects mode) LayerModeEffects mode)
{ {
Layer * layer; Layer *layer;
if (width == 0 || height == 0) if (width == 0 || height == 0)
{ {
@ -293,6 +295,7 @@ layer_ref (Layer *layer)
{ {
gtk_object_ref (GTK_OBJECT (layer)); gtk_object_ref (GTK_OBJECT (layer));
gtk_object_sink (GTK_OBJECT (layer)); gtk_object_sink (GTK_OBJECT (layer));
return layer; return layer;
} }
@ -306,23 +309,25 @@ Layer *
layer_copy (Layer *layer, layer_copy (Layer *layer,
gboolean add_alpha) gboolean add_alpha)
{ {
gchar * layer_name; gchar *layer_name;
Layer * new_layer; Layer *new_layer;
GimpImageType new_type; GimpImageType new_type;
gchar *ext; gchar *ext;
gint number; gint number;
gchar *name; gchar *name;
gint len; gint len;
PixelRegion srcPR, destPR; PixelRegion srcPR;
PixelRegion destPR;
/* formulate the new layer name */ /* formulate the new layer name */
name = layer_get_name (layer); name = layer_get_name (layer);
ext = strrchr (name, '#'); ext = strrchr (name, '#');
len = strlen (_("copy")); len = strlen (_("copy"));
if ((strlen(name) >= len && if ((strlen(name) >= len &&
strcmp (&name[strlen (name) - len], _("copy")) == 0) || strcmp (&name[strlen (name) - len], _("copy")) == 0) ||
(ext && (number = atoi (ext + 1)) > 0 && (ext && (number = atoi (ext + 1)) > 0 &&
((int) (log10 (number) + 1)) == strlen (ext + 1))) ((gint) (log10 (number) + 1)) == strlen (ext + 1)))
/* don't have redundant "copy"s */ /* don't have redundant "copy"s */
layer_name = g_strdup (name); layer_name = g_strdup (name);
else else
@ -424,8 +429,9 @@ layer_new_from_tiles (GimpImage *gimage,
gint opacity, gint opacity,
LayerModeEffects mode) LayerModeEffects mode)
{ {
Layer * new_layer; Layer *new_layer;
PixelRegion layerPR, bufPR; PixelRegion layerPR;
PixelRegion bufPR;
/* Function copies buffer to a layer /* Function copies buffer to a layer
* taking into consideration the possibility of transforming * taking into consideration the possibility of transforming
@ -452,11 +458,13 @@ layer_new_from_tiles (GimpImage *gimage,
/* Configure the pixel regions */ /* Configure the pixel regions */
pixel_region_init (&layerPR, GIMP_DRAWABLE (new_layer)->tiles, pixel_region_init (&layerPR, GIMP_DRAWABLE (new_layer)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE (new_layer)->width, GIMP_DRAWABLE (new_layer)->height, GIMP_DRAWABLE (new_layer)->width,
GIMP_DRAWABLE (new_layer)->height,
TRUE); TRUE);
pixel_region_init (&bufPR, tiles, pixel_region_init (&bufPR, tiles,
0, 0, 0, 0,
GIMP_DRAWABLE (new_layer)->width, GIMP_DRAWABLE (new_layer)->height, GIMP_DRAWABLE (new_layer)->width,
GIMP_DRAWABLE (new_layer)->height,
FALSE); FALSE);
if ((tiles->bpp == 4 && GIMP_DRAWABLE (new_layer)->type == RGBA_GIMAGE) || if ((tiles->bpp == 4 && GIMP_DRAWABLE (new_layer)->type == RGBA_GIMAGE) ||
@ -467,7 +475,7 @@ layer_new_from_tiles (GimpImage *gimage,
/* Transform the contents of the buf to the new_layer */ /* Transform the contents of the buf to the new_layer */
transform_color (gimage, &layerPR, &bufPR, GIMP_DRAWABLE (new_layer), transform_color (gimage, &layerPR, &bufPR, GIMP_DRAWABLE (new_layer),
(tiles->bpp == 4) ? RGB : GRAY); (tiles->bpp == 4) ? RGB : GRAY);
return new_layer; return new_layer;
} }
@ -488,7 +496,8 @@ layer_add_mask (Layer *layer,
drawable_update (GIMP_DRAWABLE(layer), drawable_update (GIMP_DRAWABLE(layer),
0, 0, 0, 0,
GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height); GIMP_DRAWABLE(layer)->width,
GIMP_DRAWABLE(layer)->height);
return layer->mask; return layer->mask;
} }
@ -497,12 +506,13 @@ LayerMask *
layer_create_mask (Layer *layer, layer_create_mask (Layer *layer,
AddMaskType add_mask_type) AddMaskType add_mask_type)
{ {
PixelRegion maskPR, layerPR; PixelRegion maskPR;
LayerMask *mask; PixelRegion layerPR;
gchar *mask_name; LayerMask *mask;
guchar black[3] = {0, 0, 0}; gchar *mask_name;
guchar white_mask = OPAQUE_OPACITY; guchar black[3] = {0, 0, 0};
guchar black_mask = TRANSPARENT_OPACITY; guchar white_mask = OPAQUE_OPACITY;
guchar black_mask = TRANSPARENT_OPACITY;
mask_name = g_strdup_printf (_("%s mask"), GIMP_DRAWABLE (layer)->name); mask_name = g_strdup_printf (_("%s mask"), GIMP_DRAWABLE (layer)->name);
@ -951,11 +961,15 @@ layer_scale (Layer *layer,
else else
{ {
new_offset_x = (gint)(((gdouble) new_width * new_offset_x = (gint)(((gdouble) new_width *
GIMP_DRAWABLE(layer)->offset_x / (gdouble) GIMP_DRAWABLE(layer)->width)); GIMP_DRAWABLE(layer)->offset_x /
(gdouble) GIMP_DRAWABLE(layer)->width));
new_offset_y = (gint)(((gdouble) new_height * new_offset_y = (gint)(((gdouble) new_height *
GIMP_DRAWABLE(layer)->offset_y / (gdouble) GIMP_DRAWABLE(layer)->height)); GIMP_DRAWABLE(layer)->offset_y /
(gdouble) GIMP_DRAWABLE(layer)->height));
} }
layer_scale_lowlevel (layer, new_width, new_height, new_offset_x, new_offset_y); layer_scale_lowlevel (layer,
new_width, new_height,
new_offset_x, new_offset_y);
} }
void void
@ -975,7 +989,7 @@ layer_resize (Layer *layer,
x1 = CLAMP (offx, 0, new_width); x1 = CLAMP (offx, 0, new_width);
y1 = CLAMP (offy, 0, new_height); y1 = CLAMP (offy, 0, new_height);
x2 = CLAMP ((offx + GIMP_DRAWABLE(layer)->width), 0, new_width); x2 = CLAMP ((offx + GIMP_DRAWABLE(layer)->width), 0, new_width);
y2 = CLAMP ((offy + GIMP_DRAWABLE(layer)->height), 0, new_height); y2 = CLAMP ((offy + GIMP_DRAWABLE(layer)->height), 0, new_height);
w = x2 - x1; w = x2 - x1;
h = y2 - y1; h = y2 - y1;
@ -1014,7 +1028,8 @@ layer_resize (Layer *layer,
FALSE); FALSE);
/* Allocate the new layer, configure dest region */ /* Allocate the new layer, configure dest region */
new_tiles = tile_manager_new (new_width, new_height, GIMP_DRAWABLE(layer)->bytes); new_tiles = tile_manager_new (new_width, new_height,
GIMP_DRAWABLE(layer)->bytes);
pixel_region_init (&destPR, new_tiles, pixel_region_init (&destPR, new_tiles,
0, 0, 0, 0,
new_width, new_height, new_width, new_height,
@ -1030,7 +1045,8 @@ layer_resize (Layer *layer,
else else
{ {
unsigned char bg[3]; unsigned char bg[3];
gimage_get_background (GIMP_DRAWABLE(layer)->gimage, GIMP_DRAWABLE(layer), bg); gimage_get_background (GIMP_DRAWABLE(layer)->gimage,
GIMP_DRAWABLE(layer), bg);
color_region (&destPR, bg); color_region (&destPR, bg);
} }
pixel_region_init (&destPR, new_tiles, pixel_region_init (&destPR, new_tiles,
@ -1203,7 +1219,8 @@ layer_pick_correlate (Layer *layer,
/* Otherwise, determine if the alpha value at /* Otherwise, determine if the alpha value at
* the given point is non-zero * the given point is non-zero
*/ */
tile = tile_manager_get_tile (GIMP_DRAWABLE(layer)->tiles, x, y, TRUE, FALSE); tile = tile_manager_get_tile (GIMP_DRAWABLE(layer)->tiles,
x, y, TRUE, FALSE);
val = * ((unsigned char*) tile_data_pointer (tile, val = * ((unsigned char*) tile_data_pointer (tile,
x % TILE_WIDTH, x % TILE_WIDTH,
@ -1212,7 +1229,8 @@ layer_pick_correlate (Layer *layer,
if (layer->mask) if (layer->mask)
{ {
unsigned char *ptr; unsigned char *ptr;
mask_tile = tile_manager_get_tile (GIMP_DRAWABLE(layer->mask)->tiles, x, y, TRUE, FALSE); mask_tile = tile_manager_get_tile (GIMP_DRAWABLE(layer->mask)->tiles,
x, y, TRUE, FALSE);
ptr = tile_data_pointer (mask_tile, x % TILE_WIDTH, y % TILE_HEIGHT); ptr = tile_data_pointer (mask_tile, x % TILE_WIDTH, y % TILE_HEIGHT);
val = val * (*ptr) / 255; val = val * (*ptr) / 255;
tile_release (mask_tile, FALSE); tile_release (mask_tile, FALSE);
@ -1287,26 +1305,27 @@ layer_preview_private (Layer *layer,
gint w, gint w,
gint h) gint h)
{ {
GImage *gimage; GImage *gimage;
TempBuf *preview_buf; TempBuf *preview_buf;
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
GimpImageBaseType type; GimpImageBaseType type;
gint bytes; gint bytes;
gint subsample; gint subsample;
TempBuf *ret_buf; TempBuf *ret_buf;
type = RGB; type = RGB;
bytes = 0; bytes = 0;
/* The easy way */ /* The easy way */
if (GIMP_DRAWABLE(layer)->preview_valid && if (GIMP_DRAWABLE (layer)->preview_valid &&
(ret_buf = gimp_preview_cache_get (&(GIMP_DRAWABLE(layer)->preview_cache), w,h))) (ret_buf =
gimp_preview_cache_get (&(GIMP_DRAWABLE (layer)->preview_cache), w, h)))
return ret_buf; return ret_buf;
/* The hard way */ /* The hard way */
else else
{ {
gimage = GIMP_DRAWABLE(layer)->gimage; gimage = GIMP_DRAWABLE (layer)->gimage;
switch (GIMP_DRAWABLE(layer)->type) switch (GIMP_DRAWABLE (layer)->type)
{ {
case RGB_GIMAGE: case RGBA_GIMAGE: case RGB_GIMAGE: case RGBA_GIMAGE:
type = RGB; type = RGB;
@ -1333,7 +1352,8 @@ layer_preview_private (Layer *layer,
pixel_region_init (&srcPR, GIMP_DRAWABLE(layer)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(layer)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height, GIMP_DRAWABLE(layer)->width,
GIMP_DRAWABLE(layer)->height,
FALSE); FALSE);
preview_buf = temp_buf_new (w, h, bytes, 0, 0, NULL); preview_buf = temp_buf_new (w, h, bytes, 0, 0, NULL);
@ -1351,7 +1371,8 @@ layer_preview_private (Layer *layer,
GIMP_DRAWABLE (layer)->preview_valid = TRUE; GIMP_DRAWABLE (layer)->preview_valid = TRUE;
gimp_preview_cache_add (&(GIMP_DRAWABLE (layer)->preview_cache), preview_buf); gimp_preview_cache_add (&(GIMP_DRAWABLE (layer)->preview_cache),
preview_buf);
return preview_buf; return preview_buf;
} }
@ -1386,11 +1407,11 @@ layer_mask_preview_private (Layer *layer,
gint w, gint w,
gint h) gint h)
{ {
TempBuf *preview_buf; TempBuf *preview_buf;
LayerMask *mask; LayerMask *mask;
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
gint subsample; gint subsample;
TempBuf *ret_buf; TempBuf *ret_buf;
mask = layer->mask; mask = layer->mask;
if (!mask) if (!mask)
@ -1398,7 +1419,8 @@ layer_mask_preview_private (Layer *layer,
/* The easy way */ /* The easy way */
if (GIMP_DRAWABLE(mask)->preview_valid && if (GIMP_DRAWABLE(mask)->preview_valid &&
(ret_buf = gimp_preview_cache_get (&(GIMP_DRAWABLE(mask)->preview_cache), w, h))) (ret_buf = gimp_preview_cache_get (&(GIMP_DRAWABLE(mask)->preview_cache),
w, h)))
return ret_buf; return ret_buf;
/* The hard way */ /* The hard way */
else else
@ -1413,7 +1435,8 @@ layer_mask_preview_private (Layer *layer,
pixel_region_init (&srcPR, GIMP_DRAWABLE(mask)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(mask)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(mask)->width, GIMP_DRAWABLE(mask)->height, GIMP_DRAWABLE(mask)->width,
GIMP_DRAWABLE(mask)->height,
FALSE); FALSE);
preview_buf = temp_buf_new (w, h, 1, 0, 0, NULL); preview_buf = temp_buf_new (w, h, 1, 0, 0, NULL);
@ -1424,7 +1447,7 @@ layer_mask_preview_private (Layer *layer,
destPR.rowstride = w * destPR.bytes; destPR.rowstride = w * destPR.bytes;
destPR.data = temp_buf_data (preview_buf); destPR.data = temp_buf_data (preview_buf);
layer_preview_scale (1 /* GRAY */, NULL, &srcPR, &destPR, subsample); layer_preview_scale (GRAY, NULL, &srcPR, &destPR, subsample);
if (!GIMP_DRAWABLE (mask)->preview_valid) if (!GIMP_DRAWABLE (mask)->preview_valid)
gimp_preview_cache_invalidate (&(GIMP_DRAWABLE (mask)->preview_cache)); gimp_preview_cache_invalidate (&(GIMP_DRAWABLE (mask)->preview_cache));
@ -1447,9 +1470,9 @@ layer_mask_preview (Layer *layer,
width <= PREVIEW_CACHE_PRIME_WIDTH && width <= PREVIEW_CACHE_PRIME_WIDTH &&
height <= PREVIEW_CACHE_PRIME_HEIGHT) height <= PREVIEW_CACHE_PRIME_HEIGHT)
{ {
TempBuf * tb = layer_mask_preview_private(layer, TempBuf * tb = layer_mask_preview_private (layer,
PREVIEW_CACHE_PRIME_WIDTH, PREVIEW_CACHE_PRIME_WIDTH,
PREVIEW_CACHE_PRIME_HEIGHT); PREVIEW_CACHE_PRIME_HEIGHT);
/* Save the 2nd call */ /* Save the 2nd call */
if (width == PREVIEW_CACHE_PRIME_WIDTH && if (width == PREVIEW_CACHE_PRIME_WIDTH &&
@ -1479,18 +1502,15 @@ layer_set_tattoo (const Layer *layer,
void void
layer_invalidate_previews (GimpImage *gimage) layer_invalidate_previews (GimpImage *gimage)
{ {
GSList * tmp; GSList *tmp;
Layer * layer; Layer *layer;
g_return_if_fail (gimage != NULL); g_return_if_fail (gimage != NULL);
tmp = gimage->layers; for (tmp = gimage->layers; tmp; tmp = g_slist_next (tmp))
while (tmp)
{ {
layer = (Layer *) tmp->data; layer = (Layer *) tmp->data;
gimp_drawable_invalidate_preview (GIMP_DRAWABLE(layer), TRUE); gimp_drawable_invalidate_preview (GIMP_DRAWABLE(layer), TRUE);
tmp = g_slist_next (tmp);
} }
} }
@ -1502,27 +1522,27 @@ layer_preview_scale (GimpImageBaseType type,
gint subsample) gint subsample)
{ {
#define EPSILON 0.000001 #define EPSILON 0.000001
guchar *src, *s; guchar *src, *s;
guchar *dest, *d; guchar *dest, *d;
gdouble *row, *r; gdouble *row, *r;
gint destwidth; gint destwidth;
gint src_row, src_col; gint src_row, src_col;
gint bytes, b; gint bytes, b;
gint width, height; gint width, height;
gint orig_width, orig_height; gint orig_width, orig_height;
gdouble x_rat, y_rat; gdouble x_rat, y_rat;
gdouble x_cum, y_cum; gdouble x_cum, y_cum;
gdouble x_last, y_last; gdouble x_last, y_last;
gdouble * x_frac, y_frac, tot_frac; gdouble *x_frac, y_frac, tot_frac;
gint i, j; gint i, j;
gint frac; gint frac;
gboolean advance_dest; gboolean advance_dest;
guchar rgb[MAX_CHANNELS]; guchar rgb[MAX_CHANNELS];
orig_width = srcPR->w / subsample; orig_width = srcPR->w / subsample;
orig_height = srcPR->h / subsample; orig_height = srcPR->h / subsample;
width = destPR->w; width = destPR->w;
height = destPR->h; height = destPR->h;
/* Some calculations... */ /* Some calculations... */
bytes = destPR->bytes; bytes = destPR->bytes;
@ -1568,7 +1588,12 @@ layer_preview_scale (GimpImageBaseType type,
y_cum = (double) src_row; y_cum = (double) src_row;
y_last = y_cum; y_last = y_cum;
pixel_region_get_row (srcPR, 0, src_row * subsample, orig_width * subsample, src, subsample); pixel_region_get_row (srcPR,
0,
src_row * subsample,
orig_width * subsample,
src,
subsample);
/* Scale the selected region */ /* Scale the selected region */
for (i = 0; i < height; ) for (i = 0; i < height; )
@ -1657,7 +1682,12 @@ layer_preview_scale (GimpImageBaseType type,
i++; i++;
} }
else else
pixel_region_get_row (srcPR, 0, src_row * subsample, orig_width * subsample, src, subsample); pixel_region_get_row (srcPR,
0,
src_row * subsample,
orig_width * subsample,
src,
subsample);
} }
/* free up temporary arrays */ /* free up temporary arrays */
@ -1688,8 +1718,8 @@ layer_mask_new (GimpImage *gimage,
gint opacity, gint opacity,
guchar *col) guchar *col)
{ {
LayerMask * layer_mask; LayerMask *layer_mask;
gint i; gint i;
layer_mask = gtk_type_new (gimp_layer_mask_get_type ()); layer_mask = gtk_type_new (gimp_layer_mask_get_type ());
@ -1721,12 +1751,13 @@ layer_mask_new (GimpImage *gimage,
LayerMask * LayerMask *
layer_mask_copy (LayerMask *layer_mask) layer_mask_copy (LayerMask *layer_mask)
{ {
gchar * layer_mask_name; gchar *layer_mask_name;
LayerMask * new_layer_mask; LayerMask *new_layer_mask;
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
/* formulate the new layer_mask name */ /* formulate the new layer_mask name */
layer_mask_name = g_strdup_printf (_("%s copy"), GIMP_DRAWABLE(layer_mask)->name); layer_mask_name = g_strdup_printf (_("%s copy"),
GIMP_DRAWABLE(layer_mask)->name);
/* allocate a new layer_mask object */ /* allocate a new layer_mask object */
new_layer_mask = layer_mask_new (GIMP_DRAWABLE(layer_mask)->gimage, new_layer_mask = layer_mask_new (GIMP_DRAWABLE(layer_mask)->gimage,
@ -1735,19 +1766,25 @@ layer_mask_copy (LayerMask *layer_mask)
layer_mask_name, layer_mask_name,
GIMP_CHANNEL(layer_mask)->opacity, GIMP_CHANNEL(layer_mask)->opacity,
GIMP_CHANNEL(layer_mask)->col); GIMP_CHANNEL(layer_mask)->col);
GIMP_DRAWABLE(new_layer_mask)->visible = GIMP_DRAWABLE(layer_mask)->visible; GIMP_DRAWABLE(new_layer_mask)->visible =
GIMP_DRAWABLE(new_layer_mask)->offset_x = GIMP_DRAWABLE(layer_mask)->offset_x; GIMP_DRAWABLE(layer_mask)->visible;
GIMP_DRAWABLE(new_layer_mask)->offset_y = GIMP_DRAWABLE(layer_mask)->offset_y; GIMP_DRAWABLE(new_layer_mask)->offset_x =
GIMP_CHANNEL(new_layer_mask)->show_masked = GIMP_CHANNEL(layer_mask)->show_masked; GIMP_DRAWABLE(layer_mask)->offset_x;
GIMP_DRAWABLE(new_layer_mask)->offset_y =
GIMP_DRAWABLE(layer_mask)->offset_y;
GIMP_CHANNEL(new_layer_mask)->show_masked =
GIMP_CHANNEL(layer_mask)->show_masked;
/* copy the contents across layer masks */ /* copy the contents across layer masks */
pixel_region_init (&srcPR, GIMP_DRAWABLE(layer_mask)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(layer_mask)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(layer_mask)->width, GIMP_DRAWABLE(layer_mask)->height, GIMP_DRAWABLE(layer_mask)->width,
GIMP_DRAWABLE(layer_mask)->height,
FALSE); FALSE);
pixel_region_init (&destPR, GIMP_DRAWABLE(new_layer_mask)->tiles, pixel_region_init (&destPR, GIMP_DRAWABLE(new_layer_mask)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(layer_mask)->width, GIMP_DRAWABLE(layer_mask)->height, GIMP_DRAWABLE(layer_mask)->width,
GIMP_DRAWABLE(layer_mask)->height,
TRUE); TRUE);
copy_region (&srcPR, &destPR); copy_region (&srcPR, &destPR);
@ -1809,8 +1846,8 @@ channel_layer_mask (Channel *mask,
Layer *layer) Layer *layer)
{ {
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
guchar empty = 0; guchar empty = 0;
gint x1, y1, x2, y2; gint x1, y1, x2, y2;
/* push the current mask onto the undo stack */ /* push the current mask onto the undo stack */
channel_push_undo (mask); channel_push_undo (mask);
@ -1830,7 +1867,8 @@ channel_layer_mask (Channel *mask,
0, GIMP_DRAWABLE(mask)->height); 0, GIMP_DRAWABLE(mask)->height);
pixel_region_init (&srcPR, GIMP_DRAWABLE(layer->mask)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(layer->mask)->tiles,
(x1 - GIMP_DRAWABLE(layer)->offset_x), (y1 - GIMP_DRAWABLE(layer)->offset_y), (x1 - GIMP_DRAWABLE(layer)->offset_x),
(y1 - GIMP_DRAWABLE(layer)->offset_y),
(x2 - x1), (y2 - y1), (x2 - x1), (y2 - y1),
FALSE); FALSE);
pixel_region_init (&destPR, GIMP_DRAWABLE(mask)->tiles, pixel_region_init (&destPR, GIMP_DRAWABLE(mask)->tiles,

View File

@ -97,7 +97,7 @@ gimp_layer_get_type (void)
static void static void
gimp_layer_class_init (GimpLayerClass *class) gimp_layer_class_init (GimpLayerClass *class)
{ {
GtkObjectClass *object_class; GtkObjectClass *object_class;
GimpDrawableClass *drawable_class; GimpDrawableClass *drawable_class;
object_class = (GtkObjectClass*) class; object_class = (GtkObjectClass*) class;
@ -210,9 +210,11 @@ transform_color (GImage *gimage,
GimpDrawable *drawable, GimpDrawable *drawable,
GimpImageBaseType type) GimpImageBaseType type)
{ {
int i, h; gint i;
unsigned char * s, * d; gint h;
void * pr; guchar *s;
guchar *d;
gpointer pr;
for (pr = pixel_regions_register (2, layerPR, bufPR); for (pr = pixel_regions_register (2, layerPR, bufPR);
pr != NULL; pr != NULL;
@ -252,7 +254,7 @@ layer_new (GimpImage *gimage,
gint opacity, gint opacity,
LayerModeEffects mode) LayerModeEffects mode)
{ {
Layer * layer; Layer *layer;
if (width == 0 || height == 0) if (width == 0 || height == 0)
{ {
@ -293,6 +295,7 @@ layer_ref (Layer *layer)
{ {
gtk_object_ref (GTK_OBJECT (layer)); gtk_object_ref (GTK_OBJECT (layer));
gtk_object_sink (GTK_OBJECT (layer)); gtk_object_sink (GTK_OBJECT (layer));
return layer; return layer;
} }
@ -306,23 +309,25 @@ Layer *
layer_copy (Layer *layer, layer_copy (Layer *layer,
gboolean add_alpha) gboolean add_alpha)
{ {
gchar * layer_name; gchar *layer_name;
Layer * new_layer; Layer *new_layer;
GimpImageType new_type; GimpImageType new_type;
gchar *ext; gchar *ext;
gint number; gint number;
gchar *name; gchar *name;
gint len; gint len;
PixelRegion srcPR, destPR; PixelRegion srcPR;
PixelRegion destPR;
/* formulate the new layer name */ /* formulate the new layer name */
name = layer_get_name (layer); name = layer_get_name (layer);
ext = strrchr (name, '#'); ext = strrchr (name, '#');
len = strlen (_("copy")); len = strlen (_("copy"));
if ((strlen(name) >= len && if ((strlen(name) >= len &&
strcmp (&name[strlen (name) - len], _("copy")) == 0) || strcmp (&name[strlen (name) - len], _("copy")) == 0) ||
(ext && (number = atoi (ext + 1)) > 0 && (ext && (number = atoi (ext + 1)) > 0 &&
((int) (log10 (number) + 1)) == strlen (ext + 1))) ((gint) (log10 (number) + 1)) == strlen (ext + 1)))
/* don't have redundant "copy"s */ /* don't have redundant "copy"s */
layer_name = g_strdup (name); layer_name = g_strdup (name);
else else
@ -424,8 +429,9 @@ layer_new_from_tiles (GimpImage *gimage,
gint opacity, gint opacity,
LayerModeEffects mode) LayerModeEffects mode)
{ {
Layer * new_layer; Layer *new_layer;
PixelRegion layerPR, bufPR; PixelRegion layerPR;
PixelRegion bufPR;
/* Function copies buffer to a layer /* Function copies buffer to a layer
* taking into consideration the possibility of transforming * taking into consideration the possibility of transforming
@ -452,11 +458,13 @@ layer_new_from_tiles (GimpImage *gimage,
/* Configure the pixel regions */ /* Configure the pixel regions */
pixel_region_init (&layerPR, GIMP_DRAWABLE (new_layer)->tiles, pixel_region_init (&layerPR, GIMP_DRAWABLE (new_layer)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE (new_layer)->width, GIMP_DRAWABLE (new_layer)->height, GIMP_DRAWABLE (new_layer)->width,
GIMP_DRAWABLE (new_layer)->height,
TRUE); TRUE);
pixel_region_init (&bufPR, tiles, pixel_region_init (&bufPR, tiles,
0, 0, 0, 0,
GIMP_DRAWABLE (new_layer)->width, GIMP_DRAWABLE (new_layer)->height, GIMP_DRAWABLE (new_layer)->width,
GIMP_DRAWABLE (new_layer)->height,
FALSE); FALSE);
if ((tiles->bpp == 4 && GIMP_DRAWABLE (new_layer)->type == RGBA_GIMAGE) || if ((tiles->bpp == 4 && GIMP_DRAWABLE (new_layer)->type == RGBA_GIMAGE) ||
@ -467,7 +475,7 @@ layer_new_from_tiles (GimpImage *gimage,
/* Transform the contents of the buf to the new_layer */ /* Transform the contents of the buf to the new_layer */
transform_color (gimage, &layerPR, &bufPR, GIMP_DRAWABLE (new_layer), transform_color (gimage, &layerPR, &bufPR, GIMP_DRAWABLE (new_layer),
(tiles->bpp == 4) ? RGB : GRAY); (tiles->bpp == 4) ? RGB : GRAY);
return new_layer; return new_layer;
} }
@ -488,7 +496,8 @@ layer_add_mask (Layer *layer,
drawable_update (GIMP_DRAWABLE(layer), drawable_update (GIMP_DRAWABLE(layer),
0, 0, 0, 0,
GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height); GIMP_DRAWABLE(layer)->width,
GIMP_DRAWABLE(layer)->height);
return layer->mask; return layer->mask;
} }
@ -497,12 +506,13 @@ LayerMask *
layer_create_mask (Layer *layer, layer_create_mask (Layer *layer,
AddMaskType add_mask_type) AddMaskType add_mask_type)
{ {
PixelRegion maskPR, layerPR; PixelRegion maskPR;
LayerMask *mask; PixelRegion layerPR;
gchar *mask_name; LayerMask *mask;
guchar black[3] = {0, 0, 0}; gchar *mask_name;
guchar white_mask = OPAQUE_OPACITY; guchar black[3] = {0, 0, 0};
guchar black_mask = TRANSPARENT_OPACITY; guchar white_mask = OPAQUE_OPACITY;
guchar black_mask = TRANSPARENT_OPACITY;
mask_name = g_strdup_printf (_("%s mask"), GIMP_DRAWABLE (layer)->name); mask_name = g_strdup_printf (_("%s mask"), GIMP_DRAWABLE (layer)->name);
@ -951,11 +961,15 @@ layer_scale (Layer *layer,
else else
{ {
new_offset_x = (gint)(((gdouble) new_width * new_offset_x = (gint)(((gdouble) new_width *
GIMP_DRAWABLE(layer)->offset_x / (gdouble) GIMP_DRAWABLE(layer)->width)); GIMP_DRAWABLE(layer)->offset_x /
(gdouble) GIMP_DRAWABLE(layer)->width));
new_offset_y = (gint)(((gdouble) new_height * new_offset_y = (gint)(((gdouble) new_height *
GIMP_DRAWABLE(layer)->offset_y / (gdouble) GIMP_DRAWABLE(layer)->height)); GIMP_DRAWABLE(layer)->offset_y /
(gdouble) GIMP_DRAWABLE(layer)->height));
} }
layer_scale_lowlevel (layer, new_width, new_height, new_offset_x, new_offset_y); layer_scale_lowlevel (layer,
new_width, new_height,
new_offset_x, new_offset_y);
} }
void void
@ -975,7 +989,7 @@ layer_resize (Layer *layer,
x1 = CLAMP (offx, 0, new_width); x1 = CLAMP (offx, 0, new_width);
y1 = CLAMP (offy, 0, new_height); y1 = CLAMP (offy, 0, new_height);
x2 = CLAMP ((offx + GIMP_DRAWABLE(layer)->width), 0, new_width); x2 = CLAMP ((offx + GIMP_DRAWABLE(layer)->width), 0, new_width);
y2 = CLAMP ((offy + GIMP_DRAWABLE(layer)->height), 0, new_height); y2 = CLAMP ((offy + GIMP_DRAWABLE(layer)->height), 0, new_height);
w = x2 - x1; w = x2 - x1;
h = y2 - y1; h = y2 - y1;
@ -1014,7 +1028,8 @@ layer_resize (Layer *layer,
FALSE); FALSE);
/* Allocate the new layer, configure dest region */ /* Allocate the new layer, configure dest region */
new_tiles = tile_manager_new (new_width, new_height, GIMP_DRAWABLE(layer)->bytes); new_tiles = tile_manager_new (new_width, new_height,
GIMP_DRAWABLE(layer)->bytes);
pixel_region_init (&destPR, new_tiles, pixel_region_init (&destPR, new_tiles,
0, 0, 0, 0,
new_width, new_height, new_width, new_height,
@ -1030,7 +1045,8 @@ layer_resize (Layer *layer,
else else
{ {
unsigned char bg[3]; unsigned char bg[3];
gimage_get_background (GIMP_DRAWABLE(layer)->gimage, GIMP_DRAWABLE(layer), bg); gimage_get_background (GIMP_DRAWABLE(layer)->gimage,
GIMP_DRAWABLE(layer), bg);
color_region (&destPR, bg); color_region (&destPR, bg);
} }
pixel_region_init (&destPR, new_tiles, pixel_region_init (&destPR, new_tiles,
@ -1203,7 +1219,8 @@ layer_pick_correlate (Layer *layer,
/* Otherwise, determine if the alpha value at /* Otherwise, determine if the alpha value at
* the given point is non-zero * the given point is non-zero
*/ */
tile = tile_manager_get_tile (GIMP_DRAWABLE(layer)->tiles, x, y, TRUE, FALSE); tile = tile_manager_get_tile (GIMP_DRAWABLE(layer)->tiles,
x, y, TRUE, FALSE);
val = * ((unsigned char*) tile_data_pointer (tile, val = * ((unsigned char*) tile_data_pointer (tile,
x % TILE_WIDTH, x % TILE_WIDTH,
@ -1212,7 +1229,8 @@ layer_pick_correlate (Layer *layer,
if (layer->mask) if (layer->mask)
{ {
unsigned char *ptr; unsigned char *ptr;
mask_tile = tile_manager_get_tile (GIMP_DRAWABLE(layer->mask)->tiles, x, y, TRUE, FALSE); mask_tile = tile_manager_get_tile (GIMP_DRAWABLE(layer->mask)->tiles,
x, y, TRUE, FALSE);
ptr = tile_data_pointer (mask_tile, x % TILE_WIDTH, y % TILE_HEIGHT); ptr = tile_data_pointer (mask_tile, x % TILE_WIDTH, y % TILE_HEIGHT);
val = val * (*ptr) / 255; val = val * (*ptr) / 255;
tile_release (mask_tile, FALSE); tile_release (mask_tile, FALSE);
@ -1287,26 +1305,27 @@ layer_preview_private (Layer *layer,
gint w, gint w,
gint h) gint h)
{ {
GImage *gimage; GImage *gimage;
TempBuf *preview_buf; TempBuf *preview_buf;
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
GimpImageBaseType type; GimpImageBaseType type;
gint bytes; gint bytes;
gint subsample; gint subsample;
TempBuf *ret_buf; TempBuf *ret_buf;
type = RGB; type = RGB;
bytes = 0; bytes = 0;
/* The easy way */ /* The easy way */
if (GIMP_DRAWABLE(layer)->preview_valid && if (GIMP_DRAWABLE (layer)->preview_valid &&
(ret_buf = gimp_preview_cache_get (&(GIMP_DRAWABLE(layer)->preview_cache), w,h))) (ret_buf =
gimp_preview_cache_get (&(GIMP_DRAWABLE (layer)->preview_cache), w, h)))
return ret_buf; return ret_buf;
/* The hard way */ /* The hard way */
else else
{ {
gimage = GIMP_DRAWABLE(layer)->gimage; gimage = GIMP_DRAWABLE (layer)->gimage;
switch (GIMP_DRAWABLE(layer)->type) switch (GIMP_DRAWABLE (layer)->type)
{ {
case RGB_GIMAGE: case RGBA_GIMAGE: case RGB_GIMAGE: case RGBA_GIMAGE:
type = RGB; type = RGB;
@ -1333,7 +1352,8 @@ layer_preview_private (Layer *layer,
pixel_region_init (&srcPR, GIMP_DRAWABLE(layer)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(layer)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height, GIMP_DRAWABLE(layer)->width,
GIMP_DRAWABLE(layer)->height,
FALSE); FALSE);
preview_buf = temp_buf_new (w, h, bytes, 0, 0, NULL); preview_buf = temp_buf_new (w, h, bytes, 0, 0, NULL);
@ -1351,7 +1371,8 @@ layer_preview_private (Layer *layer,
GIMP_DRAWABLE (layer)->preview_valid = TRUE; GIMP_DRAWABLE (layer)->preview_valid = TRUE;
gimp_preview_cache_add (&(GIMP_DRAWABLE (layer)->preview_cache), preview_buf); gimp_preview_cache_add (&(GIMP_DRAWABLE (layer)->preview_cache),
preview_buf);
return preview_buf; return preview_buf;
} }
@ -1386,11 +1407,11 @@ layer_mask_preview_private (Layer *layer,
gint w, gint w,
gint h) gint h)
{ {
TempBuf *preview_buf; TempBuf *preview_buf;
LayerMask *mask; LayerMask *mask;
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
gint subsample; gint subsample;
TempBuf *ret_buf; TempBuf *ret_buf;
mask = layer->mask; mask = layer->mask;
if (!mask) if (!mask)
@ -1398,7 +1419,8 @@ layer_mask_preview_private (Layer *layer,
/* The easy way */ /* The easy way */
if (GIMP_DRAWABLE(mask)->preview_valid && if (GIMP_DRAWABLE(mask)->preview_valid &&
(ret_buf = gimp_preview_cache_get (&(GIMP_DRAWABLE(mask)->preview_cache), w, h))) (ret_buf = gimp_preview_cache_get (&(GIMP_DRAWABLE(mask)->preview_cache),
w, h)))
return ret_buf; return ret_buf;
/* The hard way */ /* The hard way */
else else
@ -1413,7 +1435,8 @@ layer_mask_preview_private (Layer *layer,
pixel_region_init (&srcPR, GIMP_DRAWABLE(mask)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(mask)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(mask)->width, GIMP_DRAWABLE(mask)->height, GIMP_DRAWABLE(mask)->width,
GIMP_DRAWABLE(mask)->height,
FALSE); FALSE);
preview_buf = temp_buf_new (w, h, 1, 0, 0, NULL); preview_buf = temp_buf_new (w, h, 1, 0, 0, NULL);
@ -1424,7 +1447,7 @@ layer_mask_preview_private (Layer *layer,
destPR.rowstride = w * destPR.bytes; destPR.rowstride = w * destPR.bytes;
destPR.data = temp_buf_data (preview_buf); destPR.data = temp_buf_data (preview_buf);
layer_preview_scale (1 /* GRAY */, NULL, &srcPR, &destPR, subsample); layer_preview_scale (GRAY, NULL, &srcPR, &destPR, subsample);
if (!GIMP_DRAWABLE (mask)->preview_valid) if (!GIMP_DRAWABLE (mask)->preview_valid)
gimp_preview_cache_invalidate (&(GIMP_DRAWABLE (mask)->preview_cache)); gimp_preview_cache_invalidate (&(GIMP_DRAWABLE (mask)->preview_cache));
@ -1447,9 +1470,9 @@ layer_mask_preview (Layer *layer,
width <= PREVIEW_CACHE_PRIME_WIDTH && width <= PREVIEW_CACHE_PRIME_WIDTH &&
height <= PREVIEW_CACHE_PRIME_HEIGHT) height <= PREVIEW_CACHE_PRIME_HEIGHT)
{ {
TempBuf * tb = layer_mask_preview_private(layer, TempBuf * tb = layer_mask_preview_private (layer,
PREVIEW_CACHE_PRIME_WIDTH, PREVIEW_CACHE_PRIME_WIDTH,
PREVIEW_CACHE_PRIME_HEIGHT); PREVIEW_CACHE_PRIME_HEIGHT);
/* Save the 2nd call */ /* Save the 2nd call */
if (width == PREVIEW_CACHE_PRIME_WIDTH && if (width == PREVIEW_CACHE_PRIME_WIDTH &&
@ -1479,18 +1502,15 @@ layer_set_tattoo (const Layer *layer,
void void
layer_invalidate_previews (GimpImage *gimage) layer_invalidate_previews (GimpImage *gimage)
{ {
GSList * tmp; GSList *tmp;
Layer * layer; Layer *layer;
g_return_if_fail (gimage != NULL); g_return_if_fail (gimage != NULL);
tmp = gimage->layers; for (tmp = gimage->layers; tmp; tmp = g_slist_next (tmp))
while (tmp)
{ {
layer = (Layer *) tmp->data; layer = (Layer *) tmp->data;
gimp_drawable_invalidate_preview (GIMP_DRAWABLE(layer), TRUE); gimp_drawable_invalidate_preview (GIMP_DRAWABLE(layer), TRUE);
tmp = g_slist_next (tmp);
} }
} }
@ -1502,27 +1522,27 @@ layer_preview_scale (GimpImageBaseType type,
gint subsample) gint subsample)
{ {
#define EPSILON 0.000001 #define EPSILON 0.000001
guchar *src, *s; guchar *src, *s;
guchar *dest, *d; guchar *dest, *d;
gdouble *row, *r; gdouble *row, *r;
gint destwidth; gint destwidth;
gint src_row, src_col; gint src_row, src_col;
gint bytes, b; gint bytes, b;
gint width, height; gint width, height;
gint orig_width, orig_height; gint orig_width, orig_height;
gdouble x_rat, y_rat; gdouble x_rat, y_rat;
gdouble x_cum, y_cum; gdouble x_cum, y_cum;
gdouble x_last, y_last; gdouble x_last, y_last;
gdouble * x_frac, y_frac, tot_frac; gdouble *x_frac, y_frac, tot_frac;
gint i, j; gint i, j;
gint frac; gint frac;
gboolean advance_dest; gboolean advance_dest;
guchar rgb[MAX_CHANNELS]; guchar rgb[MAX_CHANNELS];
orig_width = srcPR->w / subsample; orig_width = srcPR->w / subsample;
orig_height = srcPR->h / subsample; orig_height = srcPR->h / subsample;
width = destPR->w; width = destPR->w;
height = destPR->h; height = destPR->h;
/* Some calculations... */ /* Some calculations... */
bytes = destPR->bytes; bytes = destPR->bytes;
@ -1568,7 +1588,12 @@ layer_preview_scale (GimpImageBaseType type,
y_cum = (double) src_row; y_cum = (double) src_row;
y_last = y_cum; y_last = y_cum;
pixel_region_get_row (srcPR, 0, src_row * subsample, orig_width * subsample, src, subsample); pixel_region_get_row (srcPR,
0,
src_row * subsample,
orig_width * subsample,
src,
subsample);
/* Scale the selected region */ /* Scale the selected region */
for (i = 0; i < height; ) for (i = 0; i < height; )
@ -1657,7 +1682,12 @@ layer_preview_scale (GimpImageBaseType type,
i++; i++;
} }
else else
pixel_region_get_row (srcPR, 0, src_row * subsample, orig_width * subsample, src, subsample); pixel_region_get_row (srcPR,
0,
src_row * subsample,
orig_width * subsample,
src,
subsample);
} }
/* free up temporary arrays */ /* free up temporary arrays */
@ -1688,8 +1718,8 @@ layer_mask_new (GimpImage *gimage,
gint opacity, gint opacity,
guchar *col) guchar *col)
{ {
LayerMask * layer_mask; LayerMask *layer_mask;
gint i; gint i;
layer_mask = gtk_type_new (gimp_layer_mask_get_type ()); layer_mask = gtk_type_new (gimp_layer_mask_get_type ());
@ -1721,12 +1751,13 @@ layer_mask_new (GimpImage *gimage,
LayerMask * LayerMask *
layer_mask_copy (LayerMask *layer_mask) layer_mask_copy (LayerMask *layer_mask)
{ {
gchar * layer_mask_name; gchar *layer_mask_name;
LayerMask * new_layer_mask; LayerMask *new_layer_mask;
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
/* formulate the new layer_mask name */ /* formulate the new layer_mask name */
layer_mask_name = g_strdup_printf (_("%s copy"), GIMP_DRAWABLE(layer_mask)->name); layer_mask_name = g_strdup_printf (_("%s copy"),
GIMP_DRAWABLE(layer_mask)->name);
/* allocate a new layer_mask object */ /* allocate a new layer_mask object */
new_layer_mask = layer_mask_new (GIMP_DRAWABLE(layer_mask)->gimage, new_layer_mask = layer_mask_new (GIMP_DRAWABLE(layer_mask)->gimage,
@ -1735,19 +1766,25 @@ layer_mask_copy (LayerMask *layer_mask)
layer_mask_name, layer_mask_name,
GIMP_CHANNEL(layer_mask)->opacity, GIMP_CHANNEL(layer_mask)->opacity,
GIMP_CHANNEL(layer_mask)->col); GIMP_CHANNEL(layer_mask)->col);
GIMP_DRAWABLE(new_layer_mask)->visible = GIMP_DRAWABLE(layer_mask)->visible; GIMP_DRAWABLE(new_layer_mask)->visible =
GIMP_DRAWABLE(new_layer_mask)->offset_x = GIMP_DRAWABLE(layer_mask)->offset_x; GIMP_DRAWABLE(layer_mask)->visible;
GIMP_DRAWABLE(new_layer_mask)->offset_y = GIMP_DRAWABLE(layer_mask)->offset_y; GIMP_DRAWABLE(new_layer_mask)->offset_x =
GIMP_CHANNEL(new_layer_mask)->show_masked = GIMP_CHANNEL(layer_mask)->show_masked; GIMP_DRAWABLE(layer_mask)->offset_x;
GIMP_DRAWABLE(new_layer_mask)->offset_y =
GIMP_DRAWABLE(layer_mask)->offset_y;
GIMP_CHANNEL(new_layer_mask)->show_masked =
GIMP_CHANNEL(layer_mask)->show_masked;
/* copy the contents across layer masks */ /* copy the contents across layer masks */
pixel_region_init (&srcPR, GIMP_DRAWABLE(layer_mask)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(layer_mask)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(layer_mask)->width, GIMP_DRAWABLE(layer_mask)->height, GIMP_DRAWABLE(layer_mask)->width,
GIMP_DRAWABLE(layer_mask)->height,
FALSE); FALSE);
pixel_region_init (&destPR, GIMP_DRAWABLE(new_layer_mask)->tiles, pixel_region_init (&destPR, GIMP_DRAWABLE(new_layer_mask)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(layer_mask)->width, GIMP_DRAWABLE(layer_mask)->height, GIMP_DRAWABLE(layer_mask)->width,
GIMP_DRAWABLE(layer_mask)->height,
TRUE); TRUE);
copy_region (&srcPR, &destPR); copy_region (&srcPR, &destPR);
@ -1809,8 +1846,8 @@ channel_layer_mask (Channel *mask,
Layer *layer) Layer *layer)
{ {
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
guchar empty = 0; guchar empty = 0;
gint x1, y1, x2, y2; gint x1, y1, x2, y2;
/* push the current mask onto the undo stack */ /* push the current mask onto the undo stack */
channel_push_undo (mask); channel_push_undo (mask);
@ -1830,7 +1867,8 @@ channel_layer_mask (Channel *mask,
0, GIMP_DRAWABLE(mask)->height); 0, GIMP_DRAWABLE(mask)->height);
pixel_region_init (&srcPR, GIMP_DRAWABLE(layer->mask)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(layer->mask)->tiles,
(x1 - GIMP_DRAWABLE(layer)->offset_x), (y1 - GIMP_DRAWABLE(layer)->offset_y), (x1 - GIMP_DRAWABLE(layer)->offset_x),
(y1 - GIMP_DRAWABLE(layer)->offset_y),
(x2 - x1), (y2 - y1), (x2 - x1), (y2 - y1),
FALSE); FALSE);
pixel_region_init (&destPR, GIMP_DRAWABLE(mask)->tiles, pixel_region_init (&destPR, GIMP_DRAWABLE(mask)->tiles,

View File

@ -393,7 +393,8 @@ layers_dialog_create (void)
FALSE, FALSE, 2); FALSE, FALSE, 2);
gtk_widget_show (layersD->mode_option_menu); gtk_widget_show (layersD->mode_option_menu);
gimp_help_set_help_data (layersD->mode_option_menu, NULL, "#paint_mode_menu"); gimp_help_set_help_data (layersD->mode_option_menu,
NULL, "#paint_mode_menu");
layersD->preserve_trans = layersD->preserve_trans =
gtk_check_button_new_with_label (_("Keep Trans.")); gtk_check_button_new_with_label (_("Keep Trans."));
@ -589,12 +590,13 @@ layers_dialog_update (GimpImage* gimage)
/* Find the preview extents */ /* Find the preview extents */
layers_dialog_preview_extents (); layers_dialog_preview_extents ();
layersD->active_layer = NULL; layersD->active_layer = NULL;
layersD->active_channel = NULL; layersD->active_channel = NULL;
layersD->floating_sel = NULL; layersD->floating_sel = NULL;
item_list = NULL; for (list = gimage->layers, item_list = NULL;
for (list = gimage->layers; list; list = g_slist_next (list)) list;
list = g_slist_next (list))
{ {
/* create a layer list item */ /* create a layer list item */
layer = (Layer *) list->data; layer = (Layer *) list->data;
@ -668,8 +670,9 @@ layers_dialog_flush (void)
} }
/* Switch positions of items if necessary */ /* Switch positions of items if necessary */
pos = 0; for (list = gimage->layers, pos = 0;
for (list = gimage->layers; list; list = g_slist_next (list)) list;
list = g_slist_next (list))
{ {
layer = (Layer *) list->data; layer = (Layer *) list->data;
layers_dialog_position_layer (layer, pos++); layers_dialog_position_layer (layer, pos++);
@ -692,6 +695,7 @@ layers_dialog_flush (void)
gtk_container_foreach (GTK_CONTAINER (layersD->layer_list), gtk_container_foreach (GTK_CONTAINER (layersD->layer_list),
layer_widget_layer_flush, NULL); layer_widget_layer_flush, NULL);
} }
suspend_gimage_notify--; suspend_gimage_notify--;
} }
@ -719,19 +723,19 @@ render_preview (TempBuf *preview_buf,
gint height, gint height,
gint channel) gint channel)
{ {
guchar *src, *s; guchar *src, *s;
guchar *cb; guchar *cb;
guchar *buf; guchar *buf;
gint a; gint a;
gint i, j, b; gint i, j, b;
gint x1, y1, x2, y2; gint x1, y1, x2, y2;
gint rowstride; gint rowstride;
gint color_buf; gint color_buf;
gint color; gint color;
gint alpha; gint alpha;
gint has_alpha; gboolean has_alpha;
gint image_bytes; gint image_bytes;
gint offset; gint offset;
alpha = ALPHA_PIX; alpha = ALPHA_PIX;
@ -746,10 +750,10 @@ render_preview (TempBuf *preview_buf,
* 2) Color preview_bufs have bytes == {3, 4} * 2) Color preview_bufs have bytes == {3, 4}
* 3) If image is gray, then preview_buf should have bytes == {1, 2} * 3) If image is gray, then preview_buf should have bytes == {1, 2}
*/ */
color_buf = (GTK_PREVIEW (preview_widget)->type == GTK_PREVIEW_COLOR); color_buf = (GTK_PREVIEW (preview_widget)->type == GTK_PREVIEW_COLOR);
image_bytes = (color_buf) ? 3 : 1; image_bytes = (color_buf) ? 3 : 1;
has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4); has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4);
rowstride = preview_buf->width * preview_buf->bytes; rowstride = preview_buf->width * preview_buf->bytes;
/* Determine if the preview buf supplied is color /* Determine if the preview buf supplied is color
* Generally, if the bytes == {3, 4}, this is true. * Generally, if the bytes == {3, 4}, this is true.
@ -900,11 +904,11 @@ void
render_fs_preview (GtkWidget *widget, render_fs_preview (GtkWidget *widget,
GdkPixmap *pixmap) GdkPixmap *pixmap)
{ {
gint w, h; gint w, h;
gint x1, y1, x2, y2; gint x1, y1, x2, y2;
GdkPoint poly[6]; GdkPoint poly[6];
gint foldh, foldw; gint foldh, foldw;
gint i; gint i;
gdk_window_get_size (pixmap, &w, &h); gdk_window_get_size (pixmap, &w, &h);
@ -926,10 +930,11 @@ render_fs_preview (GtkWidget *widget,
poly[0].x = x1 + foldw; poly[0].y = y1; poly[0].x = x1 + foldw; poly[0].y = y1;
poly[1].x = x1 + foldw; poly[1].y = y1 + foldh; poly[1].x = x1 + foldw; poly[1].y = y1 + foldh;
poly[2].x = x1; poly[2].y = y1 + foldh; poly[2].x = x1; poly[2].y = y1 + foldh;
poly[3].x = x1; poly[3].y = y2; poly[3].x = x1; poly[3].y = y2;
poly[4].x = x2; poly[4].y = y2; poly[4].x = x2; poly[4].y = y2;
poly[5].x = x2; poly[5].y = y1; poly[5].x = x2; poly[5].y = y1;
gdk_draw_polygon (pixmap, widget->style->white_gc, 1, poly, 6); gdk_draw_polygon (pixmap, widget->style->white_gc, 1, poly, 6);
gdk_draw_line (pixmap, widget->style->black_gc, gdk_draw_line (pixmap, widget->style->black_gc,
@ -940,6 +945,7 @@ render_fs_preview (GtkWidget *widget,
x2, y2, x2, y1); x2, y2, x2, y1);
gdk_draw_line (pixmap, widget->style->black_gc, gdk_draw_line (pixmap, widget->style->black_gc,
x1 + foldw, y1, x2, y1); x1 + foldw, y1, x2, y1);
for (i = 0; i < foldw; i++) for (i = 0; i < foldw; i++)
gdk_draw_line (pixmap, widget->style->black_gc, gdk_draw_line (pixmap, widget->style->black_gc,
x1 + i, y1 + foldh, x1 + i, (foldw == 1) ? y1 : x1 + i, y1 + foldh, x1 + i, (foldw == 1) ? y1 :
@ -965,16 +971,19 @@ layers_dialog_preview_extents (void)
/* Get the image width and height variables, based on the gimage */ /* Get the image width and height variables, based on the gimage */
if (gimage->width > gimage->height) if (gimage->width > gimage->height)
layersD->ratio = (double) preview_size / (double) gimage->width; layersD->ratio = (gdouble) preview_size / (gdouble) gimage->width;
else else
layersD->ratio = (double) preview_size / (double) gimage->height; layersD->ratio = (gdouble) preview_size / (gdouble) gimage->height;
if (preview_size) if (preview_size)
{ {
layersD->image_width = (gint) (layersD->ratio * gimage->width); layersD->image_width = (gint) (layersD->ratio * gimage->width);
layersD->image_height = (gint) (layersD->ratio * gimage->height); layersD->image_height = (gint) (layersD->ratio * gimage->height);
if (layersD->image_width < 1) layersD->image_width = 1;
if (layersD->image_height < 1) layersD->image_height = 1; if (layersD->image_width < 1)
layersD->image_width = 1;
if (layersD->image_height < 1)
layersD->image_height = 1;
} }
else else
{ {
@ -986,18 +995,18 @@ layers_dialog_preview_extents (void)
static void static void
layers_dialog_set_menu_sensitivity (void) layers_dialog_set_menu_sensitivity (void)
{ {
gboolean fs; /* floating sel */ gboolean fs; /* floating sel */
gboolean ac; /* active channel */ gboolean ac; /* active channel */
gboolean lm; /* layer mask */ gboolean lm; /* layer mask */
gboolean gimage; /* is there a gimage */ gboolean gimage; /* is there a gimage */
gboolean lp; /* layers present */ gboolean lp; /* layers present */
gboolean alpha; /* alpha channel present */ gboolean alpha; /* alpha channel present */
gboolean indexed; /* is indexed */ gboolean indexed; /* is indexed */
gint next_alpha; gint next_alpha;
GSList *list; GSList *list;
GSList *next; GSList *next;
GSList *prev; GSList *prev;
Layer *layer; Layer *layer;
lp = FALSE; lp = FALSE;
indexed = FALSE; indexed = FALSE;
@ -1108,7 +1117,7 @@ static void
layers_dialog_scroll_index (gint index) layers_dialog_scroll_index (gint index)
{ {
GtkAdjustment *adj; GtkAdjustment *adj;
gint item_height; gint item_height;
item_height = 6 + (preview_size ? preview_size : layer_height); item_height = 6 + (preview_size ? preview_size : layer_height);
adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (layersD->scrolled_win)); adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (layersD->scrolled_win));
@ -1126,6 +1135,7 @@ layers_dialog_scroll_index (gint index)
} }
/* Commented out because this piece of code produced strange segfaults /* Commented out because this piece of code produced strange segfaults
static gint static gint
layer_dialog_idle_set_active_layer_focus (gpointer data) layer_dialog_idle_set_active_layer_focus (gpointer data)
{ {
@ -1133,6 +1143,7 @@ layer_dialog_idle_set_active_layer_focus (gpointer data)
return FALSE; return FALSE;
} }
*/ */
static void static void
@ -1140,7 +1151,7 @@ layers_dialog_set_active_layer (Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GtkStateType state; GtkStateType state;
gint index; gint index;
layer_widget = layer_widget_get_ID (layer); layer_widget = layer_widget_get_ID (layer);
if (!layersD || !layer_widget) if (!layersD || !layer_widget)
@ -1174,7 +1185,7 @@ layers_dialog_unset_layer (Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GtkStateType state; GtkStateType state;
gint index; gint index;
layer_widget = layer_widget_get_ID (layer); layer_widget = layer_widget_get_ID (layer);
if (!layersD || !layer_widget) if (!layersD || !layer_widget)
@ -1199,8 +1210,8 @@ static void
layers_dialog_position_layer (Layer *layer, layers_dialog_position_layer (Layer *layer,
gint new_index) gint new_index)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GList *list = NULL; GList *list = NULL;
layer_widget = layer_widget_get_ID (layer); layer_widget = layer_widget_get_ID (layer);
if (!layersD || !layer_widget) if (!layersD || !layer_widget)
@ -1245,8 +1256,8 @@ layers_dialog_add_layer (Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GimpImage *gimage; GimpImage *gimage;
GList *item_list; GList *item_list;
gint position; gint position;
if (!layersD || !layer || !(gimage = layersD->gimage)) if (!layersD || !layer || !(gimage = layersD->gimage))
return; return;
@ -1266,7 +1277,7 @@ static void
layers_dialog_remove_layer (Layer *layer) layers_dialog_remove_layer (Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GList *list = NULL; GList *list = NULL;
layer_widget = layer_widget_get_ID (layer); layer_widget = layer_widget_get_ID (layer);
if (!layersD || !layer_widget) if (!layersD || !layer_widget)
@ -1372,7 +1383,8 @@ opacity_scale_update (GtkAdjustment *adjustment,
return; return;
/* add the 0.001 to insure there are no subtle rounding errors */ /* add the 0.001 to insure there are no subtle rounding errors */
opacity = (int) (adjustment->value * 2.55 + 0.001); opacity = (gint) (adjustment->value * 2.55 + 0.001);
if (layer->opacity != opacity) if (layer->opacity != opacity)
{ {
layer->opacity = opacity; layer->opacity = opacity;
@ -1587,7 +1599,7 @@ layers_dialog_new_layer_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GimpImage *gimage; GimpImage *gimage;
Layer *layer; Layer *layer;
if (!layersD || !(gimage = layersD->gimage)) if (!layersD || !(gimage = layersD->gimage))
return; return;
@ -1842,7 +1854,7 @@ layers_dialog_add_alpha_channel_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GimpImage *gimage; GimpImage *gimage;
Layer *layer; Layer *layer;
if (!layersD || if (!layersD ||
!(gimage = layersD->gimage) || !(gimage = layersD->gimage) ||
@ -1878,8 +1890,8 @@ layers_dialog_drag_new_layer_callback (GtkWidget *widget,
gint y, gint y,
guint time) guint time)
{ {
GtkWidget *src_widget; GtkWidget *src_widget;
gboolean return_val = FALSE; gboolean return_val = FALSE;
if ((src_widget = gtk_drag_get_source_widget (context))) if ((src_widget = gtk_drag_get_source_widget (context)))
{ {
@ -1893,8 +1905,8 @@ layers_dialog_drag_new_layer_callback (GtkWidget *widget,
{ {
Layer *new_layer; Layer *new_layer;
GimpImage *gimage; GimpImage *gimage;
gint width, height; gint width, height;
gint off_x, off_y; gint off_x, off_y;
gimage = layersD->gimage; gimage = layersD->gimage;
@ -1944,7 +1956,7 @@ layers_dialog_drag_duplicate_layer_callback (GtkWidget *widget,
guint time) guint time)
{ {
GtkWidget *src_widget; GtkWidget *src_widget;
gboolean return_val = FALSE; gboolean return_val = FALSE;
if ((src_widget = gtk_drag_get_source_widget (context))) if ((src_widget = gtk_drag_get_source_widget (context)))
{ {
@ -1976,7 +1988,7 @@ layers_dialog_drag_trashcan_callback (GtkWidget *widget,
guint time) guint time)
{ {
GtkWidget *src_widget; GtkWidget *src_widget;
gboolean return_val = FALSE; gboolean return_val = FALSE;
if ((src_widget = gtk_drag_get_source_widget (context))) if ((src_widget = gtk_drag_get_source_widget (context)))
{ {
@ -2017,7 +2029,7 @@ static LayerWidget *
layer_widget_get_ID (Layer *ID) layer_widget_get_ID (Layer *ID)
{ {
LayerWidget *lw; LayerWidget *lw;
GSList *list; GSList *list;
if (! layersD) if (! layersD)
return NULL; return NULL;
@ -2038,10 +2050,10 @@ layer_widget_create (GimpImage *gimage,
Layer *layer) Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GtkWidget *list_item; GtkWidget *list_item;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *alignment; GtkWidget *alignment;
list_item = gtk_list_item_new (); list_item = gtk_list_item_new ();
@ -2127,9 +2139,10 @@ layer_widget_create (GimpImage *gimage,
gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->layer_preview), gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->layer_preview),
layersD->image_width + 4, layersD->image_height + 4); layersD->image_width + 4, layersD->image_height + 4);
gtk_widget_set_events (layer_widget->layer_preview, PREVIEW_EVENT_MASK); gtk_widget_set_events (layer_widget->layer_preview, PREVIEW_EVENT_MASK);
gtk_signal_connect (GTK_OBJECT (layer_widget->layer_preview), "event", gtk_signal_connect_while_alive (GTK_OBJECT (layer_widget->layer_preview), "event",
GTK_SIGNAL_FUNC (layer_widget_preview_events), GTK_SIGNAL_FUNC (layer_widget_preview_events),
layer_widget); layer_widget,
GTK_OBJECT (layer));
gtk_object_set_user_data (GTK_OBJECT (layer_widget->layer_preview), gtk_object_set_user_data (GTK_OBJECT (layer_widget->layer_preview),
layer_widget); layer_widget);
gtk_container_add (GTK_CONTAINER (alignment), layer_widget->layer_preview); gtk_container_add (GTK_CONTAINER (alignment), layer_widget->layer_preview);
@ -2240,16 +2253,15 @@ layer_widget_drag_motion_callback (GtkWidget *widget,
gint y, gint y,
guint time) guint time)
{ {
LayerWidget *dest; LayerWidget *dest;
gint dest_index; gint dest_index;
GtkWidget *src_widget; GtkWidget *src_widget;
LayerWidget *src; LayerWidget *src;
gint src_index; gint src_index;
gint difference; gint difference;
GimpDropType drop_type = GIMP_DROP_NONE;
GimpDropType drop_type = GIMP_DROP_NONE; GdkDragAction drag_action = GDK_ACTION_DEFAULT;
GdkDragAction drag_action = GDK_ACTION_DEFAULT; gboolean return_val = FALSE;
gboolean return_val = FALSE;
dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
@ -2314,7 +2326,8 @@ layer_widget_drag_begin_callback (GtkWidget *widget,
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
gimp_dnd_set_drawable_preview_icon (widget, context, gimp_dnd_set_drawable_preview_icon (widget, context,
GIMP_DRAWABLE (layer_widget->layer)); GIMP_DRAWABLE (layer_widget->layer));
@ -2326,7 +2339,8 @@ layer_mask_drag_begin_callback (GtkWidget *widget,
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
gimp_dnd_set_drawable_preview_icon gimp_dnd_set_drawable_preview_icon
(widget, context, (widget, context,
@ -2362,15 +2376,14 @@ layer_widget_drag_drop_callback (GtkWidget *widget,
gint y, gint y,
guint time) guint time)
{ {
LayerWidget *dest; LayerWidget *dest;
gint dest_index; gint dest_index;
GtkWidget *src_widget; GtkWidget *src_widget;
LayerWidget *src; LayerWidget *src;
gint src_index; gint src_index;
gint difference; gint difference;
GimpDropType drop_type = GIMP_DROP_NONE;
GimpDropType drop_type = GIMP_DROP_NONE; gboolean return_val = FALSE;
gboolean return_val = FALSE;
dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
@ -2378,16 +2391,18 @@ layer_widget_drag_drop_callback (GtkWidget *widget,
layer_has_alpha (dest->layer) && layer_has_alpha (dest->layer) &&
(src_widget = gtk_drag_get_source_widget (context))) (src_widget = gtk_drag_get_source_widget (context)))
{ {
src src =
= (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget));
if (src && if (src &&
layer_has_alpha (src->layer) && layer_has_alpha (src->layer) &&
! layer_is_floating_sel (src->layer) && ! layer_is_floating_sel (src->layer) &&
src->layer == layersD->active_layer) src->layer == layersD->active_layer)
{ {
src_index = gimp_image_get_layer_index (layersD->gimage, src->layer); src_index =
dest_index = gimp_image_get_layer_index (layersD->gimage, dest->layer); gimp_image_get_layer_index (layersD->gimage, src->layer);
dest_index =
gimp_image_get_layer_index (layersD->gimage, dest->layer);
difference = dest_index - src_index; difference = dest_index - src_index;
@ -2441,7 +2456,8 @@ layer_widget_drag_leave_callback (GtkWidget *widget,
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
layer_widget->drop_type = GIMP_DROP_NONE; layer_widget->drop_type = GIMP_DROP_NONE;
} }
@ -2452,7 +2468,8 @@ layer_widget_drag_indicator_callback (GtkWidget *widget,
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
layer_widget_draw_drop_indicator (layer_widget, layer_widget->drop_type); layer_widget_draw_drop_indicator (layer_widget, layer_widget->drop_type);
} }
@ -2462,7 +2479,7 @@ layer_widget_draw_drop_indicator (LayerWidget *layer_widget,
GimpDropType drop_type) GimpDropType drop_type)
{ {
static GdkGC *gc = NULL; static GdkGC *gc = NULL;
gint y = 0; gint y = 0;
if (!gc) if (!gc)
{ {
@ -2534,15 +2551,15 @@ layer_widget_button_events (GtkWidget *widget,
GdkEvent *event, GdkEvent *event,
gpointer data) gpointer data)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GtkWidget *event_widget; GtkWidget *event_widget;
GdkEventButton *bevent; GdkEventButton *bevent;
gint return_val; gint return_val;
static gboolean button_down = FALSE; static gboolean button_down = FALSE;
static GtkWidget *click_widget = NULL; static GtkWidget *click_widget = NULL;
static gint old_state; static gint old_state;
static gint exclusive; static gint exclusive;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
return_val = FALSE; return_val = FALSE;
@ -2678,14 +2695,16 @@ layer_widget_preview_events (GtkWidget *widget,
GdkEventExpose *eevent; GdkEventExpose *eevent;
GdkEventButton *bevent; GdkEventButton *bevent;
GdkPixmap **pixmap; GdkPixmap **pixmap;
gboolean valid; gboolean valid;
gint preview_type; gint preview_type;
gint sx, sy, dx, dy, w, h; gint sx, sy, dx, dy, w, h;
pixmap = NULL; pixmap = NULL;
valid = FALSE; valid = FALSE;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
if (!GIMP_IS_DRAWABLE (layer_widget->layer)) if (!GIMP_IS_DRAWABLE (layer_widget->layer))
return FALSE; return FALSE;
@ -2704,7 +2723,8 @@ layer_widget_preview_events (GtkWidget *widget,
break; break;
case MASK_PREVIEW: case MASK_PREVIEW:
pixmap = &layer_widget->mask_pixmap; pixmap = &layer_widget->mask_pixmap;
valid = GIMP_DRAWABLE (layer_get_mask (layer_widget->layer))->preview_valid; valid =
GIMP_DRAWABLE (layer_get_mask (layer_widget->layer))->preview_valid;
break; break;
} }
@ -2808,19 +2828,23 @@ layer_widget_preview_events (GtkWidget *widget,
if ((w > 0) && (h > 0)) if ((w > 0) && (h > 0))
{ {
/* Expose events are optimzed away by GTK+ if the widget is not /*
visible. Therefore, previews not visible in the layers_dialog Expose events are optimzed away by GTK+ if the widget is not
are not redrawn when they invalidate. Later the preview gets visible. Therefore, previews not visible in the layers_dialog
validated by the image_preview in lc_dialog but is never are not redrawn when they invalidate. Later the preview gets
propagated to the layer_pixmap. We work around this by using an validated by the image_preview in lc_dialog but is never
additional flag "layer_pixmap_valid" so that the pixmap gets propagated to the layer_pixmap. We work around this by using an
updated once the preview scrolls into sight. additional flag "layer_pixmap_valid" so that the pixmap gets
We should probably do the same for all drawables (masks, updated once the preview scrolls into sight.
channels), but it is much more difficult to change one of these We should probably do the same for all drawables (masks,
when it's not visible. channels), but it is much more difficult to change one of these
*/ when it's not visible.
if (preview_type == LAYER_PREVIEW && ! layer_widget->layer_pixmap_valid) */
layer_widget_preview_redraw (layer_widget, preview_type); if (preview_type == LAYER_PREVIEW &&
! layer_widget->layer_pixmap_valid)
{
layer_widget_preview_redraw (layer_widget, preview_type);
}
gdk_draw_pixmap (widget->window, gdk_draw_pixmap (widget->window,
widget->style->black_gc, widget->style->black_gc,
@ -2845,9 +2869,10 @@ static void
layer_widget_boundary_redraw (LayerWidget *layer_widget, layer_widget_boundary_redraw (LayerWidget *layer_widget,
gint preview_type) gint preview_type)
{ {
GtkWidget *widget; GtkWidget *widget;
GdkGC *gc1, *gc2; GdkGC *gc1;
GtkStateType state; GdkGC *gc2;
GtkStateType state;
if (preview_type == LAYER_PREVIEW) if (preview_type == LAYER_PREVIEW)
widget = layer_widget->layer_preview; widget = layer_widget->layer_preview;
@ -2883,6 +2908,7 @@ layer_widget_boundary_redraw (LayerWidget *layer_widget,
layersD->green_gc = gdk_gc_new (widget->window); layersD->green_gc = gdk_gc_new (widget->window);
gdk_gc_set_foreground (layersD->green_gc, &green); gdk_gc_set_foreground (layersD->green_gc, &green);
} }
if (layersD->red_gc == NULL) if (layersD->red_gc == NULL)
{ {
GdkColor red; GdkColor red;
@ -2916,7 +2942,7 @@ layer_widget_preview_redraw (LayerWidget *layer_widget,
TempBuf *preview_buf; TempBuf *preview_buf;
GdkPixmap **pixmap; GdkPixmap **pixmap;
GtkWidget *widget; GtkWidget *widget;
gint offx, offy; gint offx, offy;
preview_buf = NULL; preview_buf = NULL;
pixmap = NULL; pixmap = NULL;
@ -2953,8 +2979,12 @@ layer_widget_preview_redraw (LayerWidget *layer_widget,
(gint) (layersD->ratio * GIMP_DRAWABLE (layer_widget->layer)->width); (gint) (layersD->ratio * GIMP_DRAWABLE (layer_widget->layer)->width);
layer_widget->height = layer_widget->height =
(gint) (layersD->ratio * GIMP_DRAWABLE (layer_widget->layer)->height); (gint) (layersD->ratio * GIMP_DRAWABLE (layer_widget->layer)->height);
if (layer_widget->width < 1) layer_widget->width = 1;
if (layer_widget->height < 1) layer_widget->height = 1; if (layer_widget->width < 1)
layer_widget->width = 1;
if (layer_widget->height < 1)
layer_widget->height = 1;
offx = (gint) (layersD->ratio * offx = (gint) (layersD->ratio *
GIMP_DRAWABLE (layer_widget->layer)->offset_x); GIMP_DRAWABLE (layer_widget->layer)->offset_x);
offy = (gint) (layersD->ratio * offy = (gint) (layersD->ratio *
@ -3005,15 +3035,15 @@ static void
layer_widget_no_preview_redraw (LayerWidget *layer_widget, layer_widget_no_preview_redraw (LayerWidget *layer_widget,
gint preview_type) gint preview_type)
{ {
GdkPixmap *pixmap; GdkPixmap *pixmap;
GdkPixmap **pixmap_normal; GdkPixmap **pixmap_normal;
GdkPixmap **pixmap_selected; GdkPixmap **pixmap_selected;
GdkPixmap **pixmap_insensitive; GdkPixmap **pixmap_insensitive;
GdkColor *color; GdkColor *color;
GtkWidget *widget; GtkWidget *widget;
GtkStateType state; GtkStateType state;
gchar *bits; gchar *bits;
gint width, height; gint width, height;
pixmap_normal = NULL; pixmap_normal = NULL;
pixmap_selected = NULL; pixmap_selected = NULL;
@ -3097,9 +3127,9 @@ layer_widget_no_preview_redraw (LayerWidget *layer_widget,
static void static void
layer_widget_eye_redraw (LayerWidget *layer_widget) layer_widget_eye_redraw (LayerWidget *layer_widget)
{ {
GdkPixmap *pixmap; GdkPixmap *pixmap;
GdkColor *color; GdkColor *color;
GtkStateType state; GtkStateType state;
state = layer_widget->list_item->state; state = layer_widget->list_item->state;
@ -3162,9 +3192,9 @@ layer_widget_eye_redraw (LayerWidget *layer_widget)
static void static void
layer_widget_linked_redraw (LayerWidget *layer_widget) layer_widget_linked_redraw (LayerWidget *layer_widget)
{ {
GdkPixmap *pixmap; GdkPixmap *pixmap;
GdkColor *color; GdkColor *color;
GtkStateType state; GtkStateType state;
state = layer_widget->list_item->state; state = layer_widget->list_item->state;
@ -3272,11 +3302,11 @@ layer_widget_layer_flush (GtkWidget *widget,
gpointer data) gpointer data)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
Layer *layer; Layer *layer;
gchar *name; gchar *name;
gchar *label_name; gchar *label_name;
gboolean update_layer_preview = FALSE; gboolean update_layer_preview = FALSE;
gboolean update_mask_preview = FALSE; gboolean update_mask_preview = FALSE;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
layer = layer_widget->layer; layer = layer_widget->layer;
@ -3354,7 +3384,8 @@ layer_widget_layer_flush (GtkWidget *widget,
if (layer_get_mask (layer)) if (layer_get_mask (layer))
{ {
update_mask_preview = (! GIMP_DRAWABLE (layer_get_mask (layer))->preview_valid); update_mask_preview =
(! GIMP_DRAWABLE (layer_get_mask (layer))->preview_valid);
if (layer->apply_mask != layer_widget->apply_mask) if (layer->apply_mask != layer_widget->apply_mask)
{ {
@ -3414,8 +3445,8 @@ new_layer_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
NewLayerOptions *options; NewLayerOptions *options;
Layer *layer; Layer *layer;
GimpImage *gimage; GimpImage *gimage;
options = (NewLayerOptions *) data; options = (NewLayerOptions *) data;
@ -3462,12 +3493,12 @@ static void
layers_dialog_new_layer_query (GimpImage* gimage) layers_dialog_new_layer_query (GimpImage* gimage)
{ {
NewLayerOptions *options; NewLayerOptions *options;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *table; GtkWidget *table;
GtkWidget *label; GtkWidget *label;
GtkObject *adjustment; GtkObject *adjustment;
GtkWidget *spinbutton; GtkWidget *spinbutton;
GtkWidget *frame; GtkWidget *frame;
/* The new options structure */ /* The new options structure */
options = g_new (NewLayerOptions, 1); options = g_new (NewLayerOptions, 1);
@ -3513,7 +3544,8 @@ layers_dialog_new_layer_query (GimpImage* gimage)
options->name_entry = gtk_entry_new (); options->name_entry = gtk_entry_new ();
gtk_widget_set_usize (options->name_entry, 75, 0); gtk_widget_set_usize (options->name_entry, 75, 0);
gtk_table_attach_defaults (GTK_TABLE (table), options->name_entry, 1, 2, 0, 1); gtk_table_attach_defaults (GTK_TABLE (table),
options->name_entry, 1, 2, 0, 1);
gtk_entry_set_text (GTK_ENTRY (options->name_entry), gtk_entry_set_text (GTK_ENTRY (options->name_entry),
(layer_name ? layer_name : _("New Layer"))); (layer_name ? layer_name : _("New Layer")));
gtk_widget_show (options->name_entry); gtk_widget_show (options->name_entry);
@ -3551,7 +3583,8 @@ layers_dialog_new_layer_query (GimpImage* gimage)
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (options->size_se); gtk_widget_show (options->size_se);
gimp_size_entry_set_unit (GIMP_SIZE_ENTRY (options->size_se), GIMP_UNIT_PIXEL); gimp_size_entry_set_unit (GIMP_SIZE_ENTRY (options->size_se),
GIMP_UNIT_PIXEL);
gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (options->size_se), 0, gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (options->size_se), 0,
gimage->xresolution, FALSE); gimage->xresolution, FALSE);
@ -3616,7 +3649,7 @@ edit_layer_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
EditLayerOptions *options; EditLayerOptions *options;
Layer *layer; Layer *layer;
options = (EditLayerOptions *) data; options = (EditLayerOptions *) data;
@ -3647,9 +3680,9 @@ static void
layers_dialog_edit_layer_query (LayerWidget *layer_widget) layers_dialog_edit_layer_query (LayerWidget *layer_widget)
{ {
EditLayerOptions *options; EditLayerOptions *options;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *label; GtkWidget *label;
/* The new options structure */ /* The new options structure */
options = g_new (EditLayerOptions, 1); options = g_new (EditLayerOptions, 1);
@ -3724,9 +3757,9 @@ add_mask_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
AddMaskOptions *options; AddMaskOptions *options;
GimpImage *gimage; GimpImage *gimage;
LayerMask *mask; LayerMask *mask;
Layer *layer; Layer *layer;
options = (AddMaskOptions *) data; options = (AddMaskOptions *) data;
if ((layer = (options->layer)) && if ((layer = (options->layer)) &&
@ -3744,7 +3777,7 @@ static void
layers_dialog_add_mask_query (Layer *layer) layers_dialog_add_mask_query (Layer *layer)
{ {
AddMaskOptions *options; AddMaskOptions *options;
GtkWidget *frame; GtkWidget *frame;
/* The new options structure */ /* The new options structure */
options = g_new (AddMaskOptions, 1); options = g_new (AddMaskOptions, 1);
@ -3810,8 +3843,8 @@ scale_layer_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
ScaleLayerOptions *options; ScaleLayerOptions *options;
GimpImage *gimage; GimpImage *gimage;
Layer *layer; Layer *layer;
options = (ScaleLayerOptions *) data; options = (ScaleLayerOptions *) data;
@ -3827,7 +3860,8 @@ scale_layer_query_ok_callback (GtkWidget *widget,
if (layer_is_floating_sel (layer)) if (layer_is_floating_sel (layer))
floating_sel_relax (layer, TRUE); floating_sel_relax (layer, TRUE);
layer_scale (layer, options->resize->width, options->resize->height, TRUE); layer_scale (layer,
options->resize->width, options->resize->height, TRUE);
if (layer_is_floating_sel (layer)) if (layer_is_floating_sel (layer))
floating_sel_rigor (layer, TRUE); floating_sel_rigor (layer, TRUE);
@ -3894,8 +3928,8 @@ resize_layer_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
ResizeLayerOptions *options; ResizeLayerOptions *options;
GimpImage *gimage; GimpImage *gimage;
Layer *layer; Layer *layer;
options = (ResizeLayerOptions *) data; options = (ResizeLayerOptions *) data;
@ -4002,8 +4036,8 @@ layers_dialog_layer_merge_query (GimpImage *gimage,
gboolean merge_visible) gboolean merge_visible)
{ {
LayerMergeOptions *options; LayerMergeOptions *options;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *frame; GtkWidget *frame;
/* The new options structure */ /* The new options structure */
options = g_new (LayerMergeOptions, 1); options = g_new (LayerMergeOptions, 1);

View File

@ -97,7 +97,7 @@ gimp_layer_get_type (void)
static void static void
gimp_layer_class_init (GimpLayerClass *class) gimp_layer_class_init (GimpLayerClass *class)
{ {
GtkObjectClass *object_class; GtkObjectClass *object_class;
GimpDrawableClass *drawable_class; GimpDrawableClass *drawable_class;
object_class = (GtkObjectClass*) class; object_class = (GtkObjectClass*) class;
@ -210,9 +210,11 @@ transform_color (GImage *gimage,
GimpDrawable *drawable, GimpDrawable *drawable,
GimpImageBaseType type) GimpImageBaseType type)
{ {
int i, h; gint i;
unsigned char * s, * d; gint h;
void * pr; guchar *s;
guchar *d;
gpointer pr;
for (pr = pixel_regions_register (2, layerPR, bufPR); for (pr = pixel_regions_register (2, layerPR, bufPR);
pr != NULL; pr != NULL;
@ -252,7 +254,7 @@ layer_new (GimpImage *gimage,
gint opacity, gint opacity,
LayerModeEffects mode) LayerModeEffects mode)
{ {
Layer * layer; Layer *layer;
if (width == 0 || height == 0) if (width == 0 || height == 0)
{ {
@ -293,6 +295,7 @@ layer_ref (Layer *layer)
{ {
gtk_object_ref (GTK_OBJECT (layer)); gtk_object_ref (GTK_OBJECT (layer));
gtk_object_sink (GTK_OBJECT (layer)); gtk_object_sink (GTK_OBJECT (layer));
return layer; return layer;
} }
@ -306,23 +309,25 @@ Layer *
layer_copy (Layer *layer, layer_copy (Layer *layer,
gboolean add_alpha) gboolean add_alpha)
{ {
gchar * layer_name; gchar *layer_name;
Layer * new_layer; Layer *new_layer;
GimpImageType new_type; GimpImageType new_type;
gchar *ext; gchar *ext;
gint number; gint number;
gchar *name; gchar *name;
gint len; gint len;
PixelRegion srcPR, destPR; PixelRegion srcPR;
PixelRegion destPR;
/* formulate the new layer name */ /* formulate the new layer name */
name = layer_get_name (layer); name = layer_get_name (layer);
ext = strrchr (name, '#'); ext = strrchr (name, '#');
len = strlen (_("copy")); len = strlen (_("copy"));
if ((strlen(name) >= len && if ((strlen(name) >= len &&
strcmp (&name[strlen (name) - len], _("copy")) == 0) || strcmp (&name[strlen (name) - len], _("copy")) == 0) ||
(ext && (number = atoi (ext + 1)) > 0 && (ext && (number = atoi (ext + 1)) > 0 &&
((int) (log10 (number) + 1)) == strlen (ext + 1))) ((gint) (log10 (number) + 1)) == strlen (ext + 1)))
/* don't have redundant "copy"s */ /* don't have redundant "copy"s */
layer_name = g_strdup (name); layer_name = g_strdup (name);
else else
@ -424,8 +429,9 @@ layer_new_from_tiles (GimpImage *gimage,
gint opacity, gint opacity,
LayerModeEffects mode) LayerModeEffects mode)
{ {
Layer * new_layer; Layer *new_layer;
PixelRegion layerPR, bufPR; PixelRegion layerPR;
PixelRegion bufPR;
/* Function copies buffer to a layer /* Function copies buffer to a layer
* taking into consideration the possibility of transforming * taking into consideration the possibility of transforming
@ -452,11 +458,13 @@ layer_new_from_tiles (GimpImage *gimage,
/* Configure the pixel regions */ /* Configure the pixel regions */
pixel_region_init (&layerPR, GIMP_DRAWABLE (new_layer)->tiles, pixel_region_init (&layerPR, GIMP_DRAWABLE (new_layer)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE (new_layer)->width, GIMP_DRAWABLE (new_layer)->height, GIMP_DRAWABLE (new_layer)->width,
GIMP_DRAWABLE (new_layer)->height,
TRUE); TRUE);
pixel_region_init (&bufPR, tiles, pixel_region_init (&bufPR, tiles,
0, 0, 0, 0,
GIMP_DRAWABLE (new_layer)->width, GIMP_DRAWABLE (new_layer)->height, GIMP_DRAWABLE (new_layer)->width,
GIMP_DRAWABLE (new_layer)->height,
FALSE); FALSE);
if ((tiles->bpp == 4 && GIMP_DRAWABLE (new_layer)->type == RGBA_GIMAGE) || if ((tiles->bpp == 4 && GIMP_DRAWABLE (new_layer)->type == RGBA_GIMAGE) ||
@ -467,7 +475,7 @@ layer_new_from_tiles (GimpImage *gimage,
/* Transform the contents of the buf to the new_layer */ /* Transform the contents of the buf to the new_layer */
transform_color (gimage, &layerPR, &bufPR, GIMP_DRAWABLE (new_layer), transform_color (gimage, &layerPR, &bufPR, GIMP_DRAWABLE (new_layer),
(tiles->bpp == 4) ? RGB : GRAY); (tiles->bpp == 4) ? RGB : GRAY);
return new_layer; return new_layer;
} }
@ -488,7 +496,8 @@ layer_add_mask (Layer *layer,
drawable_update (GIMP_DRAWABLE(layer), drawable_update (GIMP_DRAWABLE(layer),
0, 0, 0, 0,
GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height); GIMP_DRAWABLE(layer)->width,
GIMP_DRAWABLE(layer)->height);
return layer->mask; return layer->mask;
} }
@ -497,12 +506,13 @@ LayerMask *
layer_create_mask (Layer *layer, layer_create_mask (Layer *layer,
AddMaskType add_mask_type) AddMaskType add_mask_type)
{ {
PixelRegion maskPR, layerPR; PixelRegion maskPR;
LayerMask *mask; PixelRegion layerPR;
gchar *mask_name; LayerMask *mask;
guchar black[3] = {0, 0, 0}; gchar *mask_name;
guchar white_mask = OPAQUE_OPACITY; guchar black[3] = {0, 0, 0};
guchar black_mask = TRANSPARENT_OPACITY; guchar white_mask = OPAQUE_OPACITY;
guchar black_mask = TRANSPARENT_OPACITY;
mask_name = g_strdup_printf (_("%s mask"), GIMP_DRAWABLE (layer)->name); mask_name = g_strdup_printf (_("%s mask"), GIMP_DRAWABLE (layer)->name);
@ -951,11 +961,15 @@ layer_scale (Layer *layer,
else else
{ {
new_offset_x = (gint)(((gdouble) new_width * new_offset_x = (gint)(((gdouble) new_width *
GIMP_DRAWABLE(layer)->offset_x / (gdouble) GIMP_DRAWABLE(layer)->width)); GIMP_DRAWABLE(layer)->offset_x /
(gdouble) GIMP_DRAWABLE(layer)->width));
new_offset_y = (gint)(((gdouble) new_height * new_offset_y = (gint)(((gdouble) new_height *
GIMP_DRAWABLE(layer)->offset_y / (gdouble) GIMP_DRAWABLE(layer)->height)); GIMP_DRAWABLE(layer)->offset_y /
(gdouble) GIMP_DRAWABLE(layer)->height));
} }
layer_scale_lowlevel (layer, new_width, new_height, new_offset_x, new_offset_y); layer_scale_lowlevel (layer,
new_width, new_height,
new_offset_x, new_offset_y);
} }
void void
@ -975,7 +989,7 @@ layer_resize (Layer *layer,
x1 = CLAMP (offx, 0, new_width); x1 = CLAMP (offx, 0, new_width);
y1 = CLAMP (offy, 0, new_height); y1 = CLAMP (offy, 0, new_height);
x2 = CLAMP ((offx + GIMP_DRAWABLE(layer)->width), 0, new_width); x2 = CLAMP ((offx + GIMP_DRAWABLE(layer)->width), 0, new_width);
y2 = CLAMP ((offy + GIMP_DRAWABLE(layer)->height), 0, new_height); y2 = CLAMP ((offy + GIMP_DRAWABLE(layer)->height), 0, new_height);
w = x2 - x1; w = x2 - x1;
h = y2 - y1; h = y2 - y1;
@ -1014,7 +1028,8 @@ layer_resize (Layer *layer,
FALSE); FALSE);
/* Allocate the new layer, configure dest region */ /* Allocate the new layer, configure dest region */
new_tiles = tile_manager_new (new_width, new_height, GIMP_DRAWABLE(layer)->bytes); new_tiles = tile_manager_new (new_width, new_height,
GIMP_DRAWABLE(layer)->bytes);
pixel_region_init (&destPR, new_tiles, pixel_region_init (&destPR, new_tiles,
0, 0, 0, 0,
new_width, new_height, new_width, new_height,
@ -1030,7 +1045,8 @@ layer_resize (Layer *layer,
else else
{ {
unsigned char bg[3]; unsigned char bg[3];
gimage_get_background (GIMP_DRAWABLE(layer)->gimage, GIMP_DRAWABLE(layer), bg); gimage_get_background (GIMP_DRAWABLE(layer)->gimage,
GIMP_DRAWABLE(layer), bg);
color_region (&destPR, bg); color_region (&destPR, bg);
} }
pixel_region_init (&destPR, new_tiles, pixel_region_init (&destPR, new_tiles,
@ -1203,7 +1219,8 @@ layer_pick_correlate (Layer *layer,
/* Otherwise, determine if the alpha value at /* Otherwise, determine if the alpha value at
* the given point is non-zero * the given point is non-zero
*/ */
tile = tile_manager_get_tile (GIMP_DRAWABLE(layer)->tiles, x, y, TRUE, FALSE); tile = tile_manager_get_tile (GIMP_DRAWABLE(layer)->tiles,
x, y, TRUE, FALSE);
val = * ((unsigned char*) tile_data_pointer (tile, val = * ((unsigned char*) tile_data_pointer (tile,
x % TILE_WIDTH, x % TILE_WIDTH,
@ -1212,7 +1229,8 @@ layer_pick_correlate (Layer *layer,
if (layer->mask) if (layer->mask)
{ {
unsigned char *ptr; unsigned char *ptr;
mask_tile = tile_manager_get_tile (GIMP_DRAWABLE(layer->mask)->tiles, x, y, TRUE, FALSE); mask_tile = tile_manager_get_tile (GIMP_DRAWABLE(layer->mask)->tiles,
x, y, TRUE, FALSE);
ptr = tile_data_pointer (mask_tile, x % TILE_WIDTH, y % TILE_HEIGHT); ptr = tile_data_pointer (mask_tile, x % TILE_WIDTH, y % TILE_HEIGHT);
val = val * (*ptr) / 255; val = val * (*ptr) / 255;
tile_release (mask_tile, FALSE); tile_release (mask_tile, FALSE);
@ -1287,26 +1305,27 @@ layer_preview_private (Layer *layer,
gint w, gint w,
gint h) gint h)
{ {
GImage *gimage; GImage *gimage;
TempBuf *preview_buf; TempBuf *preview_buf;
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
GimpImageBaseType type; GimpImageBaseType type;
gint bytes; gint bytes;
gint subsample; gint subsample;
TempBuf *ret_buf; TempBuf *ret_buf;
type = RGB; type = RGB;
bytes = 0; bytes = 0;
/* The easy way */ /* The easy way */
if (GIMP_DRAWABLE(layer)->preview_valid && if (GIMP_DRAWABLE (layer)->preview_valid &&
(ret_buf = gimp_preview_cache_get (&(GIMP_DRAWABLE(layer)->preview_cache), w,h))) (ret_buf =
gimp_preview_cache_get (&(GIMP_DRAWABLE (layer)->preview_cache), w, h)))
return ret_buf; return ret_buf;
/* The hard way */ /* The hard way */
else else
{ {
gimage = GIMP_DRAWABLE(layer)->gimage; gimage = GIMP_DRAWABLE (layer)->gimage;
switch (GIMP_DRAWABLE(layer)->type) switch (GIMP_DRAWABLE (layer)->type)
{ {
case RGB_GIMAGE: case RGBA_GIMAGE: case RGB_GIMAGE: case RGBA_GIMAGE:
type = RGB; type = RGB;
@ -1333,7 +1352,8 @@ layer_preview_private (Layer *layer,
pixel_region_init (&srcPR, GIMP_DRAWABLE(layer)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(layer)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(layer)->width, GIMP_DRAWABLE(layer)->height, GIMP_DRAWABLE(layer)->width,
GIMP_DRAWABLE(layer)->height,
FALSE); FALSE);
preview_buf = temp_buf_new (w, h, bytes, 0, 0, NULL); preview_buf = temp_buf_new (w, h, bytes, 0, 0, NULL);
@ -1351,7 +1371,8 @@ layer_preview_private (Layer *layer,
GIMP_DRAWABLE (layer)->preview_valid = TRUE; GIMP_DRAWABLE (layer)->preview_valid = TRUE;
gimp_preview_cache_add (&(GIMP_DRAWABLE (layer)->preview_cache), preview_buf); gimp_preview_cache_add (&(GIMP_DRAWABLE (layer)->preview_cache),
preview_buf);
return preview_buf; return preview_buf;
} }
@ -1386,11 +1407,11 @@ layer_mask_preview_private (Layer *layer,
gint w, gint w,
gint h) gint h)
{ {
TempBuf *preview_buf; TempBuf *preview_buf;
LayerMask *mask; LayerMask *mask;
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
gint subsample; gint subsample;
TempBuf *ret_buf; TempBuf *ret_buf;
mask = layer->mask; mask = layer->mask;
if (!mask) if (!mask)
@ -1398,7 +1419,8 @@ layer_mask_preview_private (Layer *layer,
/* The easy way */ /* The easy way */
if (GIMP_DRAWABLE(mask)->preview_valid && if (GIMP_DRAWABLE(mask)->preview_valid &&
(ret_buf = gimp_preview_cache_get (&(GIMP_DRAWABLE(mask)->preview_cache), w, h))) (ret_buf = gimp_preview_cache_get (&(GIMP_DRAWABLE(mask)->preview_cache),
w, h)))
return ret_buf; return ret_buf;
/* The hard way */ /* The hard way */
else else
@ -1413,7 +1435,8 @@ layer_mask_preview_private (Layer *layer,
pixel_region_init (&srcPR, GIMP_DRAWABLE(mask)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(mask)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(mask)->width, GIMP_DRAWABLE(mask)->height, GIMP_DRAWABLE(mask)->width,
GIMP_DRAWABLE(mask)->height,
FALSE); FALSE);
preview_buf = temp_buf_new (w, h, 1, 0, 0, NULL); preview_buf = temp_buf_new (w, h, 1, 0, 0, NULL);
@ -1424,7 +1447,7 @@ layer_mask_preview_private (Layer *layer,
destPR.rowstride = w * destPR.bytes; destPR.rowstride = w * destPR.bytes;
destPR.data = temp_buf_data (preview_buf); destPR.data = temp_buf_data (preview_buf);
layer_preview_scale (1 /* GRAY */, NULL, &srcPR, &destPR, subsample); layer_preview_scale (GRAY, NULL, &srcPR, &destPR, subsample);
if (!GIMP_DRAWABLE (mask)->preview_valid) if (!GIMP_DRAWABLE (mask)->preview_valid)
gimp_preview_cache_invalidate (&(GIMP_DRAWABLE (mask)->preview_cache)); gimp_preview_cache_invalidate (&(GIMP_DRAWABLE (mask)->preview_cache));
@ -1447,9 +1470,9 @@ layer_mask_preview (Layer *layer,
width <= PREVIEW_CACHE_PRIME_WIDTH && width <= PREVIEW_CACHE_PRIME_WIDTH &&
height <= PREVIEW_CACHE_PRIME_HEIGHT) height <= PREVIEW_CACHE_PRIME_HEIGHT)
{ {
TempBuf * tb = layer_mask_preview_private(layer, TempBuf * tb = layer_mask_preview_private (layer,
PREVIEW_CACHE_PRIME_WIDTH, PREVIEW_CACHE_PRIME_WIDTH,
PREVIEW_CACHE_PRIME_HEIGHT); PREVIEW_CACHE_PRIME_HEIGHT);
/* Save the 2nd call */ /* Save the 2nd call */
if (width == PREVIEW_CACHE_PRIME_WIDTH && if (width == PREVIEW_CACHE_PRIME_WIDTH &&
@ -1479,18 +1502,15 @@ layer_set_tattoo (const Layer *layer,
void void
layer_invalidate_previews (GimpImage *gimage) layer_invalidate_previews (GimpImage *gimage)
{ {
GSList * tmp; GSList *tmp;
Layer * layer; Layer *layer;
g_return_if_fail (gimage != NULL); g_return_if_fail (gimage != NULL);
tmp = gimage->layers; for (tmp = gimage->layers; tmp; tmp = g_slist_next (tmp))
while (tmp)
{ {
layer = (Layer *) tmp->data; layer = (Layer *) tmp->data;
gimp_drawable_invalidate_preview (GIMP_DRAWABLE(layer), TRUE); gimp_drawable_invalidate_preview (GIMP_DRAWABLE(layer), TRUE);
tmp = g_slist_next (tmp);
} }
} }
@ -1502,27 +1522,27 @@ layer_preview_scale (GimpImageBaseType type,
gint subsample) gint subsample)
{ {
#define EPSILON 0.000001 #define EPSILON 0.000001
guchar *src, *s; guchar *src, *s;
guchar *dest, *d; guchar *dest, *d;
gdouble *row, *r; gdouble *row, *r;
gint destwidth; gint destwidth;
gint src_row, src_col; gint src_row, src_col;
gint bytes, b; gint bytes, b;
gint width, height; gint width, height;
gint orig_width, orig_height; gint orig_width, orig_height;
gdouble x_rat, y_rat; gdouble x_rat, y_rat;
gdouble x_cum, y_cum; gdouble x_cum, y_cum;
gdouble x_last, y_last; gdouble x_last, y_last;
gdouble * x_frac, y_frac, tot_frac; gdouble *x_frac, y_frac, tot_frac;
gint i, j; gint i, j;
gint frac; gint frac;
gboolean advance_dest; gboolean advance_dest;
guchar rgb[MAX_CHANNELS]; guchar rgb[MAX_CHANNELS];
orig_width = srcPR->w / subsample; orig_width = srcPR->w / subsample;
orig_height = srcPR->h / subsample; orig_height = srcPR->h / subsample;
width = destPR->w; width = destPR->w;
height = destPR->h; height = destPR->h;
/* Some calculations... */ /* Some calculations... */
bytes = destPR->bytes; bytes = destPR->bytes;
@ -1568,7 +1588,12 @@ layer_preview_scale (GimpImageBaseType type,
y_cum = (double) src_row; y_cum = (double) src_row;
y_last = y_cum; y_last = y_cum;
pixel_region_get_row (srcPR, 0, src_row * subsample, orig_width * subsample, src, subsample); pixel_region_get_row (srcPR,
0,
src_row * subsample,
orig_width * subsample,
src,
subsample);
/* Scale the selected region */ /* Scale the selected region */
for (i = 0; i < height; ) for (i = 0; i < height; )
@ -1657,7 +1682,12 @@ layer_preview_scale (GimpImageBaseType type,
i++; i++;
} }
else else
pixel_region_get_row (srcPR, 0, src_row * subsample, orig_width * subsample, src, subsample); pixel_region_get_row (srcPR,
0,
src_row * subsample,
orig_width * subsample,
src,
subsample);
} }
/* free up temporary arrays */ /* free up temporary arrays */
@ -1688,8 +1718,8 @@ layer_mask_new (GimpImage *gimage,
gint opacity, gint opacity,
guchar *col) guchar *col)
{ {
LayerMask * layer_mask; LayerMask *layer_mask;
gint i; gint i;
layer_mask = gtk_type_new (gimp_layer_mask_get_type ()); layer_mask = gtk_type_new (gimp_layer_mask_get_type ());
@ -1721,12 +1751,13 @@ layer_mask_new (GimpImage *gimage,
LayerMask * LayerMask *
layer_mask_copy (LayerMask *layer_mask) layer_mask_copy (LayerMask *layer_mask)
{ {
gchar * layer_mask_name; gchar *layer_mask_name;
LayerMask * new_layer_mask; LayerMask *new_layer_mask;
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
/* formulate the new layer_mask name */ /* formulate the new layer_mask name */
layer_mask_name = g_strdup_printf (_("%s copy"), GIMP_DRAWABLE(layer_mask)->name); layer_mask_name = g_strdup_printf (_("%s copy"),
GIMP_DRAWABLE(layer_mask)->name);
/* allocate a new layer_mask object */ /* allocate a new layer_mask object */
new_layer_mask = layer_mask_new (GIMP_DRAWABLE(layer_mask)->gimage, new_layer_mask = layer_mask_new (GIMP_DRAWABLE(layer_mask)->gimage,
@ -1735,19 +1766,25 @@ layer_mask_copy (LayerMask *layer_mask)
layer_mask_name, layer_mask_name,
GIMP_CHANNEL(layer_mask)->opacity, GIMP_CHANNEL(layer_mask)->opacity,
GIMP_CHANNEL(layer_mask)->col); GIMP_CHANNEL(layer_mask)->col);
GIMP_DRAWABLE(new_layer_mask)->visible = GIMP_DRAWABLE(layer_mask)->visible; GIMP_DRAWABLE(new_layer_mask)->visible =
GIMP_DRAWABLE(new_layer_mask)->offset_x = GIMP_DRAWABLE(layer_mask)->offset_x; GIMP_DRAWABLE(layer_mask)->visible;
GIMP_DRAWABLE(new_layer_mask)->offset_y = GIMP_DRAWABLE(layer_mask)->offset_y; GIMP_DRAWABLE(new_layer_mask)->offset_x =
GIMP_CHANNEL(new_layer_mask)->show_masked = GIMP_CHANNEL(layer_mask)->show_masked; GIMP_DRAWABLE(layer_mask)->offset_x;
GIMP_DRAWABLE(new_layer_mask)->offset_y =
GIMP_DRAWABLE(layer_mask)->offset_y;
GIMP_CHANNEL(new_layer_mask)->show_masked =
GIMP_CHANNEL(layer_mask)->show_masked;
/* copy the contents across layer masks */ /* copy the contents across layer masks */
pixel_region_init (&srcPR, GIMP_DRAWABLE(layer_mask)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(layer_mask)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(layer_mask)->width, GIMP_DRAWABLE(layer_mask)->height, GIMP_DRAWABLE(layer_mask)->width,
GIMP_DRAWABLE(layer_mask)->height,
FALSE); FALSE);
pixel_region_init (&destPR, GIMP_DRAWABLE(new_layer_mask)->tiles, pixel_region_init (&destPR, GIMP_DRAWABLE(new_layer_mask)->tiles,
0, 0, 0, 0,
GIMP_DRAWABLE(layer_mask)->width, GIMP_DRAWABLE(layer_mask)->height, GIMP_DRAWABLE(layer_mask)->width,
GIMP_DRAWABLE(layer_mask)->height,
TRUE); TRUE);
copy_region (&srcPR, &destPR); copy_region (&srcPR, &destPR);
@ -1809,8 +1846,8 @@ channel_layer_mask (Channel *mask,
Layer *layer) Layer *layer)
{ {
PixelRegion srcPR, destPR; PixelRegion srcPR, destPR;
guchar empty = 0; guchar empty = 0;
gint x1, y1, x2, y2; gint x1, y1, x2, y2;
/* push the current mask onto the undo stack */ /* push the current mask onto the undo stack */
channel_push_undo (mask); channel_push_undo (mask);
@ -1830,7 +1867,8 @@ channel_layer_mask (Channel *mask,
0, GIMP_DRAWABLE(mask)->height); 0, GIMP_DRAWABLE(mask)->height);
pixel_region_init (&srcPR, GIMP_DRAWABLE(layer->mask)->tiles, pixel_region_init (&srcPR, GIMP_DRAWABLE(layer->mask)->tiles,
(x1 - GIMP_DRAWABLE(layer)->offset_x), (y1 - GIMP_DRAWABLE(layer)->offset_y), (x1 - GIMP_DRAWABLE(layer)->offset_x),
(y1 - GIMP_DRAWABLE(layer)->offset_y),
(x2 - x1), (y2 - y1), (x2 - x1), (y2 - y1),
FALSE); FALSE);
pixel_region_init (&destPR, GIMP_DRAWABLE(mask)->tiles, pixel_region_init (&destPR, GIMP_DRAWABLE(mask)->tiles,

View File

@ -393,7 +393,8 @@ layers_dialog_create (void)
FALSE, FALSE, 2); FALSE, FALSE, 2);
gtk_widget_show (layersD->mode_option_menu); gtk_widget_show (layersD->mode_option_menu);
gimp_help_set_help_data (layersD->mode_option_menu, NULL, "#paint_mode_menu"); gimp_help_set_help_data (layersD->mode_option_menu,
NULL, "#paint_mode_menu");
layersD->preserve_trans = layersD->preserve_trans =
gtk_check_button_new_with_label (_("Keep Trans.")); gtk_check_button_new_with_label (_("Keep Trans."));
@ -589,12 +590,13 @@ layers_dialog_update (GimpImage* gimage)
/* Find the preview extents */ /* Find the preview extents */
layers_dialog_preview_extents (); layers_dialog_preview_extents ();
layersD->active_layer = NULL; layersD->active_layer = NULL;
layersD->active_channel = NULL; layersD->active_channel = NULL;
layersD->floating_sel = NULL; layersD->floating_sel = NULL;
item_list = NULL; for (list = gimage->layers, item_list = NULL;
for (list = gimage->layers; list; list = g_slist_next (list)) list;
list = g_slist_next (list))
{ {
/* create a layer list item */ /* create a layer list item */
layer = (Layer *) list->data; layer = (Layer *) list->data;
@ -668,8 +670,9 @@ layers_dialog_flush (void)
} }
/* Switch positions of items if necessary */ /* Switch positions of items if necessary */
pos = 0; for (list = gimage->layers, pos = 0;
for (list = gimage->layers; list; list = g_slist_next (list)) list;
list = g_slist_next (list))
{ {
layer = (Layer *) list->data; layer = (Layer *) list->data;
layers_dialog_position_layer (layer, pos++); layers_dialog_position_layer (layer, pos++);
@ -692,6 +695,7 @@ layers_dialog_flush (void)
gtk_container_foreach (GTK_CONTAINER (layersD->layer_list), gtk_container_foreach (GTK_CONTAINER (layersD->layer_list),
layer_widget_layer_flush, NULL); layer_widget_layer_flush, NULL);
} }
suspend_gimage_notify--; suspend_gimage_notify--;
} }
@ -719,19 +723,19 @@ render_preview (TempBuf *preview_buf,
gint height, gint height,
gint channel) gint channel)
{ {
guchar *src, *s; guchar *src, *s;
guchar *cb; guchar *cb;
guchar *buf; guchar *buf;
gint a; gint a;
gint i, j, b; gint i, j, b;
gint x1, y1, x2, y2; gint x1, y1, x2, y2;
gint rowstride; gint rowstride;
gint color_buf; gint color_buf;
gint color; gint color;
gint alpha; gint alpha;
gint has_alpha; gboolean has_alpha;
gint image_bytes; gint image_bytes;
gint offset; gint offset;
alpha = ALPHA_PIX; alpha = ALPHA_PIX;
@ -746,10 +750,10 @@ render_preview (TempBuf *preview_buf,
* 2) Color preview_bufs have bytes == {3, 4} * 2) Color preview_bufs have bytes == {3, 4}
* 3) If image is gray, then preview_buf should have bytes == {1, 2} * 3) If image is gray, then preview_buf should have bytes == {1, 2}
*/ */
color_buf = (GTK_PREVIEW (preview_widget)->type == GTK_PREVIEW_COLOR); color_buf = (GTK_PREVIEW (preview_widget)->type == GTK_PREVIEW_COLOR);
image_bytes = (color_buf) ? 3 : 1; image_bytes = (color_buf) ? 3 : 1;
has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4); has_alpha = (preview_buf->bytes == 2 || preview_buf->bytes == 4);
rowstride = preview_buf->width * preview_buf->bytes; rowstride = preview_buf->width * preview_buf->bytes;
/* Determine if the preview buf supplied is color /* Determine if the preview buf supplied is color
* Generally, if the bytes == {3, 4}, this is true. * Generally, if the bytes == {3, 4}, this is true.
@ -900,11 +904,11 @@ void
render_fs_preview (GtkWidget *widget, render_fs_preview (GtkWidget *widget,
GdkPixmap *pixmap) GdkPixmap *pixmap)
{ {
gint w, h; gint w, h;
gint x1, y1, x2, y2; gint x1, y1, x2, y2;
GdkPoint poly[6]; GdkPoint poly[6];
gint foldh, foldw; gint foldh, foldw;
gint i; gint i;
gdk_window_get_size (pixmap, &w, &h); gdk_window_get_size (pixmap, &w, &h);
@ -926,10 +930,11 @@ render_fs_preview (GtkWidget *widget,
poly[0].x = x1 + foldw; poly[0].y = y1; poly[0].x = x1 + foldw; poly[0].y = y1;
poly[1].x = x1 + foldw; poly[1].y = y1 + foldh; poly[1].x = x1 + foldw; poly[1].y = y1 + foldh;
poly[2].x = x1; poly[2].y = y1 + foldh; poly[2].x = x1; poly[2].y = y1 + foldh;
poly[3].x = x1; poly[3].y = y2; poly[3].x = x1; poly[3].y = y2;
poly[4].x = x2; poly[4].y = y2; poly[4].x = x2; poly[4].y = y2;
poly[5].x = x2; poly[5].y = y1; poly[5].x = x2; poly[5].y = y1;
gdk_draw_polygon (pixmap, widget->style->white_gc, 1, poly, 6); gdk_draw_polygon (pixmap, widget->style->white_gc, 1, poly, 6);
gdk_draw_line (pixmap, widget->style->black_gc, gdk_draw_line (pixmap, widget->style->black_gc,
@ -940,6 +945,7 @@ render_fs_preview (GtkWidget *widget,
x2, y2, x2, y1); x2, y2, x2, y1);
gdk_draw_line (pixmap, widget->style->black_gc, gdk_draw_line (pixmap, widget->style->black_gc,
x1 + foldw, y1, x2, y1); x1 + foldw, y1, x2, y1);
for (i = 0; i < foldw; i++) for (i = 0; i < foldw; i++)
gdk_draw_line (pixmap, widget->style->black_gc, gdk_draw_line (pixmap, widget->style->black_gc,
x1 + i, y1 + foldh, x1 + i, (foldw == 1) ? y1 : x1 + i, y1 + foldh, x1 + i, (foldw == 1) ? y1 :
@ -965,16 +971,19 @@ layers_dialog_preview_extents (void)
/* Get the image width and height variables, based on the gimage */ /* Get the image width and height variables, based on the gimage */
if (gimage->width > gimage->height) if (gimage->width > gimage->height)
layersD->ratio = (double) preview_size / (double) gimage->width; layersD->ratio = (gdouble) preview_size / (gdouble) gimage->width;
else else
layersD->ratio = (double) preview_size / (double) gimage->height; layersD->ratio = (gdouble) preview_size / (gdouble) gimage->height;
if (preview_size) if (preview_size)
{ {
layersD->image_width = (gint) (layersD->ratio * gimage->width); layersD->image_width = (gint) (layersD->ratio * gimage->width);
layersD->image_height = (gint) (layersD->ratio * gimage->height); layersD->image_height = (gint) (layersD->ratio * gimage->height);
if (layersD->image_width < 1) layersD->image_width = 1;
if (layersD->image_height < 1) layersD->image_height = 1; if (layersD->image_width < 1)
layersD->image_width = 1;
if (layersD->image_height < 1)
layersD->image_height = 1;
} }
else else
{ {
@ -986,18 +995,18 @@ layers_dialog_preview_extents (void)
static void static void
layers_dialog_set_menu_sensitivity (void) layers_dialog_set_menu_sensitivity (void)
{ {
gboolean fs; /* floating sel */ gboolean fs; /* floating sel */
gboolean ac; /* active channel */ gboolean ac; /* active channel */
gboolean lm; /* layer mask */ gboolean lm; /* layer mask */
gboolean gimage; /* is there a gimage */ gboolean gimage; /* is there a gimage */
gboolean lp; /* layers present */ gboolean lp; /* layers present */
gboolean alpha; /* alpha channel present */ gboolean alpha; /* alpha channel present */
gboolean indexed; /* is indexed */ gboolean indexed; /* is indexed */
gint next_alpha; gint next_alpha;
GSList *list; GSList *list;
GSList *next; GSList *next;
GSList *prev; GSList *prev;
Layer *layer; Layer *layer;
lp = FALSE; lp = FALSE;
indexed = FALSE; indexed = FALSE;
@ -1108,7 +1117,7 @@ static void
layers_dialog_scroll_index (gint index) layers_dialog_scroll_index (gint index)
{ {
GtkAdjustment *adj; GtkAdjustment *adj;
gint item_height; gint item_height;
item_height = 6 + (preview_size ? preview_size : layer_height); item_height = 6 + (preview_size ? preview_size : layer_height);
adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (layersD->scrolled_win)); adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (layersD->scrolled_win));
@ -1126,6 +1135,7 @@ layers_dialog_scroll_index (gint index)
} }
/* Commented out because this piece of code produced strange segfaults /* Commented out because this piece of code produced strange segfaults
static gint static gint
layer_dialog_idle_set_active_layer_focus (gpointer data) layer_dialog_idle_set_active_layer_focus (gpointer data)
{ {
@ -1133,6 +1143,7 @@ layer_dialog_idle_set_active_layer_focus (gpointer data)
return FALSE; return FALSE;
} }
*/ */
static void static void
@ -1140,7 +1151,7 @@ layers_dialog_set_active_layer (Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GtkStateType state; GtkStateType state;
gint index; gint index;
layer_widget = layer_widget_get_ID (layer); layer_widget = layer_widget_get_ID (layer);
if (!layersD || !layer_widget) if (!layersD || !layer_widget)
@ -1174,7 +1185,7 @@ layers_dialog_unset_layer (Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GtkStateType state; GtkStateType state;
gint index; gint index;
layer_widget = layer_widget_get_ID (layer); layer_widget = layer_widget_get_ID (layer);
if (!layersD || !layer_widget) if (!layersD || !layer_widget)
@ -1199,8 +1210,8 @@ static void
layers_dialog_position_layer (Layer *layer, layers_dialog_position_layer (Layer *layer,
gint new_index) gint new_index)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GList *list = NULL; GList *list = NULL;
layer_widget = layer_widget_get_ID (layer); layer_widget = layer_widget_get_ID (layer);
if (!layersD || !layer_widget) if (!layersD || !layer_widget)
@ -1245,8 +1256,8 @@ layers_dialog_add_layer (Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GimpImage *gimage; GimpImage *gimage;
GList *item_list; GList *item_list;
gint position; gint position;
if (!layersD || !layer || !(gimage = layersD->gimage)) if (!layersD || !layer || !(gimage = layersD->gimage))
return; return;
@ -1266,7 +1277,7 @@ static void
layers_dialog_remove_layer (Layer *layer) layers_dialog_remove_layer (Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GList *list = NULL; GList *list = NULL;
layer_widget = layer_widget_get_ID (layer); layer_widget = layer_widget_get_ID (layer);
if (!layersD || !layer_widget) if (!layersD || !layer_widget)
@ -1372,7 +1383,8 @@ opacity_scale_update (GtkAdjustment *adjustment,
return; return;
/* add the 0.001 to insure there are no subtle rounding errors */ /* add the 0.001 to insure there are no subtle rounding errors */
opacity = (int) (adjustment->value * 2.55 + 0.001); opacity = (gint) (adjustment->value * 2.55 + 0.001);
if (layer->opacity != opacity) if (layer->opacity != opacity)
{ {
layer->opacity = opacity; layer->opacity = opacity;
@ -1587,7 +1599,7 @@ layers_dialog_new_layer_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GimpImage *gimage; GimpImage *gimage;
Layer *layer; Layer *layer;
if (!layersD || !(gimage = layersD->gimage)) if (!layersD || !(gimage = layersD->gimage))
return; return;
@ -1842,7 +1854,7 @@ layers_dialog_add_alpha_channel_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GimpImage *gimage; GimpImage *gimage;
Layer *layer; Layer *layer;
if (!layersD || if (!layersD ||
!(gimage = layersD->gimage) || !(gimage = layersD->gimage) ||
@ -1878,8 +1890,8 @@ layers_dialog_drag_new_layer_callback (GtkWidget *widget,
gint y, gint y,
guint time) guint time)
{ {
GtkWidget *src_widget; GtkWidget *src_widget;
gboolean return_val = FALSE; gboolean return_val = FALSE;
if ((src_widget = gtk_drag_get_source_widget (context))) if ((src_widget = gtk_drag_get_source_widget (context)))
{ {
@ -1893,8 +1905,8 @@ layers_dialog_drag_new_layer_callback (GtkWidget *widget,
{ {
Layer *new_layer; Layer *new_layer;
GimpImage *gimage; GimpImage *gimage;
gint width, height; gint width, height;
gint off_x, off_y; gint off_x, off_y;
gimage = layersD->gimage; gimage = layersD->gimage;
@ -1944,7 +1956,7 @@ layers_dialog_drag_duplicate_layer_callback (GtkWidget *widget,
guint time) guint time)
{ {
GtkWidget *src_widget; GtkWidget *src_widget;
gboolean return_val = FALSE; gboolean return_val = FALSE;
if ((src_widget = gtk_drag_get_source_widget (context))) if ((src_widget = gtk_drag_get_source_widget (context)))
{ {
@ -1976,7 +1988,7 @@ layers_dialog_drag_trashcan_callback (GtkWidget *widget,
guint time) guint time)
{ {
GtkWidget *src_widget; GtkWidget *src_widget;
gboolean return_val = FALSE; gboolean return_val = FALSE;
if ((src_widget = gtk_drag_get_source_widget (context))) if ((src_widget = gtk_drag_get_source_widget (context)))
{ {
@ -2017,7 +2029,7 @@ static LayerWidget *
layer_widget_get_ID (Layer *ID) layer_widget_get_ID (Layer *ID)
{ {
LayerWidget *lw; LayerWidget *lw;
GSList *list; GSList *list;
if (! layersD) if (! layersD)
return NULL; return NULL;
@ -2038,10 +2050,10 @@ layer_widget_create (GimpImage *gimage,
Layer *layer) Layer *layer)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GtkWidget *list_item; GtkWidget *list_item;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *alignment; GtkWidget *alignment;
list_item = gtk_list_item_new (); list_item = gtk_list_item_new ();
@ -2127,9 +2139,10 @@ layer_widget_create (GimpImage *gimage,
gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->layer_preview), gtk_drawing_area_size (GTK_DRAWING_AREA (layer_widget->layer_preview),
layersD->image_width + 4, layersD->image_height + 4); layersD->image_width + 4, layersD->image_height + 4);
gtk_widget_set_events (layer_widget->layer_preview, PREVIEW_EVENT_MASK); gtk_widget_set_events (layer_widget->layer_preview, PREVIEW_EVENT_MASK);
gtk_signal_connect (GTK_OBJECT (layer_widget->layer_preview), "event", gtk_signal_connect_while_alive (GTK_OBJECT (layer_widget->layer_preview), "event",
GTK_SIGNAL_FUNC (layer_widget_preview_events), GTK_SIGNAL_FUNC (layer_widget_preview_events),
layer_widget); layer_widget,
GTK_OBJECT (layer));
gtk_object_set_user_data (GTK_OBJECT (layer_widget->layer_preview), gtk_object_set_user_data (GTK_OBJECT (layer_widget->layer_preview),
layer_widget); layer_widget);
gtk_container_add (GTK_CONTAINER (alignment), layer_widget->layer_preview); gtk_container_add (GTK_CONTAINER (alignment), layer_widget->layer_preview);
@ -2240,16 +2253,15 @@ layer_widget_drag_motion_callback (GtkWidget *widget,
gint y, gint y,
guint time) guint time)
{ {
LayerWidget *dest; LayerWidget *dest;
gint dest_index; gint dest_index;
GtkWidget *src_widget; GtkWidget *src_widget;
LayerWidget *src; LayerWidget *src;
gint src_index; gint src_index;
gint difference; gint difference;
GimpDropType drop_type = GIMP_DROP_NONE;
GimpDropType drop_type = GIMP_DROP_NONE; GdkDragAction drag_action = GDK_ACTION_DEFAULT;
GdkDragAction drag_action = GDK_ACTION_DEFAULT; gboolean return_val = FALSE;
gboolean return_val = FALSE;
dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
@ -2314,7 +2326,8 @@ layer_widget_drag_begin_callback (GtkWidget *widget,
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
gimp_dnd_set_drawable_preview_icon (widget, context, gimp_dnd_set_drawable_preview_icon (widget, context,
GIMP_DRAWABLE (layer_widget->layer)); GIMP_DRAWABLE (layer_widget->layer));
@ -2326,7 +2339,8 @@ layer_mask_drag_begin_callback (GtkWidget *widget,
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
gimp_dnd_set_drawable_preview_icon gimp_dnd_set_drawable_preview_icon
(widget, context, (widget, context,
@ -2362,15 +2376,14 @@ layer_widget_drag_drop_callback (GtkWidget *widget,
gint y, gint y,
guint time) guint time)
{ {
LayerWidget *dest; LayerWidget *dest;
gint dest_index; gint dest_index;
GtkWidget *src_widget; GtkWidget *src_widget;
LayerWidget *src; LayerWidget *src;
gint src_index; gint src_index;
gint difference; gint difference;
GimpDropType drop_type = GIMP_DROP_NONE;
GimpDropType drop_type = GIMP_DROP_NONE; gboolean return_val = FALSE;
gboolean return_val = FALSE;
dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); dest = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
@ -2378,16 +2391,18 @@ layer_widget_drag_drop_callback (GtkWidget *widget,
layer_has_alpha (dest->layer) && layer_has_alpha (dest->layer) &&
(src_widget = gtk_drag_get_source_widget (context))) (src_widget = gtk_drag_get_source_widget (context)))
{ {
src src =
= (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget)); (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (src_widget));
if (src && if (src &&
layer_has_alpha (src->layer) && layer_has_alpha (src->layer) &&
! layer_is_floating_sel (src->layer) && ! layer_is_floating_sel (src->layer) &&
src->layer == layersD->active_layer) src->layer == layersD->active_layer)
{ {
src_index = gimp_image_get_layer_index (layersD->gimage, src->layer); src_index =
dest_index = gimp_image_get_layer_index (layersD->gimage, dest->layer); gimp_image_get_layer_index (layersD->gimage, src->layer);
dest_index =
gimp_image_get_layer_index (layersD->gimage, dest->layer);
difference = dest_index - src_index; difference = dest_index - src_index;
@ -2441,7 +2456,8 @@ layer_widget_drag_leave_callback (GtkWidget *widget,
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
layer_widget->drop_type = GIMP_DROP_NONE; layer_widget->drop_type = GIMP_DROP_NONE;
} }
@ -2452,7 +2468,8 @@ layer_widget_drag_indicator_callback (GtkWidget *widget,
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
layer_widget_draw_drop_indicator (layer_widget, layer_widget->drop_type); layer_widget_draw_drop_indicator (layer_widget, layer_widget->drop_type);
} }
@ -2462,7 +2479,7 @@ layer_widget_draw_drop_indicator (LayerWidget *layer_widget,
GimpDropType drop_type) GimpDropType drop_type)
{ {
static GdkGC *gc = NULL; static GdkGC *gc = NULL;
gint y = 0; gint y = 0;
if (!gc) if (!gc)
{ {
@ -2534,15 +2551,15 @@ layer_widget_button_events (GtkWidget *widget,
GdkEvent *event, GdkEvent *event,
gpointer data) gpointer data)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
GtkWidget *event_widget; GtkWidget *event_widget;
GdkEventButton *bevent; GdkEventButton *bevent;
gint return_val; gint return_val;
static gboolean button_down = FALSE; static gboolean button_down = FALSE;
static GtkWidget *click_widget = NULL; static GtkWidget *click_widget = NULL;
static gint old_state; static gint old_state;
static gint exclusive; static gint exclusive;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
return_val = FALSE; return_val = FALSE;
@ -2678,14 +2695,16 @@ layer_widget_preview_events (GtkWidget *widget,
GdkEventExpose *eevent; GdkEventExpose *eevent;
GdkEventButton *bevent; GdkEventButton *bevent;
GdkPixmap **pixmap; GdkPixmap **pixmap;
gboolean valid; gboolean valid;
gint preview_type; gint preview_type;
gint sx, sy, dx, dy, w, h; gint sx, sy, dx, dy, w, h;
pixmap = NULL; pixmap = NULL;
valid = FALSE; valid = FALSE;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget =
(LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
if (!GIMP_IS_DRAWABLE (layer_widget->layer)) if (!GIMP_IS_DRAWABLE (layer_widget->layer))
return FALSE; return FALSE;
@ -2704,7 +2723,8 @@ layer_widget_preview_events (GtkWidget *widget,
break; break;
case MASK_PREVIEW: case MASK_PREVIEW:
pixmap = &layer_widget->mask_pixmap; pixmap = &layer_widget->mask_pixmap;
valid = GIMP_DRAWABLE (layer_get_mask (layer_widget->layer))->preview_valid; valid =
GIMP_DRAWABLE (layer_get_mask (layer_widget->layer))->preview_valid;
break; break;
} }
@ -2808,19 +2828,23 @@ layer_widget_preview_events (GtkWidget *widget,
if ((w > 0) && (h > 0)) if ((w > 0) && (h > 0))
{ {
/* Expose events are optimzed away by GTK+ if the widget is not /*
visible. Therefore, previews not visible in the layers_dialog Expose events are optimzed away by GTK+ if the widget is not
are not redrawn when they invalidate. Later the preview gets visible. Therefore, previews not visible in the layers_dialog
validated by the image_preview in lc_dialog but is never are not redrawn when they invalidate. Later the preview gets
propagated to the layer_pixmap. We work around this by using an validated by the image_preview in lc_dialog but is never
additional flag "layer_pixmap_valid" so that the pixmap gets propagated to the layer_pixmap. We work around this by using an
updated once the preview scrolls into sight. additional flag "layer_pixmap_valid" so that the pixmap gets
We should probably do the same for all drawables (masks, updated once the preview scrolls into sight.
channels), but it is much more difficult to change one of these We should probably do the same for all drawables (masks,
when it's not visible. channels), but it is much more difficult to change one of these
*/ when it's not visible.
if (preview_type == LAYER_PREVIEW && ! layer_widget->layer_pixmap_valid) */
layer_widget_preview_redraw (layer_widget, preview_type); if (preview_type == LAYER_PREVIEW &&
! layer_widget->layer_pixmap_valid)
{
layer_widget_preview_redraw (layer_widget, preview_type);
}
gdk_draw_pixmap (widget->window, gdk_draw_pixmap (widget->window,
widget->style->black_gc, widget->style->black_gc,
@ -2845,9 +2869,10 @@ static void
layer_widget_boundary_redraw (LayerWidget *layer_widget, layer_widget_boundary_redraw (LayerWidget *layer_widget,
gint preview_type) gint preview_type)
{ {
GtkWidget *widget; GtkWidget *widget;
GdkGC *gc1, *gc2; GdkGC *gc1;
GtkStateType state; GdkGC *gc2;
GtkStateType state;
if (preview_type == LAYER_PREVIEW) if (preview_type == LAYER_PREVIEW)
widget = layer_widget->layer_preview; widget = layer_widget->layer_preview;
@ -2883,6 +2908,7 @@ layer_widget_boundary_redraw (LayerWidget *layer_widget,
layersD->green_gc = gdk_gc_new (widget->window); layersD->green_gc = gdk_gc_new (widget->window);
gdk_gc_set_foreground (layersD->green_gc, &green); gdk_gc_set_foreground (layersD->green_gc, &green);
} }
if (layersD->red_gc == NULL) if (layersD->red_gc == NULL)
{ {
GdkColor red; GdkColor red;
@ -2916,7 +2942,7 @@ layer_widget_preview_redraw (LayerWidget *layer_widget,
TempBuf *preview_buf; TempBuf *preview_buf;
GdkPixmap **pixmap; GdkPixmap **pixmap;
GtkWidget *widget; GtkWidget *widget;
gint offx, offy; gint offx, offy;
preview_buf = NULL; preview_buf = NULL;
pixmap = NULL; pixmap = NULL;
@ -2953,8 +2979,12 @@ layer_widget_preview_redraw (LayerWidget *layer_widget,
(gint) (layersD->ratio * GIMP_DRAWABLE (layer_widget->layer)->width); (gint) (layersD->ratio * GIMP_DRAWABLE (layer_widget->layer)->width);
layer_widget->height = layer_widget->height =
(gint) (layersD->ratio * GIMP_DRAWABLE (layer_widget->layer)->height); (gint) (layersD->ratio * GIMP_DRAWABLE (layer_widget->layer)->height);
if (layer_widget->width < 1) layer_widget->width = 1;
if (layer_widget->height < 1) layer_widget->height = 1; if (layer_widget->width < 1)
layer_widget->width = 1;
if (layer_widget->height < 1)
layer_widget->height = 1;
offx = (gint) (layersD->ratio * offx = (gint) (layersD->ratio *
GIMP_DRAWABLE (layer_widget->layer)->offset_x); GIMP_DRAWABLE (layer_widget->layer)->offset_x);
offy = (gint) (layersD->ratio * offy = (gint) (layersD->ratio *
@ -3005,15 +3035,15 @@ static void
layer_widget_no_preview_redraw (LayerWidget *layer_widget, layer_widget_no_preview_redraw (LayerWidget *layer_widget,
gint preview_type) gint preview_type)
{ {
GdkPixmap *pixmap; GdkPixmap *pixmap;
GdkPixmap **pixmap_normal; GdkPixmap **pixmap_normal;
GdkPixmap **pixmap_selected; GdkPixmap **pixmap_selected;
GdkPixmap **pixmap_insensitive; GdkPixmap **pixmap_insensitive;
GdkColor *color; GdkColor *color;
GtkWidget *widget; GtkWidget *widget;
GtkStateType state; GtkStateType state;
gchar *bits; gchar *bits;
gint width, height; gint width, height;
pixmap_normal = NULL; pixmap_normal = NULL;
pixmap_selected = NULL; pixmap_selected = NULL;
@ -3097,9 +3127,9 @@ layer_widget_no_preview_redraw (LayerWidget *layer_widget,
static void static void
layer_widget_eye_redraw (LayerWidget *layer_widget) layer_widget_eye_redraw (LayerWidget *layer_widget)
{ {
GdkPixmap *pixmap; GdkPixmap *pixmap;
GdkColor *color; GdkColor *color;
GtkStateType state; GtkStateType state;
state = layer_widget->list_item->state; state = layer_widget->list_item->state;
@ -3162,9 +3192,9 @@ layer_widget_eye_redraw (LayerWidget *layer_widget)
static void static void
layer_widget_linked_redraw (LayerWidget *layer_widget) layer_widget_linked_redraw (LayerWidget *layer_widget)
{ {
GdkPixmap *pixmap; GdkPixmap *pixmap;
GdkColor *color; GdkColor *color;
GtkStateType state; GtkStateType state;
state = layer_widget->list_item->state; state = layer_widget->list_item->state;
@ -3272,11 +3302,11 @@ layer_widget_layer_flush (GtkWidget *widget,
gpointer data) gpointer data)
{ {
LayerWidget *layer_widget; LayerWidget *layer_widget;
Layer *layer; Layer *layer;
gchar *name; gchar *name;
gchar *label_name; gchar *label_name;
gboolean update_layer_preview = FALSE; gboolean update_layer_preview = FALSE;
gboolean update_mask_preview = FALSE; gboolean update_mask_preview = FALSE;
layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget)); layer_widget = (LayerWidget *) gtk_object_get_user_data (GTK_OBJECT (widget));
layer = layer_widget->layer; layer = layer_widget->layer;
@ -3354,7 +3384,8 @@ layer_widget_layer_flush (GtkWidget *widget,
if (layer_get_mask (layer)) if (layer_get_mask (layer))
{ {
update_mask_preview = (! GIMP_DRAWABLE (layer_get_mask (layer))->preview_valid); update_mask_preview =
(! GIMP_DRAWABLE (layer_get_mask (layer))->preview_valid);
if (layer->apply_mask != layer_widget->apply_mask) if (layer->apply_mask != layer_widget->apply_mask)
{ {
@ -3414,8 +3445,8 @@ new_layer_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
NewLayerOptions *options; NewLayerOptions *options;
Layer *layer; Layer *layer;
GimpImage *gimage; GimpImage *gimage;
options = (NewLayerOptions *) data; options = (NewLayerOptions *) data;
@ -3462,12 +3493,12 @@ static void
layers_dialog_new_layer_query (GimpImage* gimage) layers_dialog_new_layer_query (GimpImage* gimage)
{ {
NewLayerOptions *options; NewLayerOptions *options;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *table; GtkWidget *table;
GtkWidget *label; GtkWidget *label;
GtkObject *adjustment; GtkObject *adjustment;
GtkWidget *spinbutton; GtkWidget *spinbutton;
GtkWidget *frame; GtkWidget *frame;
/* The new options structure */ /* The new options structure */
options = g_new (NewLayerOptions, 1); options = g_new (NewLayerOptions, 1);
@ -3513,7 +3544,8 @@ layers_dialog_new_layer_query (GimpImage* gimage)
options->name_entry = gtk_entry_new (); options->name_entry = gtk_entry_new ();
gtk_widget_set_usize (options->name_entry, 75, 0); gtk_widget_set_usize (options->name_entry, 75, 0);
gtk_table_attach_defaults (GTK_TABLE (table), options->name_entry, 1, 2, 0, 1); gtk_table_attach_defaults (GTK_TABLE (table),
options->name_entry, 1, 2, 0, 1);
gtk_entry_set_text (GTK_ENTRY (options->name_entry), gtk_entry_set_text (GTK_ENTRY (options->name_entry),
(layer_name ? layer_name : _("New Layer"))); (layer_name ? layer_name : _("New Layer")));
gtk_widget_show (options->name_entry); gtk_widget_show (options->name_entry);
@ -3551,7 +3583,8 @@ layers_dialog_new_layer_query (GimpImage* gimage)
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
gtk_widget_show (options->size_se); gtk_widget_show (options->size_se);
gimp_size_entry_set_unit (GIMP_SIZE_ENTRY (options->size_se), GIMP_UNIT_PIXEL); gimp_size_entry_set_unit (GIMP_SIZE_ENTRY (options->size_se),
GIMP_UNIT_PIXEL);
gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (options->size_se), 0, gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (options->size_se), 0,
gimage->xresolution, FALSE); gimage->xresolution, FALSE);
@ -3616,7 +3649,7 @@ edit_layer_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
EditLayerOptions *options; EditLayerOptions *options;
Layer *layer; Layer *layer;
options = (EditLayerOptions *) data; options = (EditLayerOptions *) data;
@ -3647,9 +3680,9 @@ static void
layers_dialog_edit_layer_query (LayerWidget *layer_widget) layers_dialog_edit_layer_query (LayerWidget *layer_widget)
{ {
EditLayerOptions *options; EditLayerOptions *options;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *label; GtkWidget *label;
/* The new options structure */ /* The new options structure */
options = g_new (EditLayerOptions, 1); options = g_new (EditLayerOptions, 1);
@ -3724,9 +3757,9 @@ add_mask_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
AddMaskOptions *options; AddMaskOptions *options;
GimpImage *gimage; GimpImage *gimage;
LayerMask *mask; LayerMask *mask;
Layer *layer; Layer *layer;
options = (AddMaskOptions *) data; options = (AddMaskOptions *) data;
if ((layer = (options->layer)) && if ((layer = (options->layer)) &&
@ -3744,7 +3777,7 @@ static void
layers_dialog_add_mask_query (Layer *layer) layers_dialog_add_mask_query (Layer *layer)
{ {
AddMaskOptions *options; AddMaskOptions *options;
GtkWidget *frame; GtkWidget *frame;
/* The new options structure */ /* The new options structure */
options = g_new (AddMaskOptions, 1); options = g_new (AddMaskOptions, 1);
@ -3810,8 +3843,8 @@ scale_layer_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
ScaleLayerOptions *options; ScaleLayerOptions *options;
GimpImage *gimage; GimpImage *gimage;
Layer *layer; Layer *layer;
options = (ScaleLayerOptions *) data; options = (ScaleLayerOptions *) data;
@ -3827,7 +3860,8 @@ scale_layer_query_ok_callback (GtkWidget *widget,
if (layer_is_floating_sel (layer)) if (layer_is_floating_sel (layer))
floating_sel_relax (layer, TRUE); floating_sel_relax (layer, TRUE);
layer_scale (layer, options->resize->width, options->resize->height, TRUE); layer_scale (layer,
options->resize->width, options->resize->height, TRUE);
if (layer_is_floating_sel (layer)) if (layer_is_floating_sel (layer))
floating_sel_rigor (layer, TRUE); floating_sel_rigor (layer, TRUE);
@ -3894,8 +3928,8 @@ resize_layer_query_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
ResizeLayerOptions *options; ResizeLayerOptions *options;
GimpImage *gimage; GimpImage *gimage;
Layer *layer; Layer *layer;
options = (ResizeLayerOptions *) data; options = (ResizeLayerOptions *) data;
@ -4002,8 +4036,8 @@ layers_dialog_layer_merge_query (GimpImage *gimage,
gboolean merge_visible) gboolean merge_visible)
{ {
LayerMergeOptions *options; LayerMergeOptions *options;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *frame; GtkWidget *frame;
/* The new options structure */ /* The new options structure */
options = g_new (LayerMergeOptions, 1); options = g_new (LayerMergeOptions, 1);

View File

@ -194,7 +194,7 @@ typedef struct
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
gint tile_height; gint tile_height;
FILE *outfile; FILE *outfile;
gint has_alpha; gboolean has_alpha;
gint rowstride; gint rowstride;
guchar *temp; guchar *temp;
guchar *data; guchar *data;
@ -210,37 +210,37 @@ static gboolean *abort_me = NULL;
/* Declare local functions. /* Declare local functions.
*/ */
static void query (void); static void query (void);
static void run (gchar *name, static void run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals); GimpParam **return_vals);
static gint32 load_image (gchar *filename, static gint32 load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview); gboolean preview);
static gint save_image (gchar *filename, static gboolean save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview); gboolean preview);
static gint save_dialog (void); static gboolean save_dialog (void);
static void save_close_callback (GtkWidget *widget, static void save_close_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_ok_callback (GtkWidget *widget, static void save_ok_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_restart_toggle_update (GtkWidget *toggle, static void save_restart_toggle_update (GtkWidget *toggle,
GtkAdjustment *adjustment); GtkAdjustment *adjustment);
static void save_restart_update (GtkAdjustment *adjustment, static void save_restart_update (GtkAdjustment *adjustment,
GtkWidget *toggle); GtkWidget *toggle);
static void make_preview (void); static void make_preview (void);
static void destroy_preview (void); static void destroy_preview (void);
static void menu_callback (GtkWidget *widget, static void menu_callback (GtkWidget *widget,
gpointer data); gpointer data);
GimpPlugInInfo PLUG_IN_INFO = GimpPlugInInfo PLUG_IN_INFO =
@ -347,24 +347,24 @@ query (void)
} }
static void static void
run (gchar *name, run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals) GimpParam **return_vals)
{ {
static GimpParam values[2]; static GimpParam values[2];
GimpRunModeType run_mode; GimpRunModeType run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpPDBStatusType status = GIMP_PDB_SUCCESS;
gint32 image_ID; gint32 image_ID;
gint32 drawable_ID; gint32 drawable_ID;
gint32 orig_image_ID; gint32 orig_image_ID;
gint32 display_ID = -1; gint32 display_ID = -1;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
GimpParasite *parasite; GimpParasite *parasite;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
gint err; gboolean err;
GimpExportReturnType export = GIMP_EXPORT_CANCEL; GimpExportReturnType export = GIMP_EXPORT_CANCEL;
run_mode = param[0].data.d_int32; run_mode = param[0].data.d_int32;
@ -622,7 +622,7 @@ run (gchar *name,
static guint static guint
jpeg_getc (j_decompress_ptr cinfo) jpeg_getc (j_decompress_ptr cinfo)
{ {
struct jpeg_source_mgr * datasrc = cinfo->src; struct jpeg_source_mgr *datasrc = cinfo->src;
if (datasrc->bytes_in_buffer == 0) if (datasrc->bytes_in_buffer == 0)
{ {
@ -630,6 +630,7 @@ jpeg_getc (j_decompress_ptr cinfo)
ERREXIT (cinfo, JERR_CANT_SUSPEND); ERREXIT (cinfo, JERR_CANT_SUSPEND);
} }
datasrc->bytes_in_buffer--; datasrc->bytes_in_buffer--;
return *datasrc->next_input_byte++; return *datasrc->next_input_byte++;
} }
@ -647,8 +648,8 @@ static GString *local_image_comments = NULL;
static boolean static boolean
COM_handler (j_decompress_ptr cinfo) COM_handler (j_decompress_ptr cinfo)
{ {
int length; gint length;
unsigned int ch; guint ch;
length = jpeg_getc (cinfo) << 8; length = jpeg_getc (cinfo) << 8;
length += jpeg_getc (cinfo); length += jpeg_getc (cinfo);
@ -700,22 +701,22 @@ load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
gint32 volatile image_ID; gint32 volatile image_ID;
gint32 layer_ID; gint32 layer_ID;
struct jpeg_decompress_struct cinfo; struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE *infile; FILE *infile;
guchar *buf; guchar *buf;
guchar * volatile padded_buf = NULL; guchar * volatile padded_buf = NULL;
guchar **rowbuf; guchar **rowbuf;
gchar *name; gchar *name;
gint image_type; gint image_type;
gint layer_type; gint layer_type;
gint tile_height; gint tile_height;
gint scanlines; gint scanlines;
gint i, start, end; gint i, start, end;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals; JpegSaveVals local_save_vals;
@ -723,7 +724,6 @@ load_image (gchar *filename,
GimpParasite * volatile vals_parasite = NULL; GimpParasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
/* We set up the normal JPEG error routines. */ /* We set up the normal JPEG error routines. */
cinfo.err = jpeg_std_error (&jerr.pub); cinfo.err = jpeg_std_error (&jerr.pub);
jerr.pub.error_exit = my_error_exit; jerr.pub.error_exit = my_error_exit;
@ -778,46 +778,47 @@ load_image (gchar *filename,
*/ */
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
if (!preview) { if (!preview)
/* if we had any comments then make a parasite for them */ {
if (local_image_comments && local_image_comments->len) /* if we had any comments then make a parasite for them */
{ if (local_image_comments && local_image_comments->len)
gchar *string = local_image_comments->str; {
g_string_free (local_image_comments, FALSE); gchar *string = local_image_comments->str;
local_image_comments = NULL; g_string_free (local_image_comments, FALSE);
comment_parasite = gimp_parasite_new ("gimp-comment", local_image_comments = NULL;
GIMP_PARASITE_PERSISTENT, comment_parasite = gimp_parasite_new ("gimp-comment",
strlen (string) + 1, string); GIMP_PARASITE_PERSISTENT,
} strlen (string) + 1, string);
else }
{ else
comment_parasite = NULL; {
} comment_parasite = NULL;
}
/* pw - figuring out what the saved values were is non-trivial.
* They don't seem to be in the cinfo structure. For now, I will /* pw - figuring out what the saved values were is non-trivial.
* just use the defaults, but if someone figures out how to derive * They don't seem to be in the cinfo structure. For now, I will
* them this is the place to store them. */ * just use the defaults, but if someone figures out how to derive
* them this is the place to store them. */
local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.smoothing = DEFAULT_SMOOTHING; local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.optimize = DEFAULT_OPTIMIZE; local_save_vals.smoothing = DEFAULT_SMOOTHING;
local_save_vals.optimize = DEFAULT_OPTIMIZE;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
local_save_vals.progressive = cinfo.progressive_mode; local_save_vals.progressive = cinfo.progressive_mode;
#else #else
local_save_vals.progressive = 0; local_save_vals.progressive = 0;
#endif /* HAVE_PROGRESSIVE_JPEG */ #endif /* HAVE_PROGRESSIVE_JPEG */
local_save_vals.baseline = DEFAULT_BASELINE; local_save_vals.baseline = DEFAULT_BASELINE;
local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */ local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */
local_save_vals.restart = DEFAULT_RESTART; local_save_vals.restart = DEFAULT_RESTART;
local_save_vals.dct = DEFAULT_DCT; local_save_vals.dct = DEFAULT_DCT;
local_save_vals.preview = DEFAULT_PREVIEW; local_save_vals.preview = DEFAULT_PREVIEW;
vals_parasite = gimp_parasite_new ("jpeg-save-options", 0, vals_parasite = gimp_parasite_new ("jpeg-save-options", 0,
sizeof (local_save_vals), sizeof (local_save_vals),
&local_save_vals); &local_save_vals);
} }
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
@ -862,14 +863,17 @@ load_image (gchar *filename,
image_type = GIMP_GRAY; image_type = GIMP_GRAY;
layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE; layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE;
break; break;
case 3: case 3:
image_type = GIMP_RGB; image_type = GIMP_RGB;
layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE; layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE;
break; break;
default: default:
g_message ("don't know how to load JPEGs\nwith %d color channels", g_message ("don't know how to load JPEGs\nwith %d color channels",
cinfo.output_components); cinfo.output_components);
gimp_quit (); gimp_quit ();
break;
} }
if (preview) if (preview)
@ -885,10 +889,11 @@ load_image (gchar *filename,
if (preview) if (preview)
{ {
layer_ID_global = layer_ID = gimp_layer_new (image_ID, _("JPEG preview"), layer_ID_global = layer_ID =
cinfo.output_width, gimp_layer_new (image_ID, _("JPEG preview"),
cinfo.output_height, cinfo.output_width,
layer_type, 100, GIMP_NORMAL_MODE); cinfo.output_height,
layer_type, 100, GIMP_NORMAL_MODE);
} }
else else
{ {
@ -951,23 +956,18 @@ load_image (gchar *filename,
while (cinfo.output_scanline < cinfo.output_height) while (cinfo.output_scanline < cinfo.output_height)
{ {
start = cinfo.output_scanline; start = cinfo.output_scanline;
end = cinfo.output_scanline + tile_height; end = cinfo.output_scanline + tile_height;
end = MIN (end, cinfo.output_height); end = MIN (end, cinfo.output_height);
scanlines = end - start; scanlines = end - start;
for (i = 0; i < scanlines; i++) for (i = 0; i < scanlines; i++)
jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1); jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1);
/*
for (i = start; i < end; i++)
gimp_pixel_rgn_set_row (&pixel_rgn, tilerow[i - start], 0, i, drawable->width);
*/
if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */ if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */
{ {
guchar *dest = padded_buf; guchar *dest = padded_buf;
guchar *src = buf; guchar *src = buf;
gint num = drawable->width * scanlines; gint num = drawable->width * scanlines;
switch (cinfo.output_components) switch (cinfo.output_components)
{ {
@ -978,6 +978,7 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
case 3: case 3:
for (i=0; i<num; i++) for (i=0; i<num; i++)
{ {
@ -987,8 +988,10 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
default: default:
g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org"); g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org");
break;
} }
} }
@ -997,7 +1000,8 @@ load_image (gchar *filename,
if (runmode != GIMP_RUN_NONINTERACTIVE) if (runmode != GIMP_RUN_NONINTERACTIVE)
{ {
gimp_progress_update ((double) cinfo.output_scanline / (double) cinfo.output_height); gimp_progress_update ((gdouble) cinfo.output_scanline /
(gdouble) cinfo.output_height);
} }
} }
@ -1046,6 +1050,7 @@ load_image (gchar *filename,
gimp_image_parasite_attach (image_ID, comment_parasite); gimp_image_parasite_attach (image_ID, comment_parasite);
gimp_parasite_free (comment_parasite); gimp_parasite_free (comment_parasite);
} }
if (vals_parasite) if (vals_parasite)
{ {
gimp_image_parasite_attach (image_ID, vals_parasite); gimp_image_parasite_attach (image_ID, vals_parasite);
@ -1070,19 +1075,16 @@ background_error_exit (j_common_ptr cinfo)
(*cinfo->err->output_message) (cinfo); (*cinfo->err->output_message) (cinfo);
} }
static gint static gboolean
background_jpeg_save (PreviewPersistent *pp) background_jpeg_save (PreviewPersistent *pp)
{ {
guchar *t; guchar *t;
guchar *s; guchar *s;
gint i, j; gint i, j;
gint yend; gint yend;
if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height)) if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height))
{ {
struct stat buf;
gchar temp[256];
/* clean up... */ /* clean up... */
if (pp->abort_me) if (pp->abort_me)
{ {
@ -1099,11 +1101,15 @@ background_jpeg_save (PreviewPersistent *pp)
g_free (pp->temp); g_free (pp->temp);
g_free (pp->data); g_free (pp->data);
if (pp->drawable) gimp_drawable_detach (pp->drawable); if (pp->drawable)
gimp_drawable_detach (pp->drawable);
/* display the preview stuff */ /* display the preview stuff */
if (!pp->abort_me) if (!pp->abort_me)
{ {
struct stat buf;
gchar temp[128];
stat (pp->file_name, &buf); stat (pp->file_name, &buf);
g_snprintf (temp, sizeof (temp), g_snprintf (temp, sizeof (temp),
_("Size: %lu bytes (%02.01f kB)"), _("Size: %lu bytes (%02.01f kB)"),
@ -1160,26 +1166,26 @@ background_jpeg_save (PreviewPersistent *pp)
} }
} }
static gint static gboolean
save_image (gchar *filename, save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
GimpImageType drawable_type; GimpImageType drawable_type;
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE * volatile outfile; FILE * volatile outfile;
guchar *temp, *t; guchar *temp, *t;
guchar *data; guchar *data;
guchar *src, *s; guchar *src, *s;
gchar *name; gchar *name;
gint has_alpha; gboolean has_alpha;
gint rowstride, yend; gint rowstride, yend;
gint i, j; gint i, j;
drawable = gimp_drawable_get (drawable_ID); drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID); drawable_type = gimp_drawable_type (drawable_ID);
@ -1245,19 +1251,22 @@ save_image (gchar *filename,
case GIMP_GRAY_IMAGE: case GIMP_GRAY_IMAGE:
/* # of color components per pixel */ /* # of color components per pixel */
cinfo.input_components = drawable->bpp; cinfo.input_components = drawable->bpp;
has_alpha = 0; has_alpha = FALSE;
break; break;
case GIMP_RGBA_IMAGE: case GIMP_RGBA_IMAGE:
case GIMP_GRAYA_IMAGE: case GIMP_GRAYA_IMAGE:
/*gimp_message ("jpeg: image contains a-channel info which will be lost");*/ /*gimp_message ("jpeg: image contains a-channel info which will be lost");*/
/* # of color components per pixel (minus the GIMP alpha channel) */ /* # of color components per pixel (minus the GIMP alpha channel) */
cinfo.input_components = drawable->bpp - 1; cinfo.input_components = drawable->bpp - 1;
has_alpha = 1; has_alpha = TRUE;
break; break;
case GIMP_INDEXED_IMAGE: case GIMP_INDEXED_IMAGE:
/*gimp_message ("jpeg: cannot operate on indexed color images");*/ /*gimp_message ("jpeg: cannot operate on indexed color images");*/
return FALSE; return FALSE;
break; break;
default: default:
/*gimp_message ("jpeg: cannot operate on unknown image types");*/ /*gimp_message ("jpeg: cannot operate on unknown image types");*/
return FALSE; return FALSE;
@ -1282,8 +1291,8 @@ save_image (gchar *filename,
*/ */
jpeg_set_defaults (&cinfo); jpeg_set_defaults (&cinfo);
jpeg_set_quality (&cinfo, (int) (jsvals.quality * 100), jsvals.baseline); jpeg_set_quality (&cinfo, (gint) (jsvals.quality * 100), jsvals.baseline);
cinfo.smoothing_factor = (int) (jsvals.smoothing * 100); cinfo.smoothing_factor = (gint) (jsvals.smoothing * 100);
cinfo.optimize_coding = jsvals.optimize; cinfo.optimize_coding = jsvals.optimize;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
@ -1304,6 +1313,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 1: case 1:
cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].h_samp_factor = 2;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1312,6 +1322,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 2: case 2:
cinfo.comp_info[0].h_samp_factor = 1; cinfo.comp_info[0].h_samp_factor = 1;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1331,9 +1342,11 @@ save_image (gchar *filename,
default: default:
cinfo.dct_method = JDCT_ISLOW; cinfo.dct_method = JDCT_ISLOW;
break; break;
case 1: case 1:
cinfo.dct_method = JDCT_IFAST; cinfo.dct_method = JDCT_IFAST;
break; break;
case 2: case 2:
cinfo.dct_method = JDCT_FLOAT; cinfo.dct_method = JDCT_FLOAT;
break; break;
@ -1432,7 +1445,7 @@ save_image (gchar *filename,
jerr.pub.error_exit = background_error_exit; jerr.pub.error_exit = background_error_exit;
gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer *)pp); gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer) pp);
/* background_jpeg_save() will cleanup as needed */ /* background_jpeg_save() will cleanup as needed */
return TRUE; return TRUE;
@ -1525,21 +1538,25 @@ destroy_preview (void)
{ {
*abort_me = TRUE; /* signal the background save to stop */ *abort_me = TRUE; /* signal the background save to stop */
} }
if (drawable_global) if (drawable_global)
{ {
gimp_drawable_detach (drawable_global); gimp_drawable_detach (drawable_global);
drawable_global = NULL; drawable_global = NULL;
} }
if (layer_ID_global != -1 && image_ID_global != -1) if (layer_ID_global != -1 && image_ID_global != -1)
{ {
/* assuming that reference counting is working correctly,
we do not need to delete the layer, removing it from
the image should be sufficient */
gimp_image_remove_layer (image_ID_global, layer_ID_global); gimp_image_remove_layer (image_ID_global, layer_ID_global);
/* gimp_layer_delete(layer_ID_global); */
layer_ID_global = -1; layer_ID_global = -1;
} }
} }
static gint static gboolean
save_dialog (void) save_dialog (void)
{ {
GtkWidget *dlg; GtkWidget *dlg;
@ -1858,6 +1875,7 @@ save_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GtkWidget *text; GtkWidget *text;
jsint.run = TRUE; jsint.run = TRUE;
/* pw - get the comment text object and grab it's data */ /* pw - get the comment text object and grab it's data */
@ -1898,7 +1916,7 @@ save_restart_update (GtkAdjustment *adjustment,
static void static void
menu_callback (GtkWidget *widget, menu_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
gimp_menu_item_update (widget, data); gimp_menu_item_update (widget, data);
make_preview (); make_preview ();

View File

@ -194,7 +194,7 @@ typedef struct
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
gint tile_height; gint tile_height;
FILE *outfile; FILE *outfile;
gint has_alpha; gboolean has_alpha;
gint rowstride; gint rowstride;
guchar *temp; guchar *temp;
guchar *data; guchar *data;
@ -210,37 +210,37 @@ static gboolean *abort_me = NULL;
/* Declare local functions. /* Declare local functions.
*/ */
static void query (void); static void query (void);
static void run (gchar *name, static void run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals); GimpParam **return_vals);
static gint32 load_image (gchar *filename, static gint32 load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview); gboolean preview);
static gint save_image (gchar *filename, static gboolean save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview); gboolean preview);
static gint save_dialog (void); static gboolean save_dialog (void);
static void save_close_callback (GtkWidget *widget, static void save_close_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_ok_callback (GtkWidget *widget, static void save_ok_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_restart_toggle_update (GtkWidget *toggle, static void save_restart_toggle_update (GtkWidget *toggle,
GtkAdjustment *adjustment); GtkAdjustment *adjustment);
static void save_restart_update (GtkAdjustment *adjustment, static void save_restart_update (GtkAdjustment *adjustment,
GtkWidget *toggle); GtkWidget *toggle);
static void make_preview (void); static void make_preview (void);
static void destroy_preview (void); static void destroy_preview (void);
static void menu_callback (GtkWidget *widget, static void menu_callback (GtkWidget *widget,
gpointer data); gpointer data);
GimpPlugInInfo PLUG_IN_INFO = GimpPlugInInfo PLUG_IN_INFO =
@ -347,24 +347,24 @@ query (void)
} }
static void static void
run (gchar *name, run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals) GimpParam **return_vals)
{ {
static GimpParam values[2]; static GimpParam values[2];
GimpRunModeType run_mode; GimpRunModeType run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpPDBStatusType status = GIMP_PDB_SUCCESS;
gint32 image_ID; gint32 image_ID;
gint32 drawable_ID; gint32 drawable_ID;
gint32 orig_image_ID; gint32 orig_image_ID;
gint32 display_ID = -1; gint32 display_ID = -1;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
GimpParasite *parasite; GimpParasite *parasite;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
gint err; gboolean err;
GimpExportReturnType export = GIMP_EXPORT_CANCEL; GimpExportReturnType export = GIMP_EXPORT_CANCEL;
run_mode = param[0].data.d_int32; run_mode = param[0].data.d_int32;
@ -622,7 +622,7 @@ run (gchar *name,
static guint static guint
jpeg_getc (j_decompress_ptr cinfo) jpeg_getc (j_decompress_ptr cinfo)
{ {
struct jpeg_source_mgr * datasrc = cinfo->src; struct jpeg_source_mgr *datasrc = cinfo->src;
if (datasrc->bytes_in_buffer == 0) if (datasrc->bytes_in_buffer == 0)
{ {
@ -630,6 +630,7 @@ jpeg_getc (j_decompress_ptr cinfo)
ERREXIT (cinfo, JERR_CANT_SUSPEND); ERREXIT (cinfo, JERR_CANT_SUSPEND);
} }
datasrc->bytes_in_buffer--; datasrc->bytes_in_buffer--;
return *datasrc->next_input_byte++; return *datasrc->next_input_byte++;
} }
@ -647,8 +648,8 @@ static GString *local_image_comments = NULL;
static boolean static boolean
COM_handler (j_decompress_ptr cinfo) COM_handler (j_decompress_ptr cinfo)
{ {
int length; gint length;
unsigned int ch; guint ch;
length = jpeg_getc (cinfo) << 8; length = jpeg_getc (cinfo) << 8;
length += jpeg_getc (cinfo); length += jpeg_getc (cinfo);
@ -700,22 +701,22 @@ load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
gint32 volatile image_ID; gint32 volatile image_ID;
gint32 layer_ID; gint32 layer_ID;
struct jpeg_decompress_struct cinfo; struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE *infile; FILE *infile;
guchar *buf; guchar *buf;
guchar * volatile padded_buf = NULL; guchar * volatile padded_buf = NULL;
guchar **rowbuf; guchar **rowbuf;
gchar *name; gchar *name;
gint image_type; gint image_type;
gint layer_type; gint layer_type;
gint tile_height; gint tile_height;
gint scanlines; gint scanlines;
gint i, start, end; gint i, start, end;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals; JpegSaveVals local_save_vals;
@ -723,7 +724,6 @@ load_image (gchar *filename,
GimpParasite * volatile vals_parasite = NULL; GimpParasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
/* We set up the normal JPEG error routines. */ /* We set up the normal JPEG error routines. */
cinfo.err = jpeg_std_error (&jerr.pub); cinfo.err = jpeg_std_error (&jerr.pub);
jerr.pub.error_exit = my_error_exit; jerr.pub.error_exit = my_error_exit;
@ -778,46 +778,47 @@ load_image (gchar *filename,
*/ */
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
if (!preview) { if (!preview)
/* if we had any comments then make a parasite for them */ {
if (local_image_comments && local_image_comments->len) /* if we had any comments then make a parasite for them */
{ if (local_image_comments && local_image_comments->len)
gchar *string = local_image_comments->str; {
g_string_free (local_image_comments, FALSE); gchar *string = local_image_comments->str;
local_image_comments = NULL; g_string_free (local_image_comments, FALSE);
comment_parasite = gimp_parasite_new ("gimp-comment", local_image_comments = NULL;
GIMP_PARASITE_PERSISTENT, comment_parasite = gimp_parasite_new ("gimp-comment",
strlen (string) + 1, string); GIMP_PARASITE_PERSISTENT,
} strlen (string) + 1, string);
else }
{ else
comment_parasite = NULL; {
} comment_parasite = NULL;
}
/* pw - figuring out what the saved values were is non-trivial.
* They don't seem to be in the cinfo structure. For now, I will /* pw - figuring out what the saved values were is non-trivial.
* just use the defaults, but if someone figures out how to derive * They don't seem to be in the cinfo structure. For now, I will
* them this is the place to store them. */ * just use the defaults, but if someone figures out how to derive
* them this is the place to store them. */
local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.smoothing = DEFAULT_SMOOTHING; local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.optimize = DEFAULT_OPTIMIZE; local_save_vals.smoothing = DEFAULT_SMOOTHING;
local_save_vals.optimize = DEFAULT_OPTIMIZE;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
local_save_vals.progressive = cinfo.progressive_mode; local_save_vals.progressive = cinfo.progressive_mode;
#else #else
local_save_vals.progressive = 0; local_save_vals.progressive = 0;
#endif /* HAVE_PROGRESSIVE_JPEG */ #endif /* HAVE_PROGRESSIVE_JPEG */
local_save_vals.baseline = DEFAULT_BASELINE; local_save_vals.baseline = DEFAULT_BASELINE;
local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */ local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */
local_save_vals.restart = DEFAULT_RESTART; local_save_vals.restart = DEFAULT_RESTART;
local_save_vals.dct = DEFAULT_DCT; local_save_vals.dct = DEFAULT_DCT;
local_save_vals.preview = DEFAULT_PREVIEW; local_save_vals.preview = DEFAULT_PREVIEW;
vals_parasite = gimp_parasite_new ("jpeg-save-options", 0, vals_parasite = gimp_parasite_new ("jpeg-save-options", 0,
sizeof (local_save_vals), sizeof (local_save_vals),
&local_save_vals); &local_save_vals);
} }
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
@ -862,14 +863,17 @@ load_image (gchar *filename,
image_type = GIMP_GRAY; image_type = GIMP_GRAY;
layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE; layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE;
break; break;
case 3: case 3:
image_type = GIMP_RGB; image_type = GIMP_RGB;
layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE; layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE;
break; break;
default: default:
g_message ("don't know how to load JPEGs\nwith %d color channels", g_message ("don't know how to load JPEGs\nwith %d color channels",
cinfo.output_components); cinfo.output_components);
gimp_quit (); gimp_quit ();
break;
} }
if (preview) if (preview)
@ -885,10 +889,11 @@ load_image (gchar *filename,
if (preview) if (preview)
{ {
layer_ID_global = layer_ID = gimp_layer_new (image_ID, _("JPEG preview"), layer_ID_global = layer_ID =
cinfo.output_width, gimp_layer_new (image_ID, _("JPEG preview"),
cinfo.output_height, cinfo.output_width,
layer_type, 100, GIMP_NORMAL_MODE); cinfo.output_height,
layer_type, 100, GIMP_NORMAL_MODE);
} }
else else
{ {
@ -951,23 +956,18 @@ load_image (gchar *filename,
while (cinfo.output_scanline < cinfo.output_height) while (cinfo.output_scanline < cinfo.output_height)
{ {
start = cinfo.output_scanline; start = cinfo.output_scanline;
end = cinfo.output_scanline + tile_height; end = cinfo.output_scanline + tile_height;
end = MIN (end, cinfo.output_height); end = MIN (end, cinfo.output_height);
scanlines = end - start; scanlines = end - start;
for (i = 0; i < scanlines; i++) for (i = 0; i < scanlines; i++)
jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1); jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1);
/*
for (i = start; i < end; i++)
gimp_pixel_rgn_set_row (&pixel_rgn, tilerow[i - start], 0, i, drawable->width);
*/
if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */ if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */
{ {
guchar *dest = padded_buf; guchar *dest = padded_buf;
guchar *src = buf; guchar *src = buf;
gint num = drawable->width * scanlines; gint num = drawable->width * scanlines;
switch (cinfo.output_components) switch (cinfo.output_components)
{ {
@ -978,6 +978,7 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
case 3: case 3:
for (i=0; i<num; i++) for (i=0; i<num; i++)
{ {
@ -987,8 +988,10 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
default: default:
g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org"); g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org");
break;
} }
} }
@ -997,7 +1000,8 @@ load_image (gchar *filename,
if (runmode != GIMP_RUN_NONINTERACTIVE) if (runmode != GIMP_RUN_NONINTERACTIVE)
{ {
gimp_progress_update ((double) cinfo.output_scanline / (double) cinfo.output_height); gimp_progress_update ((gdouble) cinfo.output_scanline /
(gdouble) cinfo.output_height);
} }
} }
@ -1046,6 +1050,7 @@ load_image (gchar *filename,
gimp_image_parasite_attach (image_ID, comment_parasite); gimp_image_parasite_attach (image_ID, comment_parasite);
gimp_parasite_free (comment_parasite); gimp_parasite_free (comment_parasite);
} }
if (vals_parasite) if (vals_parasite)
{ {
gimp_image_parasite_attach (image_ID, vals_parasite); gimp_image_parasite_attach (image_ID, vals_parasite);
@ -1070,19 +1075,16 @@ background_error_exit (j_common_ptr cinfo)
(*cinfo->err->output_message) (cinfo); (*cinfo->err->output_message) (cinfo);
} }
static gint static gboolean
background_jpeg_save (PreviewPersistent *pp) background_jpeg_save (PreviewPersistent *pp)
{ {
guchar *t; guchar *t;
guchar *s; guchar *s;
gint i, j; gint i, j;
gint yend; gint yend;
if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height)) if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height))
{ {
struct stat buf;
gchar temp[256];
/* clean up... */ /* clean up... */
if (pp->abort_me) if (pp->abort_me)
{ {
@ -1099,11 +1101,15 @@ background_jpeg_save (PreviewPersistent *pp)
g_free (pp->temp); g_free (pp->temp);
g_free (pp->data); g_free (pp->data);
if (pp->drawable) gimp_drawable_detach (pp->drawable); if (pp->drawable)
gimp_drawable_detach (pp->drawable);
/* display the preview stuff */ /* display the preview stuff */
if (!pp->abort_me) if (!pp->abort_me)
{ {
struct stat buf;
gchar temp[128];
stat (pp->file_name, &buf); stat (pp->file_name, &buf);
g_snprintf (temp, sizeof (temp), g_snprintf (temp, sizeof (temp),
_("Size: %lu bytes (%02.01f kB)"), _("Size: %lu bytes (%02.01f kB)"),
@ -1160,26 +1166,26 @@ background_jpeg_save (PreviewPersistent *pp)
} }
} }
static gint static gboolean
save_image (gchar *filename, save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
GimpImageType drawable_type; GimpImageType drawable_type;
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE * volatile outfile; FILE * volatile outfile;
guchar *temp, *t; guchar *temp, *t;
guchar *data; guchar *data;
guchar *src, *s; guchar *src, *s;
gchar *name; gchar *name;
gint has_alpha; gboolean has_alpha;
gint rowstride, yend; gint rowstride, yend;
gint i, j; gint i, j;
drawable = gimp_drawable_get (drawable_ID); drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID); drawable_type = gimp_drawable_type (drawable_ID);
@ -1245,19 +1251,22 @@ save_image (gchar *filename,
case GIMP_GRAY_IMAGE: case GIMP_GRAY_IMAGE:
/* # of color components per pixel */ /* # of color components per pixel */
cinfo.input_components = drawable->bpp; cinfo.input_components = drawable->bpp;
has_alpha = 0; has_alpha = FALSE;
break; break;
case GIMP_RGBA_IMAGE: case GIMP_RGBA_IMAGE:
case GIMP_GRAYA_IMAGE: case GIMP_GRAYA_IMAGE:
/*gimp_message ("jpeg: image contains a-channel info which will be lost");*/ /*gimp_message ("jpeg: image contains a-channel info which will be lost");*/
/* # of color components per pixel (minus the GIMP alpha channel) */ /* # of color components per pixel (minus the GIMP alpha channel) */
cinfo.input_components = drawable->bpp - 1; cinfo.input_components = drawable->bpp - 1;
has_alpha = 1; has_alpha = TRUE;
break; break;
case GIMP_INDEXED_IMAGE: case GIMP_INDEXED_IMAGE:
/*gimp_message ("jpeg: cannot operate on indexed color images");*/ /*gimp_message ("jpeg: cannot operate on indexed color images");*/
return FALSE; return FALSE;
break; break;
default: default:
/*gimp_message ("jpeg: cannot operate on unknown image types");*/ /*gimp_message ("jpeg: cannot operate on unknown image types");*/
return FALSE; return FALSE;
@ -1282,8 +1291,8 @@ save_image (gchar *filename,
*/ */
jpeg_set_defaults (&cinfo); jpeg_set_defaults (&cinfo);
jpeg_set_quality (&cinfo, (int) (jsvals.quality * 100), jsvals.baseline); jpeg_set_quality (&cinfo, (gint) (jsvals.quality * 100), jsvals.baseline);
cinfo.smoothing_factor = (int) (jsvals.smoothing * 100); cinfo.smoothing_factor = (gint) (jsvals.smoothing * 100);
cinfo.optimize_coding = jsvals.optimize; cinfo.optimize_coding = jsvals.optimize;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
@ -1304,6 +1313,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 1: case 1:
cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].h_samp_factor = 2;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1312,6 +1322,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 2: case 2:
cinfo.comp_info[0].h_samp_factor = 1; cinfo.comp_info[0].h_samp_factor = 1;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1331,9 +1342,11 @@ save_image (gchar *filename,
default: default:
cinfo.dct_method = JDCT_ISLOW; cinfo.dct_method = JDCT_ISLOW;
break; break;
case 1: case 1:
cinfo.dct_method = JDCT_IFAST; cinfo.dct_method = JDCT_IFAST;
break; break;
case 2: case 2:
cinfo.dct_method = JDCT_FLOAT; cinfo.dct_method = JDCT_FLOAT;
break; break;
@ -1432,7 +1445,7 @@ save_image (gchar *filename,
jerr.pub.error_exit = background_error_exit; jerr.pub.error_exit = background_error_exit;
gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer *)pp); gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer) pp);
/* background_jpeg_save() will cleanup as needed */ /* background_jpeg_save() will cleanup as needed */
return TRUE; return TRUE;
@ -1525,21 +1538,25 @@ destroy_preview (void)
{ {
*abort_me = TRUE; /* signal the background save to stop */ *abort_me = TRUE; /* signal the background save to stop */
} }
if (drawable_global) if (drawable_global)
{ {
gimp_drawable_detach (drawable_global); gimp_drawable_detach (drawable_global);
drawable_global = NULL; drawable_global = NULL;
} }
if (layer_ID_global != -1 && image_ID_global != -1) if (layer_ID_global != -1 && image_ID_global != -1)
{ {
/* assuming that reference counting is working correctly,
we do not need to delete the layer, removing it from
the image should be sufficient */
gimp_image_remove_layer (image_ID_global, layer_ID_global); gimp_image_remove_layer (image_ID_global, layer_ID_global);
/* gimp_layer_delete(layer_ID_global); */
layer_ID_global = -1; layer_ID_global = -1;
} }
} }
static gint static gboolean
save_dialog (void) save_dialog (void)
{ {
GtkWidget *dlg; GtkWidget *dlg;
@ -1858,6 +1875,7 @@ save_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GtkWidget *text; GtkWidget *text;
jsint.run = TRUE; jsint.run = TRUE;
/* pw - get the comment text object and grab it's data */ /* pw - get the comment text object and grab it's data */
@ -1898,7 +1916,7 @@ save_restart_update (GtkAdjustment *adjustment,
static void static void
menu_callback (GtkWidget *widget, menu_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
gimp_menu_item_update (widget, data); gimp_menu_item_update (widget, data);
make_preview (); make_preview ();

View File

@ -194,7 +194,7 @@ typedef struct
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
gint tile_height; gint tile_height;
FILE *outfile; FILE *outfile;
gint has_alpha; gboolean has_alpha;
gint rowstride; gint rowstride;
guchar *temp; guchar *temp;
guchar *data; guchar *data;
@ -210,37 +210,37 @@ static gboolean *abort_me = NULL;
/* Declare local functions. /* Declare local functions.
*/ */
static void query (void); static void query (void);
static void run (gchar *name, static void run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals); GimpParam **return_vals);
static gint32 load_image (gchar *filename, static gint32 load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview); gboolean preview);
static gint save_image (gchar *filename, static gboolean save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview); gboolean preview);
static gint save_dialog (void); static gboolean save_dialog (void);
static void save_close_callback (GtkWidget *widget, static void save_close_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_ok_callback (GtkWidget *widget, static void save_ok_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_restart_toggle_update (GtkWidget *toggle, static void save_restart_toggle_update (GtkWidget *toggle,
GtkAdjustment *adjustment); GtkAdjustment *adjustment);
static void save_restart_update (GtkAdjustment *adjustment, static void save_restart_update (GtkAdjustment *adjustment,
GtkWidget *toggle); GtkWidget *toggle);
static void make_preview (void); static void make_preview (void);
static void destroy_preview (void); static void destroy_preview (void);
static void menu_callback (GtkWidget *widget, static void menu_callback (GtkWidget *widget,
gpointer data); gpointer data);
GimpPlugInInfo PLUG_IN_INFO = GimpPlugInInfo PLUG_IN_INFO =
@ -347,24 +347,24 @@ query (void)
} }
static void static void
run (gchar *name, run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals) GimpParam **return_vals)
{ {
static GimpParam values[2]; static GimpParam values[2];
GimpRunModeType run_mode; GimpRunModeType run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpPDBStatusType status = GIMP_PDB_SUCCESS;
gint32 image_ID; gint32 image_ID;
gint32 drawable_ID; gint32 drawable_ID;
gint32 orig_image_ID; gint32 orig_image_ID;
gint32 display_ID = -1; gint32 display_ID = -1;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
GimpParasite *parasite; GimpParasite *parasite;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
gint err; gboolean err;
GimpExportReturnType export = GIMP_EXPORT_CANCEL; GimpExportReturnType export = GIMP_EXPORT_CANCEL;
run_mode = param[0].data.d_int32; run_mode = param[0].data.d_int32;
@ -622,7 +622,7 @@ run (gchar *name,
static guint static guint
jpeg_getc (j_decompress_ptr cinfo) jpeg_getc (j_decompress_ptr cinfo)
{ {
struct jpeg_source_mgr * datasrc = cinfo->src; struct jpeg_source_mgr *datasrc = cinfo->src;
if (datasrc->bytes_in_buffer == 0) if (datasrc->bytes_in_buffer == 0)
{ {
@ -630,6 +630,7 @@ jpeg_getc (j_decompress_ptr cinfo)
ERREXIT (cinfo, JERR_CANT_SUSPEND); ERREXIT (cinfo, JERR_CANT_SUSPEND);
} }
datasrc->bytes_in_buffer--; datasrc->bytes_in_buffer--;
return *datasrc->next_input_byte++; return *datasrc->next_input_byte++;
} }
@ -647,8 +648,8 @@ static GString *local_image_comments = NULL;
static boolean static boolean
COM_handler (j_decompress_ptr cinfo) COM_handler (j_decompress_ptr cinfo)
{ {
int length; gint length;
unsigned int ch; guint ch;
length = jpeg_getc (cinfo) << 8; length = jpeg_getc (cinfo) << 8;
length += jpeg_getc (cinfo); length += jpeg_getc (cinfo);
@ -700,22 +701,22 @@ load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
gint32 volatile image_ID; gint32 volatile image_ID;
gint32 layer_ID; gint32 layer_ID;
struct jpeg_decompress_struct cinfo; struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE *infile; FILE *infile;
guchar *buf; guchar *buf;
guchar * volatile padded_buf = NULL; guchar * volatile padded_buf = NULL;
guchar **rowbuf; guchar **rowbuf;
gchar *name; gchar *name;
gint image_type; gint image_type;
gint layer_type; gint layer_type;
gint tile_height; gint tile_height;
gint scanlines; gint scanlines;
gint i, start, end; gint i, start, end;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals; JpegSaveVals local_save_vals;
@ -723,7 +724,6 @@ load_image (gchar *filename,
GimpParasite * volatile vals_parasite = NULL; GimpParasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
/* We set up the normal JPEG error routines. */ /* We set up the normal JPEG error routines. */
cinfo.err = jpeg_std_error (&jerr.pub); cinfo.err = jpeg_std_error (&jerr.pub);
jerr.pub.error_exit = my_error_exit; jerr.pub.error_exit = my_error_exit;
@ -778,46 +778,47 @@ load_image (gchar *filename,
*/ */
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
if (!preview) { if (!preview)
/* if we had any comments then make a parasite for them */ {
if (local_image_comments && local_image_comments->len) /* if we had any comments then make a parasite for them */
{ if (local_image_comments && local_image_comments->len)
gchar *string = local_image_comments->str; {
g_string_free (local_image_comments, FALSE); gchar *string = local_image_comments->str;
local_image_comments = NULL; g_string_free (local_image_comments, FALSE);
comment_parasite = gimp_parasite_new ("gimp-comment", local_image_comments = NULL;
GIMP_PARASITE_PERSISTENT, comment_parasite = gimp_parasite_new ("gimp-comment",
strlen (string) + 1, string); GIMP_PARASITE_PERSISTENT,
} strlen (string) + 1, string);
else }
{ else
comment_parasite = NULL; {
} comment_parasite = NULL;
}
/* pw - figuring out what the saved values were is non-trivial.
* They don't seem to be in the cinfo structure. For now, I will /* pw - figuring out what the saved values were is non-trivial.
* just use the defaults, but if someone figures out how to derive * They don't seem to be in the cinfo structure. For now, I will
* them this is the place to store them. */ * just use the defaults, but if someone figures out how to derive
* them this is the place to store them. */
local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.smoothing = DEFAULT_SMOOTHING; local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.optimize = DEFAULT_OPTIMIZE; local_save_vals.smoothing = DEFAULT_SMOOTHING;
local_save_vals.optimize = DEFAULT_OPTIMIZE;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
local_save_vals.progressive = cinfo.progressive_mode; local_save_vals.progressive = cinfo.progressive_mode;
#else #else
local_save_vals.progressive = 0; local_save_vals.progressive = 0;
#endif /* HAVE_PROGRESSIVE_JPEG */ #endif /* HAVE_PROGRESSIVE_JPEG */
local_save_vals.baseline = DEFAULT_BASELINE; local_save_vals.baseline = DEFAULT_BASELINE;
local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */ local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */
local_save_vals.restart = DEFAULT_RESTART; local_save_vals.restart = DEFAULT_RESTART;
local_save_vals.dct = DEFAULT_DCT; local_save_vals.dct = DEFAULT_DCT;
local_save_vals.preview = DEFAULT_PREVIEW; local_save_vals.preview = DEFAULT_PREVIEW;
vals_parasite = gimp_parasite_new ("jpeg-save-options", 0, vals_parasite = gimp_parasite_new ("jpeg-save-options", 0,
sizeof (local_save_vals), sizeof (local_save_vals),
&local_save_vals); &local_save_vals);
} }
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
@ -862,14 +863,17 @@ load_image (gchar *filename,
image_type = GIMP_GRAY; image_type = GIMP_GRAY;
layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE; layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE;
break; break;
case 3: case 3:
image_type = GIMP_RGB; image_type = GIMP_RGB;
layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE; layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE;
break; break;
default: default:
g_message ("don't know how to load JPEGs\nwith %d color channels", g_message ("don't know how to load JPEGs\nwith %d color channels",
cinfo.output_components); cinfo.output_components);
gimp_quit (); gimp_quit ();
break;
} }
if (preview) if (preview)
@ -885,10 +889,11 @@ load_image (gchar *filename,
if (preview) if (preview)
{ {
layer_ID_global = layer_ID = gimp_layer_new (image_ID, _("JPEG preview"), layer_ID_global = layer_ID =
cinfo.output_width, gimp_layer_new (image_ID, _("JPEG preview"),
cinfo.output_height, cinfo.output_width,
layer_type, 100, GIMP_NORMAL_MODE); cinfo.output_height,
layer_type, 100, GIMP_NORMAL_MODE);
} }
else else
{ {
@ -951,23 +956,18 @@ load_image (gchar *filename,
while (cinfo.output_scanline < cinfo.output_height) while (cinfo.output_scanline < cinfo.output_height)
{ {
start = cinfo.output_scanline; start = cinfo.output_scanline;
end = cinfo.output_scanline + tile_height; end = cinfo.output_scanline + tile_height;
end = MIN (end, cinfo.output_height); end = MIN (end, cinfo.output_height);
scanlines = end - start; scanlines = end - start;
for (i = 0; i < scanlines; i++) for (i = 0; i < scanlines; i++)
jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1); jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1);
/*
for (i = start; i < end; i++)
gimp_pixel_rgn_set_row (&pixel_rgn, tilerow[i - start], 0, i, drawable->width);
*/
if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */ if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */
{ {
guchar *dest = padded_buf; guchar *dest = padded_buf;
guchar *src = buf; guchar *src = buf;
gint num = drawable->width * scanlines; gint num = drawable->width * scanlines;
switch (cinfo.output_components) switch (cinfo.output_components)
{ {
@ -978,6 +978,7 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
case 3: case 3:
for (i=0; i<num; i++) for (i=0; i<num; i++)
{ {
@ -987,8 +988,10 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
default: default:
g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org"); g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org");
break;
} }
} }
@ -997,7 +1000,8 @@ load_image (gchar *filename,
if (runmode != GIMP_RUN_NONINTERACTIVE) if (runmode != GIMP_RUN_NONINTERACTIVE)
{ {
gimp_progress_update ((double) cinfo.output_scanline / (double) cinfo.output_height); gimp_progress_update ((gdouble) cinfo.output_scanline /
(gdouble) cinfo.output_height);
} }
} }
@ -1046,6 +1050,7 @@ load_image (gchar *filename,
gimp_image_parasite_attach (image_ID, comment_parasite); gimp_image_parasite_attach (image_ID, comment_parasite);
gimp_parasite_free (comment_parasite); gimp_parasite_free (comment_parasite);
} }
if (vals_parasite) if (vals_parasite)
{ {
gimp_image_parasite_attach (image_ID, vals_parasite); gimp_image_parasite_attach (image_ID, vals_parasite);
@ -1070,19 +1075,16 @@ background_error_exit (j_common_ptr cinfo)
(*cinfo->err->output_message) (cinfo); (*cinfo->err->output_message) (cinfo);
} }
static gint static gboolean
background_jpeg_save (PreviewPersistent *pp) background_jpeg_save (PreviewPersistent *pp)
{ {
guchar *t; guchar *t;
guchar *s; guchar *s;
gint i, j; gint i, j;
gint yend; gint yend;
if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height)) if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height))
{ {
struct stat buf;
gchar temp[256];
/* clean up... */ /* clean up... */
if (pp->abort_me) if (pp->abort_me)
{ {
@ -1099,11 +1101,15 @@ background_jpeg_save (PreviewPersistent *pp)
g_free (pp->temp); g_free (pp->temp);
g_free (pp->data); g_free (pp->data);
if (pp->drawable) gimp_drawable_detach (pp->drawable); if (pp->drawable)
gimp_drawable_detach (pp->drawable);
/* display the preview stuff */ /* display the preview stuff */
if (!pp->abort_me) if (!pp->abort_me)
{ {
struct stat buf;
gchar temp[128];
stat (pp->file_name, &buf); stat (pp->file_name, &buf);
g_snprintf (temp, sizeof (temp), g_snprintf (temp, sizeof (temp),
_("Size: %lu bytes (%02.01f kB)"), _("Size: %lu bytes (%02.01f kB)"),
@ -1160,26 +1166,26 @@ background_jpeg_save (PreviewPersistent *pp)
} }
} }
static gint static gboolean
save_image (gchar *filename, save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
GimpImageType drawable_type; GimpImageType drawable_type;
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE * volatile outfile; FILE * volatile outfile;
guchar *temp, *t; guchar *temp, *t;
guchar *data; guchar *data;
guchar *src, *s; guchar *src, *s;
gchar *name; gchar *name;
gint has_alpha; gboolean has_alpha;
gint rowstride, yend; gint rowstride, yend;
gint i, j; gint i, j;
drawable = gimp_drawable_get (drawable_ID); drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID); drawable_type = gimp_drawable_type (drawable_ID);
@ -1245,19 +1251,22 @@ save_image (gchar *filename,
case GIMP_GRAY_IMAGE: case GIMP_GRAY_IMAGE:
/* # of color components per pixel */ /* # of color components per pixel */
cinfo.input_components = drawable->bpp; cinfo.input_components = drawable->bpp;
has_alpha = 0; has_alpha = FALSE;
break; break;
case GIMP_RGBA_IMAGE: case GIMP_RGBA_IMAGE:
case GIMP_GRAYA_IMAGE: case GIMP_GRAYA_IMAGE:
/*gimp_message ("jpeg: image contains a-channel info which will be lost");*/ /*gimp_message ("jpeg: image contains a-channel info which will be lost");*/
/* # of color components per pixel (minus the GIMP alpha channel) */ /* # of color components per pixel (minus the GIMP alpha channel) */
cinfo.input_components = drawable->bpp - 1; cinfo.input_components = drawable->bpp - 1;
has_alpha = 1; has_alpha = TRUE;
break; break;
case GIMP_INDEXED_IMAGE: case GIMP_INDEXED_IMAGE:
/*gimp_message ("jpeg: cannot operate on indexed color images");*/ /*gimp_message ("jpeg: cannot operate on indexed color images");*/
return FALSE; return FALSE;
break; break;
default: default:
/*gimp_message ("jpeg: cannot operate on unknown image types");*/ /*gimp_message ("jpeg: cannot operate on unknown image types");*/
return FALSE; return FALSE;
@ -1282,8 +1291,8 @@ save_image (gchar *filename,
*/ */
jpeg_set_defaults (&cinfo); jpeg_set_defaults (&cinfo);
jpeg_set_quality (&cinfo, (int) (jsvals.quality * 100), jsvals.baseline); jpeg_set_quality (&cinfo, (gint) (jsvals.quality * 100), jsvals.baseline);
cinfo.smoothing_factor = (int) (jsvals.smoothing * 100); cinfo.smoothing_factor = (gint) (jsvals.smoothing * 100);
cinfo.optimize_coding = jsvals.optimize; cinfo.optimize_coding = jsvals.optimize;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
@ -1304,6 +1313,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 1: case 1:
cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].h_samp_factor = 2;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1312,6 +1322,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 2: case 2:
cinfo.comp_info[0].h_samp_factor = 1; cinfo.comp_info[0].h_samp_factor = 1;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1331,9 +1342,11 @@ save_image (gchar *filename,
default: default:
cinfo.dct_method = JDCT_ISLOW; cinfo.dct_method = JDCT_ISLOW;
break; break;
case 1: case 1:
cinfo.dct_method = JDCT_IFAST; cinfo.dct_method = JDCT_IFAST;
break; break;
case 2: case 2:
cinfo.dct_method = JDCT_FLOAT; cinfo.dct_method = JDCT_FLOAT;
break; break;
@ -1432,7 +1445,7 @@ save_image (gchar *filename,
jerr.pub.error_exit = background_error_exit; jerr.pub.error_exit = background_error_exit;
gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer *)pp); gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer) pp);
/* background_jpeg_save() will cleanup as needed */ /* background_jpeg_save() will cleanup as needed */
return TRUE; return TRUE;
@ -1525,21 +1538,25 @@ destroy_preview (void)
{ {
*abort_me = TRUE; /* signal the background save to stop */ *abort_me = TRUE; /* signal the background save to stop */
} }
if (drawable_global) if (drawable_global)
{ {
gimp_drawable_detach (drawable_global); gimp_drawable_detach (drawable_global);
drawable_global = NULL; drawable_global = NULL;
} }
if (layer_ID_global != -1 && image_ID_global != -1) if (layer_ID_global != -1 && image_ID_global != -1)
{ {
/* assuming that reference counting is working correctly,
we do not need to delete the layer, removing it from
the image should be sufficient */
gimp_image_remove_layer (image_ID_global, layer_ID_global); gimp_image_remove_layer (image_ID_global, layer_ID_global);
/* gimp_layer_delete(layer_ID_global); */
layer_ID_global = -1; layer_ID_global = -1;
} }
} }
static gint static gboolean
save_dialog (void) save_dialog (void)
{ {
GtkWidget *dlg; GtkWidget *dlg;
@ -1858,6 +1875,7 @@ save_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GtkWidget *text; GtkWidget *text;
jsint.run = TRUE; jsint.run = TRUE;
/* pw - get the comment text object and grab it's data */ /* pw - get the comment text object and grab it's data */
@ -1898,7 +1916,7 @@ save_restart_update (GtkAdjustment *adjustment,
static void static void
menu_callback (GtkWidget *widget, menu_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
gimp_menu_item_update (widget, data); gimp_menu_item_update (widget, data);
make_preview (); make_preview ();

View File

@ -194,7 +194,7 @@ typedef struct
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
gint tile_height; gint tile_height;
FILE *outfile; FILE *outfile;
gint has_alpha; gboolean has_alpha;
gint rowstride; gint rowstride;
guchar *temp; guchar *temp;
guchar *data; guchar *data;
@ -210,37 +210,37 @@ static gboolean *abort_me = NULL;
/* Declare local functions. /* Declare local functions.
*/ */
static void query (void); static void query (void);
static void run (gchar *name, static void run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals); GimpParam **return_vals);
static gint32 load_image (gchar *filename, static gint32 load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview); gboolean preview);
static gint save_image (gchar *filename, static gboolean save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview); gboolean preview);
static gint save_dialog (void); static gboolean save_dialog (void);
static void save_close_callback (GtkWidget *widget, static void save_close_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_ok_callback (GtkWidget *widget, static void save_ok_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_restart_toggle_update (GtkWidget *toggle, static void save_restart_toggle_update (GtkWidget *toggle,
GtkAdjustment *adjustment); GtkAdjustment *adjustment);
static void save_restart_update (GtkAdjustment *adjustment, static void save_restart_update (GtkAdjustment *adjustment,
GtkWidget *toggle); GtkWidget *toggle);
static void make_preview (void); static void make_preview (void);
static void destroy_preview (void); static void destroy_preview (void);
static void menu_callback (GtkWidget *widget, static void menu_callback (GtkWidget *widget,
gpointer data); gpointer data);
GimpPlugInInfo PLUG_IN_INFO = GimpPlugInInfo PLUG_IN_INFO =
@ -347,24 +347,24 @@ query (void)
} }
static void static void
run (gchar *name, run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals) GimpParam **return_vals)
{ {
static GimpParam values[2]; static GimpParam values[2];
GimpRunModeType run_mode; GimpRunModeType run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpPDBStatusType status = GIMP_PDB_SUCCESS;
gint32 image_ID; gint32 image_ID;
gint32 drawable_ID; gint32 drawable_ID;
gint32 orig_image_ID; gint32 orig_image_ID;
gint32 display_ID = -1; gint32 display_ID = -1;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
GimpParasite *parasite; GimpParasite *parasite;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
gint err; gboolean err;
GimpExportReturnType export = GIMP_EXPORT_CANCEL; GimpExportReturnType export = GIMP_EXPORT_CANCEL;
run_mode = param[0].data.d_int32; run_mode = param[0].data.d_int32;
@ -622,7 +622,7 @@ run (gchar *name,
static guint static guint
jpeg_getc (j_decompress_ptr cinfo) jpeg_getc (j_decompress_ptr cinfo)
{ {
struct jpeg_source_mgr * datasrc = cinfo->src; struct jpeg_source_mgr *datasrc = cinfo->src;
if (datasrc->bytes_in_buffer == 0) if (datasrc->bytes_in_buffer == 0)
{ {
@ -630,6 +630,7 @@ jpeg_getc (j_decompress_ptr cinfo)
ERREXIT (cinfo, JERR_CANT_SUSPEND); ERREXIT (cinfo, JERR_CANT_SUSPEND);
} }
datasrc->bytes_in_buffer--; datasrc->bytes_in_buffer--;
return *datasrc->next_input_byte++; return *datasrc->next_input_byte++;
} }
@ -647,8 +648,8 @@ static GString *local_image_comments = NULL;
static boolean static boolean
COM_handler (j_decompress_ptr cinfo) COM_handler (j_decompress_ptr cinfo)
{ {
int length; gint length;
unsigned int ch; guint ch;
length = jpeg_getc (cinfo) << 8; length = jpeg_getc (cinfo) << 8;
length += jpeg_getc (cinfo); length += jpeg_getc (cinfo);
@ -700,22 +701,22 @@ load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
gint32 volatile image_ID; gint32 volatile image_ID;
gint32 layer_ID; gint32 layer_ID;
struct jpeg_decompress_struct cinfo; struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE *infile; FILE *infile;
guchar *buf; guchar *buf;
guchar * volatile padded_buf = NULL; guchar * volatile padded_buf = NULL;
guchar **rowbuf; guchar **rowbuf;
gchar *name; gchar *name;
gint image_type; gint image_type;
gint layer_type; gint layer_type;
gint tile_height; gint tile_height;
gint scanlines; gint scanlines;
gint i, start, end; gint i, start, end;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals; JpegSaveVals local_save_vals;
@ -723,7 +724,6 @@ load_image (gchar *filename,
GimpParasite * volatile vals_parasite = NULL; GimpParasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
/* We set up the normal JPEG error routines. */ /* We set up the normal JPEG error routines. */
cinfo.err = jpeg_std_error (&jerr.pub); cinfo.err = jpeg_std_error (&jerr.pub);
jerr.pub.error_exit = my_error_exit; jerr.pub.error_exit = my_error_exit;
@ -778,46 +778,47 @@ load_image (gchar *filename,
*/ */
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
if (!preview) { if (!preview)
/* if we had any comments then make a parasite for them */ {
if (local_image_comments && local_image_comments->len) /* if we had any comments then make a parasite for them */
{ if (local_image_comments && local_image_comments->len)
gchar *string = local_image_comments->str; {
g_string_free (local_image_comments, FALSE); gchar *string = local_image_comments->str;
local_image_comments = NULL; g_string_free (local_image_comments, FALSE);
comment_parasite = gimp_parasite_new ("gimp-comment", local_image_comments = NULL;
GIMP_PARASITE_PERSISTENT, comment_parasite = gimp_parasite_new ("gimp-comment",
strlen (string) + 1, string); GIMP_PARASITE_PERSISTENT,
} strlen (string) + 1, string);
else }
{ else
comment_parasite = NULL; {
} comment_parasite = NULL;
}
/* pw - figuring out what the saved values were is non-trivial.
* They don't seem to be in the cinfo structure. For now, I will /* pw - figuring out what the saved values were is non-trivial.
* just use the defaults, but if someone figures out how to derive * They don't seem to be in the cinfo structure. For now, I will
* them this is the place to store them. */ * just use the defaults, but if someone figures out how to derive
* them this is the place to store them. */
local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.smoothing = DEFAULT_SMOOTHING; local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.optimize = DEFAULT_OPTIMIZE; local_save_vals.smoothing = DEFAULT_SMOOTHING;
local_save_vals.optimize = DEFAULT_OPTIMIZE;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
local_save_vals.progressive = cinfo.progressive_mode; local_save_vals.progressive = cinfo.progressive_mode;
#else #else
local_save_vals.progressive = 0; local_save_vals.progressive = 0;
#endif /* HAVE_PROGRESSIVE_JPEG */ #endif /* HAVE_PROGRESSIVE_JPEG */
local_save_vals.baseline = DEFAULT_BASELINE; local_save_vals.baseline = DEFAULT_BASELINE;
local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */ local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */
local_save_vals.restart = DEFAULT_RESTART; local_save_vals.restart = DEFAULT_RESTART;
local_save_vals.dct = DEFAULT_DCT; local_save_vals.dct = DEFAULT_DCT;
local_save_vals.preview = DEFAULT_PREVIEW; local_save_vals.preview = DEFAULT_PREVIEW;
vals_parasite = gimp_parasite_new ("jpeg-save-options", 0, vals_parasite = gimp_parasite_new ("jpeg-save-options", 0,
sizeof (local_save_vals), sizeof (local_save_vals),
&local_save_vals); &local_save_vals);
} }
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
@ -862,14 +863,17 @@ load_image (gchar *filename,
image_type = GIMP_GRAY; image_type = GIMP_GRAY;
layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE; layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE;
break; break;
case 3: case 3:
image_type = GIMP_RGB; image_type = GIMP_RGB;
layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE; layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE;
break; break;
default: default:
g_message ("don't know how to load JPEGs\nwith %d color channels", g_message ("don't know how to load JPEGs\nwith %d color channels",
cinfo.output_components); cinfo.output_components);
gimp_quit (); gimp_quit ();
break;
} }
if (preview) if (preview)
@ -885,10 +889,11 @@ load_image (gchar *filename,
if (preview) if (preview)
{ {
layer_ID_global = layer_ID = gimp_layer_new (image_ID, _("JPEG preview"), layer_ID_global = layer_ID =
cinfo.output_width, gimp_layer_new (image_ID, _("JPEG preview"),
cinfo.output_height, cinfo.output_width,
layer_type, 100, GIMP_NORMAL_MODE); cinfo.output_height,
layer_type, 100, GIMP_NORMAL_MODE);
} }
else else
{ {
@ -951,23 +956,18 @@ load_image (gchar *filename,
while (cinfo.output_scanline < cinfo.output_height) while (cinfo.output_scanline < cinfo.output_height)
{ {
start = cinfo.output_scanline; start = cinfo.output_scanline;
end = cinfo.output_scanline + tile_height; end = cinfo.output_scanline + tile_height;
end = MIN (end, cinfo.output_height); end = MIN (end, cinfo.output_height);
scanlines = end - start; scanlines = end - start;
for (i = 0; i < scanlines; i++) for (i = 0; i < scanlines; i++)
jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1); jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1);
/*
for (i = start; i < end; i++)
gimp_pixel_rgn_set_row (&pixel_rgn, tilerow[i - start], 0, i, drawable->width);
*/
if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */ if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */
{ {
guchar *dest = padded_buf; guchar *dest = padded_buf;
guchar *src = buf; guchar *src = buf;
gint num = drawable->width * scanlines; gint num = drawable->width * scanlines;
switch (cinfo.output_components) switch (cinfo.output_components)
{ {
@ -978,6 +978,7 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
case 3: case 3:
for (i=0; i<num; i++) for (i=0; i<num; i++)
{ {
@ -987,8 +988,10 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
default: default:
g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org"); g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org");
break;
} }
} }
@ -997,7 +1000,8 @@ load_image (gchar *filename,
if (runmode != GIMP_RUN_NONINTERACTIVE) if (runmode != GIMP_RUN_NONINTERACTIVE)
{ {
gimp_progress_update ((double) cinfo.output_scanline / (double) cinfo.output_height); gimp_progress_update ((gdouble) cinfo.output_scanline /
(gdouble) cinfo.output_height);
} }
} }
@ -1046,6 +1050,7 @@ load_image (gchar *filename,
gimp_image_parasite_attach (image_ID, comment_parasite); gimp_image_parasite_attach (image_ID, comment_parasite);
gimp_parasite_free (comment_parasite); gimp_parasite_free (comment_parasite);
} }
if (vals_parasite) if (vals_parasite)
{ {
gimp_image_parasite_attach (image_ID, vals_parasite); gimp_image_parasite_attach (image_ID, vals_parasite);
@ -1070,19 +1075,16 @@ background_error_exit (j_common_ptr cinfo)
(*cinfo->err->output_message) (cinfo); (*cinfo->err->output_message) (cinfo);
} }
static gint static gboolean
background_jpeg_save (PreviewPersistent *pp) background_jpeg_save (PreviewPersistent *pp)
{ {
guchar *t; guchar *t;
guchar *s; guchar *s;
gint i, j; gint i, j;
gint yend; gint yend;
if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height)) if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height))
{ {
struct stat buf;
gchar temp[256];
/* clean up... */ /* clean up... */
if (pp->abort_me) if (pp->abort_me)
{ {
@ -1099,11 +1101,15 @@ background_jpeg_save (PreviewPersistent *pp)
g_free (pp->temp); g_free (pp->temp);
g_free (pp->data); g_free (pp->data);
if (pp->drawable) gimp_drawable_detach (pp->drawable); if (pp->drawable)
gimp_drawable_detach (pp->drawable);
/* display the preview stuff */ /* display the preview stuff */
if (!pp->abort_me) if (!pp->abort_me)
{ {
struct stat buf;
gchar temp[128];
stat (pp->file_name, &buf); stat (pp->file_name, &buf);
g_snprintf (temp, sizeof (temp), g_snprintf (temp, sizeof (temp),
_("Size: %lu bytes (%02.01f kB)"), _("Size: %lu bytes (%02.01f kB)"),
@ -1160,26 +1166,26 @@ background_jpeg_save (PreviewPersistent *pp)
} }
} }
static gint static gboolean
save_image (gchar *filename, save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
GimpImageType drawable_type; GimpImageType drawable_type;
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE * volatile outfile; FILE * volatile outfile;
guchar *temp, *t; guchar *temp, *t;
guchar *data; guchar *data;
guchar *src, *s; guchar *src, *s;
gchar *name; gchar *name;
gint has_alpha; gboolean has_alpha;
gint rowstride, yend; gint rowstride, yend;
gint i, j; gint i, j;
drawable = gimp_drawable_get (drawable_ID); drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID); drawable_type = gimp_drawable_type (drawable_ID);
@ -1245,19 +1251,22 @@ save_image (gchar *filename,
case GIMP_GRAY_IMAGE: case GIMP_GRAY_IMAGE:
/* # of color components per pixel */ /* # of color components per pixel */
cinfo.input_components = drawable->bpp; cinfo.input_components = drawable->bpp;
has_alpha = 0; has_alpha = FALSE;
break; break;
case GIMP_RGBA_IMAGE: case GIMP_RGBA_IMAGE:
case GIMP_GRAYA_IMAGE: case GIMP_GRAYA_IMAGE:
/*gimp_message ("jpeg: image contains a-channel info which will be lost");*/ /*gimp_message ("jpeg: image contains a-channel info which will be lost");*/
/* # of color components per pixel (minus the GIMP alpha channel) */ /* # of color components per pixel (minus the GIMP alpha channel) */
cinfo.input_components = drawable->bpp - 1; cinfo.input_components = drawable->bpp - 1;
has_alpha = 1; has_alpha = TRUE;
break; break;
case GIMP_INDEXED_IMAGE: case GIMP_INDEXED_IMAGE:
/*gimp_message ("jpeg: cannot operate on indexed color images");*/ /*gimp_message ("jpeg: cannot operate on indexed color images");*/
return FALSE; return FALSE;
break; break;
default: default:
/*gimp_message ("jpeg: cannot operate on unknown image types");*/ /*gimp_message ("jpeg: cannot operate on unknown image types");*/
return FALSE; return FALSE;
@ -1282,8 +1291,8 @@ save_image (gchar *filename,
*/ */
jpeg_set_defaults (&cinfo); jpeg_set_defaults (&cinfo);
jpeg_set_quality (&cinfo, (int) (jsvals.quality * 100), jsvals.baseline); jpeg_set_quality (&cinfo, (gint) (jsvals.quality * 100), jsvals.baseline);
cinfo.smoothing_factor = (int) (jsvals.smoothing * 100); cinfo.smoothing_factor = (gint) (jsvals.smoothing * 100);
cinfo.optimize_coding = jsvals.optimize; cinfo.optimize_coding = jsvals.optimize;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
@ -1304,6 +1313,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 1: case 1:
cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].h_samp_factor = 2;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1312,6 +1322,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 2: case 2:
cinfo.comp_info[0].h_samp_factor = 1; cinfo.comp_info[0].h_samp_factor = 1;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1331,9 +1342,11 @@ save_image (gchar *filename,
default: default:
cinfo.dct_method = JDCT_ISLOW; cinfo.dct_method = JDCT_ISLOW;
break; break;
case 1: case 1:
cinfo.dct_method = JDCT_IFAST; cinfo.dct_method = JDCT_IFAST;
break; break;
case 2: case 2:
cinfo.dct_method = JDCT_FLOAT; cinfo.dct_method = JDCT_FLOAT;
break; break;
@ -1432,7 +1445,7 @@ save_image (gchar *filename,
jerr.pub.error_exit = background_error_exit; jerr.pub.error_exit = background_error_exit;
gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer *)pp); gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer) pp);
/* background_jpeg_save() will cleanup as needed */ /* background_jpeg_save() will cleanup as needed */
return TRUE; return TRUE;
@ -1525,21 +1538,25 @@ destroy_preview (void)
{ {
*abort_me = TRUE; /* signal the background save to stop */ *abort_me = TRUE; /* signal the background save to stop */
} }
if (drawable_global) if (drawable_global)
{ {
gimp_drawable_detach (drawable_global); gimp_drawable_detach (drawable_global);
drawable_global = NULL; drawable_global = NULL;
} }
if (layer_ID_global != -1 && image_ID_global != -1) if (layer_ID_global != -1 && image_ID_global != -1)
{ {
/* assuming that reference counting is working correctly,
we do not need to delete the layer, removing it from
the image should be sufficient */
gimp_image_remove_layer (image_ID_global, layer_ID_global); gimp_image_remove_layer (image_ID_global, layer_ID_global);
/* gimp_layer_delete(layer_ID_global); */
layer_ID_global = -1; layer_ID_global = -1;
} }
} }
static gint static gboolean
save_dialog (void) save_dialog (void)
{ {
GtkWidget *dlg; GtkWidget *dlg;
@ -1858,6 +1875,7 @@ save_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GtkWidget *text; GtkWidget *text;
jsint.run = TRUE; jsint.run = TRUE;
/* pw - get the comment text object and grab it's data */ /* pw - get the comment text object and grab it's data */
@ -1898,7 +1916,7 @@ save_restart_update (GtkAdjustment *adjustment,
static void static void
menu_callback (GtkWidget *widget, menu_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
gimp_menu_item_update (widget, data); gimp_menu_item_update (widget, data);
make_preview (); make_preview ();

View File

@ -194,7 +194,7 @@ typedef struct
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
gint tile_height; gint tile_height;
FILE *outfile; FILE *outfile;
gint has_alpha; gboolean has_alpha;
gint rowstride; gint rowstride;
guchar *temp; guchar *temp;
guchar *data; guchar *data;
@ -210,37 +210,37 @@ static gboolean *abort_me = NULL;
/* Declare local functions. /* Declare local functions.
*/ */
static void query (void); static void query (void);
static void run (gchar *name, static void run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals); GimpParam **return_vals);
static gint32 load_image (gchar *filename, static gint32 load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview); gboolean preview);
static gint save_image (gchar *filename, static gboolean save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview); gboolean preview);
static gint save_dialog (void); static gboolean save_dialog (void);
static void save_close_callback (GtkWidget *widget, static void save_close_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_ok_callback (GtkWidget *widget, static void save_ok_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_restart_toggle_update (GtkWidget *toggle, static void save_restart_toggle_update (GtkWidget *toggle,
GtkAdjustment *adjustment); GtkAdjustment *adjustment);
static void save_restart_update (GtkAdjustment *adjustment, static void save_restart_update (GtkAdjustment *adjustment,
GtkWidget *toggle); GtkWidget *toggle);
static void make_preview (void); static void make_preview (void);
static void destroy_preview (void); static void destroy_preview (void);
static void menu_callback (GtkWidget *widget, static void menu_callback (GtkWidget *widget,
gpointer data); gpointer data);
GimpPlugInInfo PLUG_IN_INFO = GimpPlugInInfo PLUG_IN_INFO =
@ -347,24 +347,24 @@ query (void)
} }
static void static void
run (gchar *name, run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals) GimpParam **return_vals)
{ {
static GimpParam values[2]; static GimpParam values[2];
GimpRunModeType run_mode; GimpRunModeType run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpPDBStatusType status = GIMP_PDB_SUCCESS;
gint32 image_ID; gint32 image_ID;
gint32 drawable_ID; gint32 drawable_ID;
gint32 orig_image_ID; gint32 orig_image_ID;
gint32 display_ID = -1; gint32 display_ID = -1;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
GimpParasite *parasite; GimpParasite *parasite;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
gint err; gboolean err;
GimpExportReturnType export = GIMP_EXPORT_CANCEL; GimpExportReturnType export = GIMP_EXPORT_CANCEL;
run_mode = param[0].data.d_int32; run_mode = param[0].data.d_int32;
@ -622,7 +622,7 @@ run (gchar *name,
static guint static guint
jpeg_getc (j_decompress_ptr cinfo) jpeg_getc (j_decompress_ptr cinfo)
{ {
struct jpeg_source_mgr * datasrc = cinfo->src; struct jpeg_source_mgr *datasrc = cinfo->src;
if (datasrc->bytes_in_buffer == 0) if (datasrc->bytes_in_buffer == 0)
{ {
@ -630,6 +630,7 @@ jpeg_getc (j_decompress_ptr cinfo)
ERREXIT (cinfo, JERR_CANT_SUSPEND); ERREXIT (cinfo, JERR_CANT_SUSPEND);
} }
datasrc->bytes_in_buffer--; datasrc->bytes_in_buffer--;
return *datasrc->next_input_byte++; return *datasrc->next_input_byte++;
} }
@ -647,8 +648,8 @@ static GString *local_image_comments = NULL;
static boolean static boolean
COM_handler (j_decompress_ptr cinfo) COM_handler (j_decompress_ptr cinfo)
{ {
int length; gint length;
unsigned int ch; guint ch;
length = jpeg_getc (cinfo) << 8; length = jpeg_getc (cinfo) << 8;
length += jpeg_getc (cinfo); length += jpeg_getc (cinfo);
@ -700,22 +701,22 @@ load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
gint32 volatile image_ID; gint32 volatile image_ID;
gint32 layer_ID; gint32 layer_ID;
struct jpeg_decompress_struct cinfo; struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE *infile; FILE *infile;
guchar *buf; guchar *buf;
guchar * volatile padded_buf = NULL; guchar * volatile padded_buf = NULL;
guchar **rowbuf; guchar **rowbuf;
gchar *name; gchar *name;
gint image_type; gint image_type;
gint layer_type; gint layer_type;
gint tile_height; gint tile_height;
gint scanlines; gint scanlines;
gint i, start, end; gint i, start, end;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals; JpegSaveVals local_save_vals;
@ -723,7 +724,6 @@ load_image (gchar *filename,
GimpParasite * volatile vals_parasite = NULL; GimpParasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
/* We set up the normal JPEG error routines. */ /* We set up the normal JPEG error routines. */
cinfo.err = jpeg_std_error (&jerr.pub); cinfo.err = jpeg_std_error (&jerr.pub);
jerr.pub.error_exit = my_error_exit; jerr.pub.error_exit = my_error_exit;
@ -778,46 +778,47 @@ load_image (gchar *filename,
*/ */
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
if (!preview) { if (!preview)
/* if we had any comments then make a parasite for them */ {
if (local_image_comments && local_image_comments->len) /* if we had any comments then make a parasite for them */
{ if (local_image_comments && local_image_comments->len)
gchar *string = local_image_comments->str; {
g_string_free (local_image_comments, FALSE); gchar *string = local_image_comments->str;
local_image_comments = NULL; g_string_free (local_image_comments, FALSE);
comment_parasite = gimp_parasite_new ("gimp-comment", local_image_comments = NULL;
GIMP_PARASITE_PERSISTENT, comment_parasite = gimp_parasite_new ("gimp-comment",
strlen (string) + 1, string); GIMP_PARASITE_PERSISTENT,
} strlen (string) + 1, string);
else }
{ else
comment_parasite = NULL; {
} comment_parasite = NULL;
}
/* pw - figuring out what the saved values were is non-trivial.
* They don't seem to be in the cinfo structure. For now, I will /* pw - figuring out what the saved values were is non-trivial.
* just use the defaults, but if someone figures out how to derive * They don't seem to be in the cinfo structure. For now, I will
* them this is the place to store them. */ * just use the defaults, but if someone figures out how to derive
* them this is the place to store them. */
local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.smoothing = DEFAULT_SMOOTHING; local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.optimize = DEFAULT_OPTIMIZE; local_save_vals.smoothing = DEFAULT_SMOOTHING;
local_save_vals.optimize = DEFAULT_OPTIMIZE;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
local_save_vals.progressive = cinfo.progressive_mode; local_save_vals.progressive = cinfo.progressive_mode;
#else #else
local_save_vals.progressive = 0; local_save_vals.progressive = 0;
#endif /* HAVE_PROGRESSIVE_JPEG */ #endif /* HAVE_PROGRESSIVE_JPEG */
local_save_vals.baseline = DEFAULT_BASELINE; local_save_vals.baseline = DEFAULT_BASELINE;
local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */ local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */
local_save_vals.restart = DEFAULT_RESTART; local_save_vals.restart = DEFAULT_RESTART;
local_save_vals.dct = DEFAULT_DCT; local_save_vals.dct = DEFAULT_DCT;
local_save_vals.preview = DEFAULT_PREVIEW; local_save_vals.preview = DEFAULT_PREVIEW;
vals_parasite = gimp_parasite_new ("jpeg-save-options", 0, vals_parasite = gimp_parasite_new ("jpeg-save-options", 0,
sizeof (local_save_vals), sizeof (local_save_vals),
&local_save_vals); &local_save_vals);
} }
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
@ -862,14 +863,17 @@ load_image (gchar *filename,
image_type = GIMP_GRAY; image_type = GIMP_GRAY;
layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE; layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE;
break; break;
case 3: case 3:
image_type = GIMP_RGB; image_type = GIMP_RGB;
layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE; layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE;
break; break;
default: default:
g_message ("don't know how to load JPEGs\nwith %d color channels", g_message ("don't know how to load JPEGs\nwith %d color channels",
cinfo.output_components); cinfo.output_components);
gimp_quit (); gimp_quit ();
break;
} }
if (preview) if (preview)
@ -885,10 +889,11 @@ load_image (gchar *filename,
if (preview) if (preview)
{ {
layer_ID_global = layer_ID = gimp_layer_new (image_ID, _("JPEG preview"), layer_ID_global = layer_ID =
cinfo.output_width, gimp_layer_new (image_ID, _("JPEG preview"),
cinfo.output_height, cinfo.output_width,
layer_type, 100, GIMP_NORMAL_MODE); cinfo.output_height,
layer_type, 100, GIMP_NORMAL_MODE);
} }
else else
{ {
@ -951,23 +956,18 @@ load_image (gchar *filename,
while (cinfo.output_scanline < cinfo.output_height) while (cinfo.output_scanline < cinfo.output_height)
{ {
start = cinfo.output_scanline; start = cinfo.output_scanline;
end = cinfo.output_scanline + tile_height; end = cinfo.output_scanline + tile_height;
end = MIN (end, cinfo.output_height); end = MIN (end, cinfo.output_height);
scanlines = end - start; scanlines = end - start;
for (i = 0; i < scanlines; i++) for (i = 0; i < scanlines; i++)
jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1); jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1);
/*
for (i = start; i < end; i++)
gimp_pixel_rgn_set_row (&pixel_rgn, tilerow[i - start], 0, i, drawable->width);
*/
if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */ if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */
{ {
guchar *dest = padded_buf; guchar *dest = padded_buf;
guchar *src = buf; guchar *src = buf;
gint num = drawable->width * scanlines; gint num = drawable->width * scanlines;
switch (cinfo.output_components) switch (cinfo.output_components)
{ {
@ -978,6 +978,7 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
case 3: case 3:
for (i=0; i<num; i++) for (i=0; i<num; i++)
{ {
@ -987,8 +988,10 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
default: default:
g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org"); g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org");
break;
} }
} }
@ -997,7 +1000,8 @@ load_image (gchar *filename,
if (runmode != GIMP_RUN_NONINTERACTIVE) if (runmode != GIMP_RUN_NONINTERACTIVE)
{ {
gimp_progress_update ((double) cinfo.output_scanline / (double) cinfo.output_height); gimp_progress_update ((gdouble) cinfo.output_scanline /
(gdouble) cinfo.output_height);
} }
} }
@ -1046,6 +1050,7 @@ load_image (gchar *filename,
gimp_image_parasite_attach (image_ID, comment_parasite); gimp_image_parasite_attach (image_ID, comment_parasite);
gimp_parasite_free (comment_parasite); gimp_parasite_free (comment_parasite);
} }
if (vals_parasite) if (vals_parasite)
{ {
gimp_image_parasite_attach (image_ID, vals_parasite); gimp_image_parasite_attach (image_ID, vals_parasite);
@ -1070,19 +1075,16 @@ background_error_exit (j_common_ptr cinfo)
(*cinfo->err->output_message) (cinfo); (*cinfo->err->output_message) (cinfo);
} }
static gint static gboolean
background_jpeg_save (PreviewPersistent *pp) background_jpeg_save (PreviewPersistent *pp)
{ {
guchar *t; guchar *t;
guchar *s; guchar *s;
gint i, j; gint i, j;
gint yend; gint yend;
if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height)) if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height))
{ {
struct stat buf;
gchar temp[256];
/* clean up... */ /* clean up... */
if (pp->abort_me) if (pp->abort_me)
{ {
@ -1099,11 +1101,15 @@ background_jpeg_save (PreviewPersistent *pp)
g_free (pp->temp); g_free (pp->temp);
g_free (pp->data); g_free (pp->data);
if (pp->drawable) gimp_drawable_detach (pp->drawable); if (pp->drawable)
gimp_drawable_detach (pp->drawable);
/* display the preview stuff */ /* display the preview stuff */
if (!pp->abort_me) if (!pp->abort_me)
{ {
struct stat buf;
gchar temp[128];
stat (pp->file_name, &buf); stat (pp->file_name, &buf);
g_snprintf (temp, sizeof (temp), g_snprintf (temp, sizeof (temp),
_("Size: %lu bytes (%02.01f kB)"), _("Size: %lu bytes (%02.01f kB)"),
@ -1160,26 +1166,26 @@ background_jpeg_save (PreviewPersistent *pp)
} }
} }
static gint static gboolean
save_image (gchar *filename, save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
GimpImageType drawable_type; GimpImageType drawable_type;
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE * volatile outfile; FILE * volatile outfile;
guchar *temp, *t; guchar *temp, *t;
guchar *data; guchar *data;
guchar *src, *s; guchar *src, *s;
gchar *name; gchar *name;
gint has_alpha; gboolean has_alpha;
gint rowstride, yend; gint rowstride, yend;
gint i, j; gint i, j;
drawable = gimp_drawable_get (drawable_ID); drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID); drawable_type = gimp_drawable_type (drawable_ID);
@ -1245,19 +1251,22 @@ save_image (gchar *filename,
case GIMP_GRAY_IMAGE: case GIMP_GRAY_IMAGE:
/* # of color components per pixel */ /* # of color components per pixel */
cinfo.input_components = drawable->bpp; cinfo.input_components = drawable->bpp;
has_alpha = 0; has_alpha = FALSE;
break; break;
case GIMP_RGBA_IMAGE: case GIMP_RGBA_IMAGE:
case GIMP_GRAYA_IMAGE: case GIMP_GRAYA_IMAGE:
/*gimp_message ("jpeg: image contains a-channel info which will be lost");*/ /*gimp_message ("jpeg: image contains a-channel info which will be lost");*/
/* # of color components per pixel (minus the GIMP alpha channel) */ /* # of color components per pixel (minus the GIMP alpha channel) */
cinfo.input_components = drawable->bpp - 1; cinfo.input_components = drawable->bpp - 1;
has_alpha = 1; has_alpha = TRUE;
break; break;
case GIMP_INDEXED_IMAGE: case GIMP_INDEXED_IMAGE:
/*gimp_message ("jpeg: cannot operate on indexed color images");*/ /*gimp_message ("jpeg: cannot operate on indexed color images");*/
return FALSE; return FALSE;
break; break;
default: default:
/*gimp_message ("jpeg: cannot operate on unknown image types");*/ /*gimp_message ("jpeg: cannot operate on unknown image types");*/
return FALSE; return FALSE;
@ -1282,8 +1291,8 @@ save_image (gchar *filename,
*/ */
jpeg_set_defaults (&cinfo); jpeg_set_defaults (&cinfo);
jpeg_set_quality (&cinfo, (int) (jsvals.quality * 100), jsvals.baseline); jpeg_set_quality (&cinfo, (gint) (jsvals.quality * 100), jsvals.baseline);
cinfo.smoothing_factor = (int) (jsvals.smoothing * 100); cinfo.smoothing_factor = (gint) (jsvals.smoothing * 100);
cinfo.optimize_coding = jsvals.optimize; cinfo.optimize_coding = jsvals.optimize;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
@ -1304,6 +1313,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 1: case 1:
cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].h_samp_factor = 2;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1312,6 +1322,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 2: case 2:
cinfo.comp_info[0].h_samp_factor = 1; cinfo.comp_info[0].h_samp_factor = 1;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1331,9 +1342,11 @@ save_image (gchar *filename,
default: default:
cinfo.dct_method = JDCT_ISLOW; cinfo.dct_method = JDCT_ISLOW;
break; break;
case 1: case 1:
cinfo.dct_method = JDCT_IFAST; cinfo.dct_method = JDCT_IFAST;
break; break;
case 2: case 2:
cinfo.dct_method = JDCT_FLOAT; cinfo.dct_method = JDCT_FLOAT;
break; break;
@ -1432,7 +1445,7 @@ save_image (gchar *filename,
jerr.pub.error_exit = background_error_exit; jerr.pub.error_exit = background_error_exit;
gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer *)pp); gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer) pp);
/* background_jpeg_save() will cleanup as needed */ /* background_jpeg_save() will cleanup as needed */
return TRUE; return TRUE;
@ -1525,21 +1538,25 @@ destroy_preview (void)
{ {
*abort_me = TRUE; /* signal the background save to stop */ *abort_me = TRUE; /* signal the background save to stop */
} }
if (drawable_global) if (drawable_global)
{ {
gimp_drawable_detach (drawable_global); gimp_drawable_detach (drawable_global);
drawable_global = NULL; drawable_global = NULL;
} }
if (layer_ID_global != -1 && image_ID_global != -1) if (layer_ID_global != -1 && image_ID_global != -1)
{ {
/* assuming that reference counting is working correctly,
we do not need to delete the layer, removing it from
the image should be sufficient */
gimp_image_remove_layer (image_ID_global, layer_ID_global); gimp_image_remove_layer (image_ID_global, layer_ID_global);
/* gimp_layer_delete(layer_ID_global); */
layer_ID_global = -1; layer_ID_global = -1;
} }
} }
static gint static gboolean
save_dialog (void) save_dialog (void)
{ {
GtkWidget *dlg; GtkWidget *dlg;
@ -1858,6 +1875,7 @@ save_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GtkWidget *text; GtkWidget *text;
jsint.run = TRUE; jsint.run = TRUE;
/* pw - get the comment text object and grab it's data */ /* pw - get the comment text object and grab it's data */
@ -1898,7 +1916,7 @@ save_restart_update (GtkAdjustment *adjustment,
static void static void
menu_callback (GtkWidget *widget, menu_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
gimp_menu_item_update (widget, data); gimp_menu_item_update (widget, data);
make_preview (); make_preview ();

View File

@ -194,7 +194,7 @@ typedef struct
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
gint tile_height; gint tile_height;
FILE *outfile; FILE *outfile;
gint has_alpha; gboolean has_alpha;
gint rowstride; gint rowstride;
guchar *temp; guchar *temp;
guchar *data; guchar *data;
@ -210,37 +210,37 @@ static gboolean *abort_me = NULL;
/* Declare local functions. /* Declare local functions.
*/ */
static void query (void); static void query (void);
static void run (gchar *name, static void run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals); GimpParam **return_vals);
static gint32 load_image (gchar *filename, static gint32 load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview); gboolean preview);
static gint save_image (gchar *filename, static gboolean save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview); gboolean preview);
static gint save_dialog (void); static gboolean save_dialog (void);
static void save_close_callback (GtkWidget *widget, static void save_close_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_ok_callback (GtkWidget *widget, static void save_ok_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_restart_toggle_update (GtkWidget *toggle, static void save_restart_toggle_update (GtkWidget *toggle,
GtkAdjustment *adjustment); GtkAdjustment *adjustment);
static void save_restart_update (GtkAdjustment *adjustment, static void save_restart_update (GtkAdjustment *adjustment,
GtkWidget *toggle); GtkWidget *toggle);
static void make_preview (void); static void make_preview (void);
static void destroy_preview (void); static void destroy_preview (void);
static void menu_callback (GtkWidget *widget, static void menu_callback (GtkWidget *widget,
gpointer data); gpointer data);
GimpPlugInInfo PLUG_IN_INFO = GimpPlugInInfo PLUG_IN_INFO =
@ -347,24 +347,24 @@ query (void)
} }
static void static void
run (gchar *name, run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals) GimpParam **return_vals)
{ {
static GimpParam values[2]; static GimpParam values[2];
GimpRunModeType run_mode; GimpRunModeType run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpPDBStatusType status = GIMP_PDB_SUCCESS;
gint32 image_ID; gint32 image_ID;
gint32 drawable_ID; gint32 drawable_ID;
gint32 orig_image_ID; gint32 orig_image_ID;
gint32 display_ID = -1; gint32 display_ID = -1;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
GimpParasite *parasite; GimpParasite *parasite;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
gint err; gboolean err;
GimpExportReturnType export = GIMP_EXPORT_CANCEL; GimpExportReturnType export = GIMP_EXPORT_CANCEL;
run_mode = param[0].data.d_int32; run_mode = param[0].data.d_int32;
@ -622,7 +622,7 @@ run (gchar *name,
static guint static guint
jpeg_getc (j_decompress_ptr cinfo) jpeg_getc (j_decompress_ptr cinfo)
{ {
struct jpeg_source_mgr * datasrc = cinfo->src; struct jpeg_source_mgr *datasrc = cinfo->src;
if (datasrc->bytes_in_buffer == 0) if (datasrc->bytes_in_buffer == 0)
{ {
@ -630,6 +630,7 @@ jpeg_getc (j_decompress_ptr cinfo)
ERREXIT (cinfo, JERR_CANT_SUSPEND); ERREXIT (cinfo, JERR_CANT_SUSPEND);
} }
datasrc->bytes_in_buffer--; datasrc->bytes_in_buffer--;
return *datasrc->next_input_byte++; return *datasrc->next_input_byte++;
} }
@ -647,8 +648,8 @@ static GString *local_image_comments = NULL;
static boolean static boolean
COM_handler (j_decompress_ptr cinfo) COM_handler (j_decompress_ptr cinfo)
{ {
int length; gint length;
unsigned int ch; guint ch;
length = jpeg_getc (cinfo) << 8; length = jpeg_getc (cinfo) << 8;
length += jpeg_getc (cinfo); length += jpeg_getc (cinfo);
@ -700,22 +701,22 @@ load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
gint32 volatile image_ID; gint32 volatile image_ID;
gint32 layer_ID; gint32 layer_ID;
struct jpeg_decompress_struct cinfo; struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE *infile; FILE *infile;
guchar *buf; guchar *buf;
guchar * volatile padded_buf = NULL; guchar * volatile padded_buf = NULL;
guchar **rowbuf; guchar **rowbuf;
gchar *name; gchar *name;
gint image_type; gint image_type;
gint layer_type; gint layer_type;
gint tile_height; gint tile_height;
gint scanlines; gint scanlines;
gint i, start, end; gint i, start, end;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals; JpegSaveVals local_save_vals;
@ -723,7 +724,6 @@ load_image (gchar *filename,
GimpParasite * volatile vals_parasite = NULL; GimpParasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
/* We set up the normal JPEG error routines. */ /* We set up the normal JPEG error routines. */
cinfo.err = jpeg_std_error (&jerr.pub); cinfo.err = jpeg_std_error (&jerr.pub);
jerr.pub.error_exit = my_error_exit; jerr.pub.error_exit = my_error_exit;
@ -778,46 +778,47 @@ load_image (gchar *filename,
*/ */
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
if (!preview) { if (!preview)
/* if we had any comments then make a parasite for them */ {
if (local_image_comments && local_image_comments->len) /* if we had any comments then make a parasite for them */
{ if (local_image_comments && local_image_comments->len)
gchar *string = local_image_comments->str; {
g_string_free (local_image_comments, FALSE); gchar *string = local_image_comments->str;
local_image_comments = NULL; g_string_free (local_image_comments, FALSE);
comment_parasite = gimp_parasite_new ("gimp-comment", local_image_comments = NULL;
GIMP_PARASITE_PERSISTENT, comment_parasite = gimp_parasite_new ("gimp-comment",
strlen (string) + 1, string); GIMP_PARASITE_PERSISTENT,
} strlen (string) + 1, string);
else }
{ else
comment_parasite = NULL; {
} comment_parasite = NULL;
}
/* pw - figuring out what the saved values were is non-trivial.
* They don't seem to be in the cinfo structure. For now, I will /* pw - figuring out what the saved values were is non-trivial.
* just use the defaults, but if someone figures out how to derive * They don't seem to be in the cinfo structure. For now, I will
* them this is the place to store them. */ * just use the defaults, but if someone figures out how to derive
* them this is the place to store them. */
local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.smoothing = DEFAULT_SMOOTHING; local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.optimize = DEFAULT_OPTIMIZE; local_save_vals.smoothing = DEFAULT_SMOOTHING;
local_save_vals.optimize = DEFAULT_OPTIMIZE;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
local_save_vals.progressive = cinfo.progressive_mode; local_save_vals.progressive = cinfo.progressive_mode;
#else #else
local_save_vals.progressive = 0; local_save_vals.progressive = 0;
#endif /* HAVE_PROGRESSIVE_JPEG */ #endif /* HAVE_PROGRESSIVE_JPEG */
local_save_vals.baseline = DEFAULT_BASELINE; local_save_vals.baseline = DEFAULT_BASELINE;
local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */ local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */
local_save_vals.restart = DEFAULT_RESTART; local_save_vals.restart = DEFAULT_RESTART;
local_save_vals.dct = DEFAULT_DCT; local_save_vals.dct = DEFAULT_DCT;
local_save_vals.preview = DEFAULT_PREVIEW; local_save_vals.preview = DEFAULT_PREVIEW;
vals_parasite = gimp_parasite_new ("jpeg-save-options", 0, vals_parasite = gimp_parasite_new ("jpeg-save-options", 0,
sizeof (local_save_vals), sizeof (local_save_vals),
&local_save_vals); &local_save_vals);
} }
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
@ -862,14 +863,17 @@ load_image (gchar *filename,
image_type = GIMP_GRAY; image_type = GIMP_GRAY;
layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE; layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE;
break; break;
case 3: case 3:
image_type = GIMP_RGB; image_type = GIMP_RGB;
layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE; layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE;
break; break;
default: default:
g_message ("don't know how to load JPEGs\nwith %d color channels", g_message ("don't know how to load JPEGs\nwith %d color channels",
cinfo.output_components); cinfo.output_components);
gimp_quit (); gimp_quit ();
break;
} }
if (preview) if (preview)
@ -885,10 +889,11 @@ load_image (gchar *filename,
if (preview) if (preview)
{ {
layer_ID_global = layer_ID = gimp_layer_new (image_ID, _("JPEG preview"), layer_ID_global = layer_ID =
cinfo.output_width, gimp_layer_new (image_ID, _("JPEG preview"),
cinfo.output_height, cinfo.output_width,
layer_type, 100, GIMP_NORMAL_MODE); cinfo.output_height,
layer_type, 100, GIMP_NORMAL_MODE);
} }
else else
{ {
@ -951,23 +956,18 @@ load_image (gchar *filename,
while (cinfo.output_scanline < cinfo.output_height) while (cinfo.output_scanline < cinfo.output_height)
{ {
start = cinfo.output_scanline; start = cinfo.output_scanline;
end = cinfo.output_scanline + tile_height; end = cinfo.output_scanline + tile_height;
end = MIN (end, cinfo.output_height); end = MIN (end, cinfo.output_height);
scanlines = end - start; scanlines = end - start;
for (i = 0; i < scanlines; i++) for (i = 0; i < scanlines; i++)
jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1); jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1);
/*
for (i = start; i < end; i++)
gimp_pixel_rgn_set_row (&pixel_rgn, tilerow[i - start], 0, i, drawable->width);
*/
if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */ if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */
{ {
guchar *dest = padded_buf; guchar *dest = padded_buf;
guchar *src = buf; guchar *src = buf;
gint num = drawable->width * scanlines; gint num = drawable->width * scanlines;
switch (cinfo.output_components) switch (cinfo.output_components)
{ {
@ -978,6 +978,7 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
case 3: case 3:
for (i=0; i<num; i++) for (i=0; i<num; i++)
{ {
@ -987,8 +988,10 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
default: default:
g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org"); g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org");
break;
} }
} }
@ -997,7 +1000,8 @@ load_image (gchar *filename,
if (runmode != GIMP_RUN_NONINTERACTIVE) if (runmode != GIMP_RUN_NONINTERACTIVE)
{ {
gimp_progress_update ((double) cinfo.output_scanline / (double) cinfo.output_height); gimp_progress_update ((gdouble) cinfo.output_scanline /
(gdouble) cinfo.output_height);
} }
} }
@ -1046,6 +1050,7 @@ load_image (gchar *filename,
gimp_image_parasite_attach (image_ID, comment_parasite); gimp_image_parasite_attach (image_ID, comment_parasite);
gimp_parasite_free (comment_parasite); gimp_parasite_free (comment_parasite);
} }
if (vals_parasite) if (vals_parasite)
{ {
gimp_image_parasite_attach (image_ID, vals_parasite); gimp_image_parasite_attach (image_ID, vals_parasite);
@ -1070,19 +1075,16 @@ background_error_exit (j_common_ptr cinfo)
(*cinfo->err->output_message) (cinfo); (*cinfo->err->output_message) (cinfo);
} }
static gint static gboolean
background_jpeg_save (PreviewPersistent *pp) background_jpeg_save (PreviewPersistent *pp)
{ {
guchar *t; guchar *t;
guchar *s; guchar *s;
gint i, j; gint i, j;
gint yend; gint yend;
if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height)) if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height))
{ {
struct stat buf;
gchar temp[256];
/* clean up... */ /* clean up... */
if (pp->abort_me) if (pp->abort_me)
{ {
@ -1099,11 +1101,15 @@ background_jpeg_save (PreviewPersistent *pp)
g_free (pp->temp); g_free (pp->temp);
g_free (pp->data); g_free (pp->data);
if (pp->drawable) gimp_drawable_detach (pp->drawable); if (pp->drawable)
gimp_drawable_detach (pp->drawable);
/* display the preview stuff */ /* display the preview stuff */
if (!pp->abort_me) if (!pp->abort_me)
{ {
struct stat buf;
gchar temp[128];
stat (pp->file_name, &buf); stat (pp->file_name, &buf);
g_snprintf (temp, sizeof (temp), g_snprintf (temp, sizeof (temp),
_("Size: %lu bytes (%02.01f kB)"), _("Size: %lu bytes (%02.01f kB)"),
@ -1160,26 +1166,26 @@ background_jpeg_save (PreviewPersistent *pp)
} }
} }
static gint static gboolean
save_image (gchar *filename, save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
GimpImageType drawable_type; GimpImageType drawable_type;
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE * volatile outfile; FILE * volatile outfile;
guchar *temp, *t; guchar *temp, *t;
guchar *data; guchar *data;
guchar *src, *s; guchar *src, *s;
gchar *name; gchar *name;
gint has_alpha; gboolean has_alpha;
gint rowstride, yend; gint rowstride, yend;
gint i, j; gint i, j;
drawable = gimp_drawable_get (drawable_ID); drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID); drawable_type = gimp_drawable_type (drawable_ID);
@ -1245,19 +1251,22 @@ save_image (gchar *filename,
case GIMP_GRAY_IMAGE: case GIMP_GRAY_IMAGE:
/* # of color components per pixel */ /* # of color components per pixel */
cinfo.input_components = drawable->bpp; cinfo.input_components = drawable->bpp;
has_alpha = 0; has_alpha = FALSE;
break; break;
case GIMP_RGBA_IMAGE: case GIMP_RGBA_IMAGE:
case GIMP_GRAYA_IMAGE: case GIMP_GRAYA_IMAGE:
/*gimp_message ("jpeg: image contains a-channel info which will be lost");*/ /*gimp_message ("jpeg: image contains a-channel info which will be lost");*/
/* # of color components per pixel (minus the GIMP alpha channel) */ /* # of color components per pixel (minus the GIMP alpha channel) */
cinfo.input_components = drawable->bpp - 1; cinfo.input_components = drawable->bpp - 1;
has_alpha = 1; has_alpha = TRUE;
break; break;
case GIMP_INDEXED_IMAGE: case GIMP_INDEXED_IMAGE:
/*gimp_message ("jpeg: cannot operate on indexed color images");*/ /*gimp_message ("jpeg: cannot operate on indexed color images");*/
return FALSE; return FALSE;
break; break;
default: default:
/*gimp_message ("jpeg: cannot operate on unknown image types");*/ /*gimp_message ("jpeg: cannot operate on unknown image types");*/
return FALSE; return FALSE;
@ -1282,8 +1291,8 @@ save_image (gchar *filename,
*/ */
jpeg_set_defaults (&cinfo); jpeg_set_defaults (&cinfo);
jpeg_set_quality (&cinfo, (int) (jsvals.quality * 100), jsvals.baseline); jpeg_set_quality (&cinfo, (gint) (jsvals.quality * 100), jsvals.baseline);
cinfo.smoothing_factor = (int) (jsvals.smoothing * 100); cinfo.smoothing_factor = (gint) (jsvals.smoothing * 100);
cinfo.optimize_coding = jsvals.optimize; cinfo.optimize_coding = jsvals.optimize;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
@ -1304,6 +1313,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 1: case 1:
cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].h_samp_factor = 2;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1312,6 +1322,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 2: case 2:
cinfo.comp_info[0].h_samp_factor = 1; cinfo.comp_info[0].h_samp_factor = 1;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1331,9 +1342,11 @@ save_image (gchar *filename,
default: default:
cinfo.dct_method = JDCT_ISLOW; cinfo.dct_method = JDCT_ISLOW;
break; break;
case 1: case 1:
cinfo.dct_method = JDCT_IFAST; cinfo.dct_method = JDCT_IFAST;
break; break;
case 2: case 2:
cinfo.dct_method = JDCT_FLOAT; cinfo.dct_method = JDCT_FLOAT;
break; break;
@ -1432,7 +1445,7 @@ save_image (gchar *filename,
jerr.pub.error_exit = background_error_exit; jerr.pub.error_exit = background_error_exit;
gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer *)pp); gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer) pp);
/* background_jpeg_save() will cleanup as needed */ /* background_jpeg_save() will cleanup as needed */
return TRUE; return TRUE;
@ -1525,21 +1538,25 @@ destroy_preview (void)
{ {
*abort_me = TRUE; /* signal the background save to stop */ *abort_me = TRUE; /* signal the background save to stop */
} }
if (drawable_global) if (drawable_global)
{ {
gimp_drawable_detach (drawable_global); gimp_drawable_detach (drawable_global);
drawable_global = NULL; drawable_global = NULL;
} }
if (layer_ID_global != -1 && image_ID_global != -1) if (layer_ID_global != -1 && image_ID_global != -1)
{ {
/* assuming that reference counting is working correctly,
we do not need to delete the layer, removing it from
the image should be sufficient */
gimp_image_remove_layer (image_ID_global, layer_ID_global); gimp_image_remove_layer (image_ID_global, layer_ID_global);
/* gimp_layer_delete(layer_ID_global); */
layer_ID_global = -1; layer_ID_global = -1;
} }
} }
static gint static gboolean
save_dialog (void) save_dialog (void)
{ {
GtkWidget *dlg; GtkWidget *dlg;
@ -1858,6 +1875,7 @@ save_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GtkWidget *text; GtkWidget *text;
jsint.run = TRUE; jsint.run = TRUE;
/* pw - get the comment text object and grab it's data */ /* pw - get the comment text object and grab it's data */
@ -1898,7 +1916,7 @@ save_restart_update (GtkAdjustment *adjustment,
static void static void
menu_callback (GtkWidget *widget, menu_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
gimp_menu_item_update (widget, data); gimp_menu_item_update (widget, data);
make_preview (); make_preview ();

View File

@ -194,7 +194,7 @@ typedef struct
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
gint tile_height; gint tile_height;
FILE *outfile; FILE *outfile;
gint has_alpha; gboolean has_alpha;
gint rowstride; gint rowstride;
guchar *temp; guchar *temp;
guchar *data; guchar *data;
@ -210,37 +210,37 @@ static gboolean *abort_me = NULL;
/* Declare local functions. /* Declare local functions.
*/ */
static void query (void); static void query (void);
static void run (gchar *name, static void run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals); GimpParam **return_vals);
static gint32 load_image (gchar *filename, static gint32 load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview); gboolean preview);
static gint save_image (gchar *filename, static gboolean save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview); gboolean preview);
static gint save_dialog (void); static gboolean save_dialog (void);
static void save_close_callback (GtkWidget *widget, static void save_close_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_ok_callback (GtkWidget *widget, static void save_ok_callback (GtkWidget *widget,
gpointer data); gpointer data);
static void save_restart_toggle_update (GtkWidget *toggle, static void save_restart_toggle_update (GtkWidget *toggle,
GtkAdjustment *adjustment); GtkAdjustment *adjustment);
static void save_restart_update (GtkAdjustment *adjustment, static void save_restart_update (GtkAdjustment *adjustment,
GtkWidget *toggle); GtkWidget *toggle);
static void make_preview (void); static void make_preview (void);
static void destroy_preview (void); static void destroy_preview (void);
static void menu_callback (GtkWidget *widget, static void menu_callback (GtkWidget *widget,
gpointer data); gpointer data);
GimpPlugInInfo PLUG_IN_INFO = GimpPlugInInfo PLUG_IN_INFO =
@ -347,24 +347,24 @@ query (void)
} }
static void static void
run (gchar *name, run (gchar *name,
gint nparams, gint nparams,
GimpParam *param, GimpParam *param,
gint *nreturn_vals, gint *nreturn_vals,
GimpParam **return_vals) GimpParam **return_vals)
{ {
static GimpParam values[2]; static GimpParam values[2];
GimpRunModeType run_mode; GimpRunModeType run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpPDBStatusType status = GIMP_PDB_SUCCESS;
gint32 image_ID; gint32 image_ID;
gint32 drawable_ID; gint32 drawable_ID;
gint32 orig_image_ID; gint32 orig_image_ID;
gint32 display_ID = -1; gint32 display_ID = -1;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
GimpParasite *parasite; GimpParasite *parasite;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
gint err; gboolean err;
GimpExportReturnType export = GIMP_EXPORT_CANCEL; GimpExportReturnType export = GIMP_EXPORT_CANCEL;
run_mode = param[0].data.d_int32; run_mode = param[0].data.d_int32;
@ -622,7 +622,7 @@ run (gchar *name,
static guint static guint
jpeg_getc (j_decompress_ptr cinfo) jpeg_getc (j_decompress_ptr cinfo)
{ {
struct jpeg_source_mgr * datasrc = cinfo->src; struct jpeg_source_mgr *datasrc = cinfo->src;
if (datasrc->bytes_in_buffer == 0) if (datasrc->bytes_in_buffer == 0)
{ {
@ -630,6 +630,7 @@ jpeg_getc (j_decompress_ptr cinfo)
ERREXIT (cinfo, JERR_CANT_SUSPEND); ERREXIT (cinfo, JERR_CANT_SUSPEND);
} }
datasrc->bytes_in_buffer--; datasrc->bytes_in_buffer--;
return *datasrc->next_input_byte++; return *datasrc->next_input_byte++;
} }
@ -647,8 +648,8 @@ static GString *local_image_comments = NULL;
static boolean static boolean
COM_handler (j_decompress_ptr cinfo) COM_handler (j_decompress_ptr cinfo)
{ {
int length; gint length;
unsigned int ch; guint ch;
length = jpeg_getc (cinfo) << 8; length = jpeg_getc (cinfo) << 8;
length += jpeg_getc (cinfo); length += jpeg_getc (cinfo);
@ -700,22 +701,22 @@ load_image (gchar *filename,
GimpRunModeType runmode, GimpRunModeType runmode,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
gint32 volatile image_ID; gint32 volatile image_ID;
gint32 layer_ID; gint32 layer_ID;
struct jpeg_decompress_struct cinfo; struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE *infile; FILE *infile;
guchar *buf; guchar *buf;
guchar * volatile padded_buf = NULL; guchar * volatile padded_buf = NULL;
guchar **rowbuf; guchar **rowbuf;
gchar *name; gchar *name;
gint image_type; gint image_type;
gint layer_type; gint layer_type;
gint tile_height; gint tile_height;
gint scanlines; gint scanlines;
gint i, start, end; gint i, start, end;
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
JpegSaveVals local_save_vals; JpegSaveVals local_save_vals;
@ -723,7 +724,6 @@ load_image (gchar *filename,
GimpParasite * volatile vals_parasite = NULL; GimpParasite * volatile vals_parasite = NULL;
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
/* We set up the normal JPEG error routines. */ /* We set up the normal JPEG error routines. */
cinfo.err = jpeg_std_error (&jerr.pub); cinfo.err = jpeg_std_error (&jerr.pub);
jerr.pub.error_exit = my_error_exit; jerr.pub.error_exit = my_error_exit;
@ -778,46 +778,47 @@ load_image (gchar *filename,
*/ */
#ifdef GIMP_HAVE_PARASITES #ifdef GIMP_HAVE_PARASITES
if (!preview) { if (!preview)
/* if we had any comments then make a parasite for them */ {
if (local_image_comments && local_image_comments->len) /* if we had any comments then make a parasite for them */
{ if (local_image_comments && local_image_comments->len)
gchar *string = local_image_comments->str; {
g_string_free (local_image_comments, FALSE); gchar *string = local_image_comments->str;
local_image_comments = NULL; g_string_free (local_image_comments, FALSE);
comment_parasite = gimp_parasite_new ("gimp-comment", local_image_comments = NULL;
GIMP_PARASITE_PERSISTENT, comment_parasite = gimp_parasite_new ("gimp-comment",
strlen (string) + 1, string); GIMP_PARASITE_PERSISTENT,
} strlen (string) + 1, string);
else }
{ else
comment_parasite = NULL; {
} comment_parasite = NULL;
}
/* pw - figuring out what the saved values were is non-trivial.
* They don't seem to be in the cinfo structure. For now, I will /* pw - figuring out what the saved values were is non-trivial.
* just use the defaults, but if someone figures out how to derive * They don't seem to be in the cinfo structure. For now, I will
* them this is the place to store them. */ * just use the defaults, but if someone figures out how to derive
* them this is the place to store them. */
local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.smoothing = DEFAULT_SMOOTHING; local_save_vals.quality = DEFAULT_QUALITY;
local_save_vals.optimize = DEFAULT_OPTIMIZE; local_save_vals.smoothing = DEFAULT_SMOOTHING;
local_save_vals.optimize = DEFAULT_OPTIMIZE;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
local_save_vals.progressive = cinfo.progressive_mode; local_save_vals.progressive = cinfo.progressive_mode;
#else #else
local_save_vals.progressive = 0; local_save_vals.progressive = 0;
#endif /* HAVE_PROGRESSIVE_JPEG */ #endif /* HAVE_PROGRESSIVE_JPEG */
local_save_vals.baseline = DEFAULT_BASELINE; local_save_vals.baseline = DEFAULT_BASELINE;
local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */ local_save_vals.subsmp = DEFAULT_SUBSMP; /* sg - this _is_ there, but I'm too lazy */
local_save_vals.restart = DEFAULT_RESTART; local_save_vals.restart = DEFAULT_RESTART;
local_save_vals.dct = DEFAULT_DCT; local_save_vals.dct = DEFAULT_DCT;
local_save_vals.preview = DEFAULT_PREVIEW; local_save_vals.preview = DEFAULT_PREVIEW;
vals_parasite = gimp_parasite_new ("jpeg-save-options", 0, vals_parasite = gimp_parasite_new ("jpeg-save-options", 0,
sizeof (local_save_vals), sizeof (local_save_vals),
&local_save_vals); &local_save_vals);
} }
#endif /* GIMP_HAVE_PARASITES */ #endif /* GIMP_HAVE_PARASITES */
@ -862,14 +863,17 @@ load_image (gchar *filename,
image_type = GIMP_GRAY; image_type = GIMP_GRAY;
layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE; layer_type = preview ? GIMP_GRAYA_IMAGE : GIMP_GRAY_IMAGE;
break; break;
case 3: case 3:
image_type = GIMP_RGB; image_type = GIMP_RGB;
layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE; layer_type = preview ? GIMP_RGBA_IMAGE : GIMP_RGB_IMAGE;
break; break;
default: default:
g_message ("don't know how to load JPEGs\nwith %d color channels", g_message ("don't know how to load JPEGs\nwith %d color channels",
cinfo.output_components); cinfo.output_components);
gimp_quit (); gimp_quit ();
break;
} }
if (preview) if (preview)
@ -885,10 +889,11 @@ load_image (gchar *filename,
if (preview) if (preview)
{ {
layer_ID_global = layer_ID = gimp_layer_new (image_ID, _("JPEG preview"), layer_ID_global = layer_ID =
cinfo.output_width, gimp_layer_new (image_ID, _("JPEG preview"),
cinfo.output_height, cinfo.output_width,
layer_type, 100, GIMP_NORMAL_MODE); cinfo.output_height,
layer_type, 100, GIMP_NORMAL_MODE);
} }
else else
{ {
@ -951,23 +956,18 @@ load_image (gchar *filename,
while (cinfo.output_scanline < cinfo.output_height) while (cinfo.output_scanline < cinfo.output_height)
{ {
start = cinfo.output_scanline; start = cinfo.output_scanline;
end = cinfo.output_scanline + tile_height; end = cinfo.output_scanline + tile_height;
end = MIN (end, cinfo.output_height); end = MIN (end, cinfo.output_height);
scanlines = end - start; scanlines = end - start;
for (i = 0; i < scanlines; i++) for (i = 0; i < scanlines; i++)
jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1); jpeg_read_scanlines (&cinfo, (JSAMPARRAY) &rowbuf[i], 1);
/*
for (i = start; i < end; i++)
gimp_pixel_rgn_set_row (&pixel_rgn, tilerow[i - start], 0, i, drawable->width);
*/
if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */ if (preview) /* Add a dummy alpha channel -- convert buf to padded_buf */
{ {
guchar *dest = padded_buf; guchar *dest = padded_buf;
guchar *src = buf; guchar *src = buf;
gint num = drawable->width * scanlines; gint num = drawable->width * scanlines;
switch (cinfo.output_components) switch (cinfo.output_components)
{ {
@ -978,6 +978,7 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
case 3: case 3:
for (i=0; i<num; i++) for (i=0; i<num; i++)
{ {
@ -987,8 +988,10 @@ load_image (gchar *filename,
*(dest++) = 255; *(dest++) = 255;
} }
break; break;
default: default:
g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org"); g_warning ("JPEG - shouldn't have gotten here. Report to adam@gimp.org");
break;
} }
} }
@ -997,7 +1000,8 @@ load_image (gchar *filename,
if (runmode != GIMP_RUN_NONINTERACTIVE) if (runmode != GIMP_RUN_NONINTERACTIVE)
{ {
gimp_progress_update ((double) cinfo.output_scanline / (double) cinfo.output_height); gimp_progress_update ((gdouble) cinfo.output_scanline /
(gdouble) cinfo.output_height);
} }
} }
@ -1046,6 +1050,7 @@ load_image (gchar *filename,
gimp_image_parasite_attach (image_ID, comment_parasite); gimp_image_parasite_attach (image_ID, comment_parasite);
gimp_parasite_free (comment_parasite); gimp_parasite_free (comment_parasite);
} }
if (vals_parasite) if (vals_parasite)
{ {
gimp_image_parasite_attach (image_ID, vals_parasite); gimp_image_parasite_attach (image_ID, vals_parasite);
@ -1070,19 +1075,16 @@ background_error_exit (j_common_ptr cinfo)
(*cinfo->err->output_message) (cinfo); (*cinfo->err->output_message) (cinfo);
} }
static gint static gboolean
background_jpeg_save (PreviewPersistent *pp) background_jpeg_save (PreviewPersistent *pp)
{ {
guchar *t; guchar *t;
guchar *s; guchar *s;
gint i, j; gint i, j;
gint yend; gint yend;
if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height)) if (pp->abort_me || (pp->cinfo.next_scanline >= pp->cinfo.image_height))
{ {
struct stat buf;
gchar temp[256];
/* clean up... */ /* clean up... */
if (pp->abort_me) if (pp->abort_me)
{ {
@ -1099,11 +1101,15 @@ background_jpeg_save (PreviewPersistent *pp)
g_free (pp->temp); g_free (pp->temp);
g_free (pp->data); g_free (pp->data);
if (pp->drawable) gimp_drawable_detach (pp->drawable); if (pp->drawable)
gimp_drawable_detach (pp->drawable);
/* display the preview stuff */ /* display the preview stuff */
if (!pp->abort_me) if (!pp->abort_me)
{ {
struct stat buf;
gchar temp[128];
stat (pp->file_name, &buf); stat (pp->file_name, &buf);
g_snprintf (temp, sizeof (temp), g_snprintf (temp, sizeof (temp),
_("Size: %lu bytes (%02.01f kB)"), _("Size: %lu bytes (%02.01f kB)"),
@ -1160,26 +1166,26 @@ background_jpeg_save (PreviewPersistent *pp)
} }
} }
static gint static gboolean
save_image (gchar *filename, save_image (gchar *filename,
gint32 image_ID, gint32 image_ID,
gint32 drawable_ID, gint32 drawable_ID,
gint32 orig_image_ID, gint32 orig_image_ID,
gboolean preview) gboolean preview)
{ {
GimpPixelRgn pixel_rgn; GimpPixelRgn pixel_rgn;
GimpDrawable *drawable; GimpDrawable *drawable;
GimpImageType drawable_type; GimpImageType drawable_type;
struct jpeg_compress_struct cinfo; struct jpeg_compress_struct cinfo;
struct my_error_mgr jerr; struct my_error_mgr jerr;
FILE * volatile outfile; FILE * volatile outfile;
guchar *temp, *t; guchar *temp, *t;
guchar *data; guchar *data;
guchar *src, *s; guchar *src, *s;
gchar *name; gchar *name;
gint has_alpha; gboolean has_alpha;
gint rowstride, yend; gint rowstride, yend;
gint i, j; gint i, j;
drawable = gimp_drawable_get (drawable_ID); drawable = gimp_drawable_get (drawable_ID);
drawable_type = gimp_drawable_type (drawable_ID); drawable_type = gimp_drawable_type (drawable_ID);
@ -1245,19 +1251,22 @@ save_image (gchar *filename,
case GIMP_GRAY_IMAGE: case GIMP_GRAY_IMAGE:
/* # of color components per pixel */ /* # of color components per pixel */
cinfo.input_components = drawable->bpp; cinfo.input_components = drawable->bpp;
has_alpha = 0; has_alpha = FALSE;
break; break;
case GIMP_RGBA_IMAGE: case GIMP_RGBA_IMAGE:
case GIMP_GRAYA_IMAGE: case GIMP_GRAYA_IMAGE:
/*gimp_message ("jpeg: image contains a-channel info which will be lost");*/ /*gimp_message ("jpeg: image contains a-channel info which will be lost");*/
/* # of color components per pixel (minus the GIMP alpha channel) */ /* # of color components per pixel (minus the GIMP alpha channel) */
cinfo.input_components = drawable->bpp - 1; cinfo.input_components = drawable->bpp - 1;
has_alpha = 1; has_alpha = TRUE;
break; break;
case GIMP_INDEXED_IMAGE: case GIMP_INDEXED_IMAGE:
/*gimp_message ("jpeg: cannot operate on indexed color images");*/ /*gimp_message ("jpeg: cannot operate on indexed color images");*/
return FALSE; return FALSE;
break; break;
default: default:
/*gimp_message ("jpeg: cannot operate on unknown image types");*/ /*gimp_message ("jpeg: cannot operate on unknown image types");*/
return FALSE; return FALSE;
@ -1282,8 +1291,8 @@ save_image (gchar *filename,
*/ */
jpeg_set_defaults (&cinfo); jpeg_set_defaults (&cinfo);
jpeg_set_quality (&cinfo, (int) (jsvals.quality * 100), jsvals.baseline); jpeg_set_quality (&cinfo, (gint) (jsvals.quality * 100), jsvals.baseline);
cinfo.smoothing_factor = (int) (jsvals.smoothing * 100); cinfo.smoothing_factor = (gint) (jsvals.smoothing * 100);
cinfo.optimize_coding = jsvals.optimize; cinfo.optimize_coding = jsvals.optimize;
#ifdef HAVE_PROGRESSIVE_JPEG #ifdef HAVE_PROGRESSIVE_JPEG
@ -1304,6 +1313,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 1: case 1:
cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].h_samp_factor = 2;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1312,6 +1322,7 @@ save_image (gchar *filename,
cinfo.comp_info[2].h_samp_factor = 1; cinfo.comp_info[2].h_samp_factor = 1;
cinfo.comp_info[2].v_samp_factor = 1; cinfo.comp_info[2].v_samp_factor = 1;
break; break;
case 2: case 2:
cinfo.comp_info[0].h_samp_factor = 1; cinfo.comp_info[0].h_samp_factor = 1;
cinfo.comp_info[0].v_samp_factor = 1; cinfo.comp_info[0].v_samp_factor = 1;
@ -1331,9 +1342,11 @@ save_image (gchar *filename,
default: default:
cinfo.dct_method = JDCT_ISLOW; cinfo.dct_method = JDCT_ISLOW;
break; break;
case 1: case 1:
cinfo.dct_method = JDCT_IFAST; cinfo.dct_method = JDCT_IFAST;
break; break;
case 2: case 2:
cinfo.dct_method = JDCT_FLOAT; cinfo.dct_method = JDCT_FLOAT;
break; break;
@ -1432,7 +1445,7 @@ save_image (gchar *filename,
jerr.pub.error_exit = background_error_exit; jerr.pub.error_exit = background_error_exit;
gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer *)pp); gtk_idle_add ((GtkFunction) background_jpeg_save, (gpointer) pp);
/* background_jpeg_save() will cleanup as needed */ /* background_jpeg_save() will cleanup as needed */
return TRUE; return TRUE;
@ -1525,21 +1538,25 @@ destroy_preview (void)
{ {
*abort_me = TRUE; /* signal the background save to stop */ *abort_me = TRUE; /* signal the background save to stop */
} }
if (drawable_global) if (drawable_global)
{ {
gimp_drawable_detach (drawable_global); gimp_drawable_detach (drawable_global);
drawable_global = NULL; drawable_global = NULL;
} }
if (layer_ID_global != -1 && image_ID_global != -1) if (layer_ID_global != -1 && image_ID_global != -1)
{ {
/* assuming that reference counting is working correctly,
we do not need to delete the layer, removing it from
the image should be sufficient */
gimp_image_remove_layer (image_ID_global, layer_ID_global); gimp_image_remove_layer (image_ID_global, layer_ID_global);
/* gimp_layer_delete(layer_ID_global); */
layer_ID_global = -1; layer_ID_global = -1;
} }
} }
static gint static gboolean
save_dialog (void) save_dialog (void)
{ {
GtkWidget *dlg; GtkWidget *dlg;
@ -1858,6 +1875,7 @@ save_ok_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GtkWidget *text; GtkWidget *text;
jsint.run = TRUE; jsint.run = TRUE;
/* pw - get the comment text object and grab it's data */ /* pw - get the comment text object and grab it's data */
@ -1898,7 +1916,7 @@ save_restart_update (GtkAdjustment *adjustment,
static void static void
menu_callback (GtkWidget *widget, menu_callback (GtkWidget *widget,
gpointer data) gpointer data)
{ {
gimp_menu_item_update (widget, data); gimp_menu_item_update (widget, data);
make_preview (); make_preview ();

View File

@ -1,3 +1,7 @@
2000-12-03 Sven Neumann <sven@gimp.org>
* de.po: updated german translation
2000-11-24 Christophe Merlet <redfox@eikonex.org> 2000-11-24 Christophe Merlet <redfox@eikonex.org>
* fr.po: updated French translation. * fr.po: updated French translation.

File diff suppressed because it is too large Load Diff