146
165
GimpLayer *layer);
149
static guint layer_signals[LAST_SIGNAL] = { 0 };
151
static GimpDrawableClass *parent_class = NULL;
155
gimp_layer_get_type (void)
157
static GType layer_type = 0;
161
static const GTypeInfo layer_info =
163
sizeof (GimpLayerClass),
164
(GBaseInitFunc) NULL,
165
(GBaseFinalizeFunc) NULL,
166
(GClassInitFunc) gimp_layer_class_init,
167
NULL, /* class_finalize */
168
NULL, /* class_data */
171
(GInstanceInitFunc) gimp_layer_init,
174
layer_type = g_type_register_static (GIMP_TYPE_DRAWABLE,
168
G_DEFINE_TYPE_WITH_CODE (GimpLayer, gimp_layer, GIMP_TYPE_DRAWABLE,
169
G_IMPLEMENT_INTERFACE (GIMP_TYPE_PICKABLE,
170
gimp_layer_pickable_iface_init))
172
#define parent_class gimp_layer_parent_class
174
static guint layer_signals[LAST_SIGNAL] = { 0 };
183
178
gimp_layer_class_init (GimpLayerClass *klass)
188
183
GimpItemClass *item_class = GIMP_ITEM_CLASS (klass);
189
184
GimpDrawableClass *drawable_class = GIMP_DRAWABLE_CLASS (klass);
191
parent_class = g_type_class_peek_parent (klass);
193
186
layer_signals[OPACITY_CHANGED] =
194
g_signal_new ("opacity_changed",
195
G_TYPE_FROM_CLASS (klass),
197
G_STRUCT_OFFSET (GimpLayerClass, opacity_changed),
199
gimp_marshal_VOID__VOID,
187
g_signal_new ("opacity-changed",
188
G_TYPE_FROM_CLASS (klass),
190
G_STRUCT_OFFSET (GimpLayerClass, opacity_changed),
192
gimp_marshal_VOID__VOID,
202
195
layer_signals[MODE_CHANGED] =
203
g_signal_new ("mode_changed",
204
G_TYPE_FROM_CLASS (klass),
206
G_STRUCT_OFFSET (GimpLayerClass, mode_changed),
208
gimp_marshal_VOID__VOID,
196
g_signal_new ("mode-changed",
197
G_TYPE_FROM_CLASS (klass),
199
G_STRUCT_OFFSET (GimpLayerClass, mode_changed),
201
gimp_marshal_VOID__VOID,
211
layer_signals[PRESERVE_TRANS_CHANGED] =
212
g_signal_new ("preserve_trans_changed",
213
G_TYPE_FROM_CLASS (klass),
215
G_STRUCT_OFFSET (GimpLayerClass, preserve_trans_changed),
217
gimp_marshal_VOID__VOID,
204
layer_signals[LOCK_ALPHA_CHANGED] =
205
g_signal_new ("lock-alpha-changed",
206
G_TYPE_FROM_CLASS (klass),
208
G_STRUCT_OFFSET (GimpLayerClass, lock_alpha_changed),
210
gimp_marshal_VOID__VOID,
220
213
layer_signals[MASK_CHANGED] =
221
g_signal_new ("mask_changed",
222
G_TYPE_FROM_CLASS (klass),
224
G_STRUCT_OFFSET (GimpLayerClass, mask_changed),
226
gimp_marshal_VOID__VOID,
214
g_signal_new ("mask-changed",
215
G_TYPE_FROM_CLASS (klass),
217
G_STRUCT_OFFSET (GimpLayerClass, mask_changed),
219
gimp_marshal_VOID__VOID,
222
object_class->set_property = gimp_layer_set_property;
223
object_class->get_property = gimp_layer_get_property;
229
224
object_class->dispose = gimp_layer_dispose;
230
225
object_class->finalize = gimp_layer_finalize;
263
258
klass->opacity_changed = NULL;
264
259
klass->mode_changed = NULL;
265
klass->preserve_trans_changed = NULL;
260
klass->lock_alpha_changed = NULL;
266
261
klass->mask_changed = NULL;
263
g_object_class_install_property (object_class, PROP_OPACITY,
264
g_param_spec_double ("opacity", NULL, NULL,
265
GIMP_OPACITY_TRANSPARENT,
268
GIMP_PARAM_READABLE));
270
g_object_class_install_property (object_class, PROP_MODE,
271
g_param_spec_enum ("mode", NULL, NULL,
272
GIMP_TYPE_LAYER_MODE_EFFECTS,
274
GIMP_PARAM_READABLE));
276
g_object_class_install_property (object_class, PROP_LOCK_ALPHA,
277
g_param_spec_boolean ("lock-alpha",
280
GIMP_PARAM_READABLE));
270
284
gimp_layer_init (GimpLayer *layer)
272
layer->opacity = GIMP_OPACITY_OPAQUE;
273
layer->mode = GIMP_NORMAL_MODE;
274
layer->preserve_trans = FALSE;
286
layer->opacity = GIMP_OPACITY_OPAQUE;
287
layer->mode = GIMP_NORMAL_MODE;
288
layer->lock_alpha = FALSE;
278
292
/* floating selection */
279
293
layer->fs.backing_store = NULL;
302
gimp_layer_pickable_iface_init (GimpPickableInterface *iface)
304
iface->get_opacity_at = gimp_layer_get_opacity_at;
308
gimp_layer_set_property (GObject *object,
317
case PROP_LOCK_ALPHA:
318
g_assert_not_reached ();
321
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
327
gimp_layer_get_property (GObject *object,
332
GimpLayer *layer = GIMP_LAYER (object);
337
g_value_set_double (value, layer->opacity);
340
g_value_set_enum (value, layer->mode);
342
case PROP_LOCK_ALPHA:
343
g_value_set_boolean (value, layer->lock_alpha);
346
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
288
352
gimp_layer_dispose (GObject *object)
290
354
GimpLayer *layer = GIMP_LAYER (object);
394
454
gimp_layer_get_active_components (const GimpDrawable *drawable,
395
455
gboolean *active)
397
GimpLayer *layer = GIMP_LAYER (drawable);
398
GimpImage *gimage = gimp_item_get_image (GIMP_ITEM (drawable));
457
GimpLayer *layer = GIMP_LAYER (drawable);
458
GimpImage *image = gimp_item_get_image (GIMP_ITEM (drawable));
401
/* first copy the gimage active channels */
461
/* first copy the image active channels */
402
462
for (i = 0; i < MAX_CHANNELS; i++)
403
active[i] = gimage->active[i];
463
active[i] = image->active[i];
405
if (gimp_drawable_has_alpha (drawable) && layer->preserve_trans)
465
if (gimp_drawable_has_alpha (drawable) && layer->lock_alpha)
406
466
active[gimp_drawable_bytes (drawable) - 1] = FALSE;
454
514
gboolean add_alpha)
458
GimpLayer *new_layer;
460
518
g_return_val_if_fail (g_type_is_a (new_type, GIMP_TYPE_DRAWABLE), NULL);
462
520
new_item = GIMP_ITEM_CLASS (parent_class)->duplicate (item, new_type,
465
if (! GIMP_IS_LAYER (new_item))
468
layer = GIMP_LAYER (item);
469
new_layer = GIMP_LAYER (new_item);
471
new_layer->mode = layer->mode;
472
new_layer->opacity = layer->opacity;
473
new_layer->preserve_trans = layer->preserve_trans;
475
/* duplicate the layer mask if necessary */
523
if (GIMP_IS_LAYER (new_item))
478
GimpLayerMask *layer_mask =
479
GIMP_LAYER_MASK (gimp_item_duplicate (GIMP_ITEM (layer->mask),
480
G_TYPE_FROM_INSTANCE (layer->mask),
483
gimp_layer_add_mask (new_layer, layer_mask, FALSE);
525
GimpLayer *layer = GIMP_LAYER (item);
526
GimpLayer *new_layer = GIMP_LAYER (new_item);
528
new_layer->mode = layer->mode;
529
new_layer->opacity = layer->opacity;
530
new_layer->lock_alpha = layer->lock_alpha;
532
/* duplicate the layer mask if necessary */
536
gimp_item_duplicate (GIMP_ITEM (layer->mask),
537
G_TYPE_FROM_INSTANCE (layer->mask),
539
gimp_layer_add_mask (new_layer, GIMP_LAYER_MASK (new_mask), FALSE);
723
778
GimpInterpolationType interpolation_type,
724
779
gboolean supersample,
725
780
gint recursion_level,
726
gboolean clip_result,
781
GimpTransformResize clip_result,
727
782
GimpProgress *progress)
729
784
GimpLayer *layer = GIMP_LAYER (item);
787
#warning FIXME: make interpolated transformations work on layers without alpha
789
if (interpolation_type != GIMP_INTERPOLATION_NONE &&
790
! gimp_drawable_has_alpha (GIMP_DRAWABLE (item)))
791
gimp_layer_add_alpha (layer);
731
793
GIMP_ITEM_CLASS (parent_class)->transform (item, context, matrix, direction,
732
794
interpolation_type,
733
795
supersample, recursion_level,
745
807
gimp_layer_invalidate_boundary (GimpDrawable *drawable)
747
809
GimpLayer *layer = GIMP_LAYER (drawable);
749
811
GimpChannel *mask;
751
if (! (gimage = gimp_item_get_image (GIMP_ITEM (layer))))
813
if (! (image = gimp_item_get_image (GIMP_ITEM (layer))))
754
816
/* Turn the current selection off */
755
gimp_image_selection_control (gimage, GIMP_SELECTION_OFF);
817
gimp_image_selection_control (image, GIMP_SELECTION_OFF);
757
819
/* clear the affected region surrounding the layer */
758
gimp_image_selection_control (gimage, GIMP_SELECTION_LAYER_OFF);
820
gimp_image_selection_control (image, GIMP_SELECTION_LAYER_OFF);
760
822
/* get the selection mask channel */
761
mask = gimp_image_get_mask (gimage);
823
mask = gimp_image_get_mask (image);
763
825
/* Only bother with the bounds if there is a selection */
764
826
if (! gimp_channel_is_empty (mask))
771
833
floating_sel_invalidate (layer);
837
gimp_layer_get_opacity_at (GimpPickable *pickable,
841
GimpLayer *layer = GIMP_LAYER (pickable);
845
if (x >= 0 && x < GIMP_ITEM (layer)->width &&
846
y >= 0 && y < GIMP_ITEM (layer)->height &&
847
gimp_item_get_visible (GIMP_ITEM (layer)))
849
/* If the point is inside, and the layer has no
850
* alpha channel, success!
852
if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (layer)))
853
return OPAQUE_OPACITY;
855
/* Otherwise, determine if the alpha value at
856
* the given point is non-zero
858
tile = tile_manager_get_tile (GIMP_DRAWABLE (layer)->tiles,
861
val = * ((guchar *) tile_data_pointer (tile,
864
tile_bpp (tile) - 1);
870
mask_val = gimp_pickable_get_opacity_at (GIMP_PICKABLE (layer->mask),
873
val = val * mask_val / 255;
876
tile_release (tile, FALSE);
775
gimp_layer_transform_color (GimpImage *gimage,
776
PixelRegion *layerPR,
778
GimpDrawable *drawable,
779
GimpImageBaseType src_type)
883
gimp_layer_transform_color (GimpImage *image,
884
PixelRegion *layerPR,
886
GimpImageType dest_type,
887
GimpImageType src_type)
889
GimpImageBaseType base_type = GIMP_IMAGE_TYPE_BASE_TYPE (src_type);
890
gboolean alpha = GIMP_IMAGE_TYPE_HAS_ALPHA (src_type);
787
893
for (pr = pixel_regions_register (2, layerPR, bufPR);
789
895
pr = pixel_regions_process (pr))
793
dest = layerPR->data;
897
const guchar *src = bufPR->data;
898
guchar *dest = layerPR->data;
797
for (i = 0; i < layerPR->w; i++)
799
gimp_image_transform_color (gimage, drawable,
800
dest + (i * layerPR->bytes),
802
src + (i * bufPR->bytes));
803
/* copy alpha channel */
804
dest[(i + 1) * layerPR->bytes - 1] = src[(i + 1) * bufPR->bytes - 1];
807
src += bufPR->rowstride;
808
dest += layerPR->rowstride;
903
const guchar *s = src;
907
for (i = 0; i < layerPR->w; i++)
909
gimp_image_transform_color (image, dest_type, d, base_type, s);
912
d[layerPR->bytes - 1] = (alpha ?
913
s[bufPR->bytes - 1] : OPAQUE_OPACITY);
919
src += bufPR->rowstride;
920
dest += layerPR->rowstride;
831
943
/* public functions */
834
gimp_layer_new (GimpImage *gimage,
840
GimpLayerModeEffects mode)
946
gimp_layer_new (GimpImage *image,
952
GimpLayerModeEffects mode)
842
954
GimpLayer *layer;
844
g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL);
956
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
845
957
g_return_val_if_fail (width > 0, NULL);
846
958
g_return_val_if_fail (height > 0, NULL);
848
960
layer = g_object_new (GIMP_TYPE_LAYER, NULL);
850
962
gimp_drawable_configure (GIMP_DRAWABLE (layer),
852
964
0, 0, width, height,
880
992
gimp_layer_new_from_tiles (TileManager *tiles,
881
GimpImage *dest_gimage,
993
GimpImage *dest_image,
882
994
GimpImageType type,
885
GimpLayerModeEffects mode)
997
GimpLayerModeEffects mode)
1001
g_return_val_if_fail (tiles != NULL, NULL);
1002
g_return_val_if_fail (GIMP_IS_IMAGE (dest_image), NULL);
1003
g_return_val_if_fail (name != NULL, NULL);
1005
pixel_region_init (&bufPR, tiles,
1007
tile_manager_width (tiles),
1008
tile_manager_height (tiles),
1011
return gimp_layer_new_from_region (&bufPR, dest_image, type,
1012
name, opacity, mode);
1016
* gimp_layer_new_from_pixbuf:
1017
* @pixbuf: The pixbuf to make the new layer from.
1018
* @dest_image: The image the new layer will be added to.
1019
* @type: The #GimpImageType of the new layer.
1020
* @name: The new layer's name.
1021
* @opacity: The new layer's opacity.
1022
* @mode: The new layer's mode.
1024
* Copies %pixbuf to a layer taking into consideration the
1025
* possibility of transforming the contents to meet the requirements
1026
* of the target image type
1028
* Return value: The new layer.
1031
gimp_layer_new_from_pixbuf (GdkPixbuf *pixbuf,
1032
GimpImage *dest_image,
1036
GimpLayerModeEffects mode)
1038
PixelRegion bufPR = { 0, };
1040
g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL);
1041
g_return_val_if_fail (GIMP_IS_IMAGE (dest_image), NULL);
1042
g_return_val_if_fail (name != NULL, NULL);
1044
pixel_region_init_data (&bufPR, gdk_pixbuf_get_pixels (pixbuf),
1045
gdk_pixbuf_get_n_channels (pixbuf),
1046
gdk_pixbuf_get_rowstride (pixbuf),
1048
gdk_pixbuf_get_width (pixbuf),
1049
gdk_pixbuf_get_height (pixbuf));
1051
return gimp_layer_new_from_region (&bufPR, dest_image, type,
1052
name, opacity, mode);
1056
* gimp_layer_new_from_region:
1057
* @region: A readable pixel region.
1058
* @dest_image: The image the new layer will be added to.
1059
* @type: The #GimpImageType of the new layer.
1060
* @name: The new layer's name.
1061
* @opacity: The new layer's opacity.
1062
* @mode: The new layer's mode.
1064
* Copies %region to a layer taking into consideration the
1065
* possibility of transforming the contents to meet the requirements
1066
* of the target image type
1068
* Return value: The new layer.
1071
gimp_layer_new_from_region (PixelRegion *region,
1072
GimpImage *dest_image,
1076
GimpLayerModeEffects mode)
887
1078
GimpLayer *new_layer;
888
1079
PixelRegion layerPR;
890
1080
GimpImageType src_type;
894
g_return_val_if_fail (tiles != NULL, NULL);
895
g_return_val_if_fail (GIMP_IS_IMAGE (dest_gimage), NULL);
1084
g_return_val_if_fail (region != NULL, NULL);
1085
g_return_val_if_fail (GIMP_IS_IMAGE (dest_image), NULL);
896
1086
g_return_val_if_fail (name != NULL, NULL);
898
width = tile_manager_width (tiles);
899
height = tile_manager_height (tiles);
901
switch (tile_manager_bpp (tiles))
1091
switch (region->bytes)
903
1093
case 1: src_type = GIMP_GRAY_IMAGE; break;
904
1094
case 2: src_type = GIMP_GRAYA_IMAGE; break;
912
new_layer = gimp_layer_new (dest_gimage, width, height, type, name,
1102
new_layer = gimp_layer_new (dest_image, width, height, type, name,
915
1105
if (! new_layer)
917
g_message ("gimp_layer_new_from_tiles: could not allocate new layer");
1107
g_warning ("%s: could not allocate new layer", G_STRFUNC);
921
/* Configure the pixel regions */
922
pixel_region_init (&bufPR, tiles,
925
1111
pixel_region_init (&layerPR, GIMP_DRAWABLE (new_layer)->tiles,
1112
0, 0, width, height,
944
1130
switch (src_type)
946
1132
case GIMP_RGBA_IMAGE:
947
copy_region (&bufPR, &layerPR);
1133
copy_region (region, &layerPR);
949
1135
case GIMP_RGB_IMAGE:
950
add_alpha_region (&bufPR, &layerPR);
1136
add_alpha_region (region, &layerPR);
1138
case GIMP_GRAY_IMAGE:
952
1139
case GIMP_GRAYA_IMAGE:
953
gimp_layer_transform_color (dest_gimage, &layerPR, &bufPR,
954
GIMP_DRAWABLE (new_layer), GIMP_GRAY);
1140
gimp_layer_transform_color (dest_image, &layerPR, region,
957
1144
g_warning ("%s: unhandled type conversion", G_STRFUNC);
974
1161
case GIMP_GRAYA_IMAGE:
975
1162
switch (src_type)
1164
case GIMP_RGB_IMAGE:
977
1165
case GIMP_RGBA_IMAGE:
978
gimp_layer_transform_color (dest_gimage, &layerPR, &bufPR,
979
GIMP_DRAWABLE (new_layer), GIMP_RGB);
1166
gimp_layer_transform_color (dest_image, &layerPR, region,
981
1169
case GIMP_GRAYA_IMAGE:
982
copy_region (&bufPR, &layerPR);
1170
copy_region (region, &layerPR);
984
1172
case GIMP_GRAY_IMAGE:
985
add_alpha_region (&bufPR, &layerPR);
1173
add_alpha_region (region, &layerPR);
988
1176
g_warning ("%s: unhandled type conversion", G_STRFUNC);
997
1185
case GIMP_INDEXEDA_IMAGE:
998
1186
switch (src_type)
1188
case GIMP_RGB_IMAGE:
1000
1189
case GIMP_RGBA_IMAGE:
1001
gimp_layer_transform_color (dest_gimage, &layerPR, &bufPR,
1002
GIMP_DRAWABLE (new_layer), GIMP_RGB);
1190
gimp_layer_transform_color (dest_image, &layerPR, region,
1193
case GIMP_GRAY_IMAGE:
1004
1194
case GIMP_GRAYA_IMAGE:
1005
gimp_layer_transform_color (dest_gimage, &layerPR, &bufPR,
1006
GIMP_DRAWABLE (new_layer), GIMP_GRAY);
1195
gimp_layer_transform_color (dest_image, &layerPR, region,
1009
1199
g_warning ("%s: unhandled type conversion", G_STRFUNC);
1090
1272
GimpLayerMask *
1091
1273
gimp_layer_create_mask (const GimpLayer *layer,
1092
GimpAddMaskType add_mask_type)
1274
GimpAddMaskType add_mask_type,
1275
GimpChannel *channel)
1094
1277
GimpDrawable *drawable;
1095
1278
GimpItem *item;
1096
1279
PixelRegion srcPR;
1097
1280
PixelRegion destPR;
1098
1281
GimpLayerMask *mask;
1100
1283
gchar *mask_name;
1101
1284
GimpRGB black = { 0.0, 0.0, 0.0, GIMP_OPACITY_OPAQUE };
1103
1286
g_return_val_if_fail (GIMP_IS_LAYER (layer), NULL);
1287
g_return_val_if_fail (add_mask_type != GIMP_ADD_CHANNEL_MASK ||
1288
GIMP_IS_CHANNEL (channel), NULL);
1105
1290
drawable = GIMP_DRAWABLE (layer);
1106
1291
item = GIMP_ITEM (layer);
1107
gimage = gimp_item_get_image (item);
1292
image = gimp_item_get_image (item);
1109
1294
mask_name = g_strdup_printf (_("%s mask"),
1110
gimp_object_get_name (GIMP_OBJECT (layer)));
1295
gimp_object_get_name (GIMP_OBJECT (layer)));
1112
mask = gimp_layer_mask_new (gimage,
1297
mask = gimp_layer_mask_new (image,
1117
1302
g_free (mask_name);
1145
1330
case GIMP_ADD_ALPHA_MASK:
1146
1331
case GIMP_ADD_ALPHA_TRANSFER_MASK:
1147
1332
if (gimp_drawable_has_alpha (drawable))
1149
pixel_region_init (&srcPR, drawable->tiles,
1151
item->width, item->height,
1334
pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable),
1336
item->width, item->height,
1154
extract_alpha_region (&srcPR, NULL, &destPR);
1339
extract_alpha_region (&srcPR, NULL, &destPR);
1156
1341
if (add_mask_type == GIMP_ADD_ALPHA_TRANSFER_MASK)
1197
1382
case GIMP_ADD_SELECTION_MASK:
1383
case GIMP_ADD_CHANNEL_MASK:
1199
GimpChannel *selection;
1200
gboolean selection_empty;
1201
gint copy_x, copy_y;
1202
gint copy_width, copy_height;
1204
selection = gimp_image_get_mask (gimage);
1205
selection_empty = gimp_channel_is_empty (selection);
1207
gimp_rectangle_intersect (0, 0, gimage->width, gimage->height,
1385
gboolean channel_empty;
1386
gint copy_x, copy_y;
1387
gint copy_width, copy_height;
1389
if (add_mask_type == GIMP_ADD_SELECTION_MASK)
1390
channel = GIMP_CHANNEL (gimp_image_get_mask (image));
1392
channel_empty = gimp_channel_is_empty (channel);
1394
gimp_rectangle_intersect (0, 0, image->width, image->height,
1208
1395
item->offset_x, item->offset_y,
1209
1396
item->width, item->height,
1210
1397
©_x, ©_y, ©_width, ©_height);
1212
if (copy_width < item->width || copy_height < item->height ||
1399
if (copy_width < item->width ||
1400
copy_height < item->height ||
1214
1402
gimp_channel_clear (GIMP_CHANNEL (mask), NULL, FALSE);
1216
if ((copy_width || copy_height) && ! selection_empty)
1404
if ((copy_width || copy_height) && ! channel_empty)
1218
pixel_region_init (&srcPR, GIMP_DRAWABLE (selection)->tiles,
1406
pixel_region_init (&srcPR,
1407
gimp_drawable_get_tiles (GIMP_DRAWABLE (channel)),
1219
1408
copy_x, copy_y,
1220
1409
copy_width, copy_height,
1222
pixel_region_init (&destPR, GIMP_DRAWABLE (mask)->tiles,
1411
pixel_region_init (&destPR,
1412
gimp_drawable_get_tiles (GIMP_DRAWABLE (mask)),
1223
1413
copy_x - item->offset_x, copy_y - item->offset_y,
1224
1414
copy_width, copy_height,
1312
1502
item = GIMP_ITEM (layer);
1314
gimage = gimp_item_get_image (item);
1504
image = gimp_item_get_image (item);
1321
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_LAYER_APPLY_MASK,
1511
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_LAYER_APPLY_MASK,
1322
1512
(mode == GIMP_MASK_APPLY) ?
1323
1513
_("Apply Layer Mask") :
1324
1514
_("Delete Layer Mask"));
1326
gimp_image_undo_push_layer_mask_remove (gimage, NULL, layer, layer->mask);
1516
gimp_image_undo_push_layer_mask_remove (image, NULL, layer, layer->mask);
1329
1519
/* check if applying the mask changes the projection */
1402
1592
/* Allocate the new tiles */
1403
1593
new_tiles = tile_manager_new (GIMP_ITEM (layer)->width,
1404
GIMP_ITEM (layer)->height,
1405
GIMP_IMAGE_TYPE_BYTES (new_type));
1594
GIMP_ITEM (layer)->height,
1595
GIMP_IMAGE_TYPE_BYTES (new_type));
1407
1597
/* Configure the pixel regions */
1408
1598
pixel_region_init (&srcPR, GIMP_DRAWABLE (layer)->tiles,
1410
GIMP_ITEM (layer)->width,
1411
GIMP_ITEM (layer)->height,
1600
GIMP_ITEM (layer)->width,
1601
GIMP_ITEM (layer)->height,
1413
1603
pixel_region_init (&destPR, new_tiles,
1415
GIMP_ITEM (layer)->width,
1416
GIMP_ITEM (layer)->height,
1605
GIMP_ITEM (layer)->width,
1606
GIMP_ITEM (layer)->height,
1419
1609
/* Add an alpha channel */
1420
1610
add_alpha_region (&srcPR, &destPR);
1623
gimp_layer_flatten (GimpLayer *layer,
1624
GimpContext *context)
1626
PixelRegion srcPR, destPR;
1627
TileManager *new_tiles;
1628
GimpImageType new_type;
1631
g_return_if_fail (GIMP_IS_LAYER (layer));
1632
g_return_if_fail (GIMP_IS_CONTEXT (context));
1634
if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (layer)))
1637
new_type = gimp_drawable_type_without_alpha (GIMP_DRAWABLE (layer));
1639
gimp_image_get_background (gimp_item_get_image (GIMP_ITEM (layer)), context,
1640
gimp_drawable_type (GIMP_DRAWABLE (layer)),
1643
/* Allocate the new tiles */
1644
new_tiles = tile_manager_new (GIMP_ITEM (layer)->width,
1645
GIMP_ITEM (layer)->height,
1646
GIMP_IMAGE_TYPE_BYTES (new_type));
1648
/* Configure the pixel regions */
1649
pixel_region_init (&srcPR, GIMP_DRAWABLE (layer)->tiles,
1651
GIMP_ITEM (layer)->width,
1652
GIMP_ITEM (layer)->height,
1654
pixel_region_init (&destPR, new_tiles,
1656
GIMP_ITEM (layer)->width,
1657
GIMP_ITEM (layer)->height,
1660
/* Remove alpha channel */
1661
flatten_region (&srcPR, &destPR, bg);
1663
/* Set the new tiles */
1664
gimp_drawable_set_tiles_full (GIMP_DRAWABLE (layer),
1665
gimp_item_is_attached (GIMP_ITEM (layer)),
1666
_("Remove Alpha Channel"),
1667
new_tiles, new_type,
1668
GIMP_ITEM (layer)->offset_x,
1669
GIMP_ITEM (layer)->offset_y);
1670
tile_manager_unref (new_tiles);
1433
1674
gimp_layer_resize_to_image (GimpLayer *layer,
1434
1675
GimpContext *context)
1441
1682
g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (layer)));
1442
1683
g_return_if_fail (GIMP_IS_CONTEXT (context));
1444
gimage = gimp_item_get_image (GIMP_ITEM (layer));
1685
image = gimp_item_get_image (GIMP_ITEM (layer));
1446
gimp_image_undo_group_start (gimage, GIMP_UNDO_GROUP_ITEM_RESIZE,
1687
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_ITEM_RESIZE,
1447
1688
_("Layer to Image Size"));
1449
1690
gimp_item_offsets (GIMP_ITEM (layer), &offset_x, &offset_y);
1450
1691
gimp_item_resize (GIMP_ITEM (layer), context,
1451
gimage->width, gimage->height, offset_x, offset_y);
1692
image->width, image->height, offset_x, offset_y);
1453
gimp_image_undo_group_end (gimage);
1694
gimp_image_undo_group_end (image);
1457
1698
gimp_layer_boundary (GimpLayer *layer,
1460
1701
GimpItem *item;
1461
1702
BoundSeg *new_segs;
1474
1715
if (gimp_layer_is_floating_sel (layer))
1476
1717
if (GIMP_IS_CHANNEL (layer->fs.drawable))
1478
/* if the owner drawable is a channel, just return nothing */
1719
/* if the owner drawable is a channel, just return nothing */
1486
/* otherwise, set the layer to the owner drawable */
1727
/* otherwise, set the layer to the owner drawable */
1488
layer = GIMP_LAYER (layer->fs.drawable);
1729
layer = GIMP_LAYER (layer->fs.drawable);
1492
1733
new_segs[0].x1 = item->offset_x;
1516
1757
return new_segs;
1520
gimp_layer_pick_correlate (GimpLayer *layer,
1528
g_return_val_if_fail (GIMP_IS_LAYER (layer), FALSE);
1530
/* Is the point inside the layer?
1531
* First transform the point to layer coordinates...
1533
x -= GIMP_ITEM (layer)->offset_x;
1534
y -= GIMP_ITEM (layer)->offset_y;
1536
if (x >= 0 && x < GIMP_ITEM (layer)->width &&
1537
y >= 0 && y < GIMP_ITEM (layer)->height &&
1538
gimp_item_get_visible (GIMP_ITEM (layer)))
1540
/* If the point is inside, and the layer has no
1541
* alpha channel, success!
1543
if (! gimp_drawable_has_alpha (GIMP_DRAWABLE (layer)))
1546
/* Otherwise, determine if the alpha value at
1547
* the given point is non-zero
1549
tile = tile_manager_get_tile (GIMP_DRAWABLE (layer)->tiles,
1552
val = * ((guchar *) tile_data_pointer (tile,
1555
tile_bpp (tile) - 1);
1561
mask_tile = tile_manager_get_tile (GIMP_DRAWABLE (layer->mask)->tiles,
1563
ptr = tile_data_pointer (mask_tile, x % TILE_WIDTH, y % TILE_HEIGHT);
1564
val = val * (*ptr) / 255;
1565
tile_release (mask_tile, FALSE);
1568
tile_release (tile, FALSE);
1577
1760
/**********************/
1578
1761
/* access functions */
1579
1762
/**********************/
1608
1791
if (push_undo && gimp_item_is_attached (GIMP_ITEM (layer)))
1610
GimpImage *gimage = gimp_item_get_image (GIMP_ITEM (layer));
1793
GimpImage *image = gimp_item_get_image (GIMP_ITEM (layer));
1613
gimp_image_undo_push_layer_opacity (gimage, NULL, layer);
1795
gimp_image_undo_push_layer_opacity (image, NULL, layer);
1616
1798
layer->opacity = opacity;
1618
1800
g_signal_emit (layer, layer_signals[OPACITY_CHANGED], 0);
1801
g_object_notify (G_OBJECT (layer), "opacity");
1620
1803
gimp_drawable_update (GIMP_DRAWABLE (layer),
1622
GIMP_ITEM (layer)->width,
1623
GIMP_ITEM (layer)->height);
1805
GIMP_ITEM (layer)->width,
1806
GIMP_ITEM (layer)->height);
1644
1827
if (push_undo && gimp_item_is_attached (GIMP_ITEM (layer)))
1646
GimpImage *gimage = gimp_item_get_image (GIMP_ITEM (layer));
1829
GimpImage *image = gimp_item_get_image (GIMP_ITEM (layer));
1649
gimp_image_undo_push_layer_mode (gimage, NULL, layer);
1831
gimp_image_undo_push_layer_mode (image, NULL, layer);
1652
1834
layer->mode = mode;
1654
1836
g_signal_emit (layer, layer_signals[MODE_CHANGED], 0);
1837
g_object_notify (G_OBJECT (layer), "mode");
1656
1839
gimp_drawable_update (GIMP_DRAWABLE (layer),
1658
GIMP_ITEM (layer)->width,
1659
GIMP_ITEM (layer)->height);
1841
GIMP_ITEM (layer)->width,
1842
GIMP_ITEM (layer)->height);
1672
gimp_layer_set_preserve_trans (GimpLayer *layer,
1855
gimp_layer_set_lock_alpha (GimpLayer *layer,
1856
gboolean lock_alpha,
1676
1859
g_return_if_fail (GIMP_IS_LAYER (layer));
1678
if (layer->preserve_trans != preserve)
1861
lock_alpha = lock_alpha ? TRUE : FALSE;
1863
if (layer->lock_alpha != lock_alpha)
1680
1865
if (push_undo && gimp_item_is_attached (GIMP_ITEM (layer)))
1682
GimpImage *gimage = gimp_item_get_image (GIMP_ITEM (layer));
1867
GimpImage *image = gimp_item_get_image (GIMP_ITEM (layer));
1685
gimp_image_undo_push_layer_preserve_trans (gimage, NULL, layer);
1869
gimp_image_undo_push_layer_lock_alpha (image, NULL, layer);
1688
layer->preserve_trans = preserve ? TRUE : FALSE;
1872
layer->lock_alpha = lock_alpha;
1690
g_signal_emit (layer, layer_signals[PRESERVE_TRANS_CHANGED], 0);
1874
g_signal_emit (layer, layer_signals[LOCK_ALPHA_CHANGED], 0);
1875
g_object_notify (G_OBJECT (layer), "lock-alpha");
1695
gimp_layer_get_preserve_trans (const GimpLayer *layer)
1880
gimp_layer_get_lock_alpha (const GimpLayer *layer)
1697
1882
g_return_val_if_fail (GIMP_IS_LAYER (layer), FALSE);
1699
return layer->preserve_trans;
1884
return layer->lock_alpha;