46
46
#include "gimpchannel.h"
47
47
#include "gimpdrawable-filters.h"
48
48
#include "gimpdrawablefilter.h"
49
+ #include "gimpdrawablefiltermask.h"
49
50
#include "gimperror.h"
50
51
#include "gimpidtable.h"
51
52
#include "gimpimage.h"
63
64
{
64
65
PROP_0 ,
65
66
PROP_ID ,
67
+ PROP_DRAWABLE ,
66
68
PROP_MASK ,
67
69
N_PROPS
68
70
};
@@ -75,7 +77,7 @@ struct _GimpDrawableFilter
75
77
gint ID ;
76
78
77
79
GimpDrawable * drawable ;
78
- GimpChannel * mask ;
80
+ GimpDrawableFilterMask * mask ;
79
81
GeglNode * operation ;
80
82
81
83
gboolean has_input ;
@@ -189,14 +191,22 @@ gimp_drawable_filter_class_init (GimpDrawableFilterClass *klass)
189
191
object_class -> dispose = gimp_drawable_filter_dispose ;
190
192
object_class -> finalize = gimp_drawable_filter_finalize ;
191
193
192
- drawable_filter_props [PROP_ID ] = g_param_spec_int ("id" , NULL , NULL ,
193
- 0 , G_MAXINT , 0 ,
194
- GIMP_PARAM_READABLE );
195
-
196
- drawable_filter_props [PROP_MASK ] = g_param_spec_object ("mask" ,
197
- NULL , NULL ,
198
- GIMP_TYPE_CHANNEL ,
199
- GIMP_PARAM_READWRITE );
194
+ drawable_filter_props [PROP_ID ] = g_param_spec_int ("id" , NULL , NULL ,
195
+ 0 , G_MAXINT , 0 ,
196
+ GIMP_PARAM_READABLE );
197
+
198
+ drawable_filter_props [PROP_DRAWABLE ] = g_param_spec_object ("drawable" , NULL , NULL ,
199
+ GIMP_TYPE_DRAWABLE ,
200
+ GIMP_PARAM_READWRITE |
201
+ G_PARAM_CONSTRUCT_ONLY );
202
+ /* The mask is in fact a GimpDrawableFilterMask but the property is a
203
+ * GimpDrawable to allow setting any drawable. The set_property() code
204
+ * will take care of creating a new object of the proper type.
205
+ */
206
+ drawable_filter_props [PROP_MASK ] = g_param_spec_object ("mask" ,
207
+ NULL , NULL ,
208
+ GIMP_TYPE_DRAWABLE ,
209
+ GIMP_PARAM_READWRITE );
200
210
201
211
g_object_class_install_properties (object_class , N_PROPS , drawable_filter_props );
202
212
}
@@ -223,15 +233,30 @@ gimp_drawable_filter_set_property (GObject *object,
223
233
const GValue * value ,
224
234
GParamSpec * pspec )
225
235
{
226
- GimpDrawableFilter * filter = GIMP_DRAWABLE_FILTER (object );
236
+ GimpDrawableFilter * filter = GIMP_DRAWABLE_FILTER (object );
237
+ GimpDrawableFilterMask * mask = NULL ;
238
+ GimpImage * image ;
227
239
228
240
switch (property_id )
229
241
{
242
+ case PROP_DRAWABLE :
243
+ g_set_object (& filter -> drawable , g_value_get_object (value ));
244
+ break ;
245
+
230
246
case PROP_MASK :
231
- g_set_object (& filter -> mask , g_value_get_object (value ));
247
+ image = gimp_item_get_image (GIMP_ITEM (filter -> drawable ));
248
+
249
+ if (g_value_get_object (value ) != NULL )
250
+ mask = GIMP_DRAWABLE_FILTER_MASK (gimp_item_convert (GIMP_ITEM (g_value_get_object (value )),
251
+ image , GIMP_TYPE_DRAWABLE_FILTER_MASK ));
252
+ g_set_object (& filter -> mask , mask );
253
+ g_clear_object (& mask );
232
254
233
255
if (filter -> mask )
234
- gimp_drawable_filter_sync_mask (filter );
256
+ {
257
+ gimp_drawable_filter_mask_set_filter (filter -> mask , filter );
258
+ gimp_drawable_filter_sync_mask (filter );
259
+ }
235
260
break ;
236
261
237
262
default :
@@ -321,10 +346,10 @@ gimp_drawable_filter_new (GimpDrawable *drawable,
321
346
filter = g_object_new (GIMP_TYPE_DRAWABLE_FILTER ,
322
347
"name" , undo_desc ,
323
348
"icon-name" , icon_name ,
349
+ "drawable" , drawable ,
324
350
"mask" , NULL ,
325
351
NULL );
326
352
327
- filter -> drawable = g_object_ref (drawable );
328
353
filter -> operation = g_object_ref (operation );
329
354
330
355
image = gimp_item_get_image (GIMP_ITEM (drawable ));
@@ -397,7 +422,6 @@ gimp_drawable_filter_duplicate (GimpDrawable *drawable,
397
422
{
398
423
GimpImage * image ;
399
424
GimpDrawableFilter * filter ;
400
- GimpChannel * mask ;
401
425
GeglNode * prior_node ;
402
426
GeglNode * node = gegl_node_new ();
403
427
gchar * operation ;
@@ -466,15 +490,9 @@ gimp_drawable_filter_duplicate (GimpDrawable *drawable,
466
490
467
491
image = gimp_item_get_image (GIMP_ITEM (drawable ));
468
492
if (image != NULL )
469
- {
470
- mask = GIMP_CHANNEL (gimp_item_convert (GIMP_ITEM (prior_filter -> mask ),
471
- image , GIMP_TYPE_CHANNEL ));
472
-
473
- g_object_set (filter ,
474
- "mask" , mask ,
475
- NULL );
476
- g_object_unref (mask );
477
- }
493
+ g_object_set (filter ,
494
+ "mask" , prior_filter -> mask ,
495
+ NULL );
478
496
479
497
g_free (operation );
480
498
@@ -517,7 +535,7 @@ gimp_drawable_filter_get_operation (GimpDrawableFilter *filter)
517
535
return filter -> operation ;
518
536
}
519
537
520
- GimpChannel *
538
+ GimpDrawableFilterMask *
521
539
gimp_drawable_filter_get_mask (GimpDrawableFilter * filter )
522
540
{
523
541
g_return_val_if_fail (GIMP_IS_DRAWABLE_FILTER (filter ), NULL );
@@ -1183,17 +1201,12 @@ gimp_drawable_filter_abort (GimpDrawableFilter *filter)
1183
1201
void
1184
1202
gimp_drawable_filter_layer_mask_freeze (GimpDrawableFilter * filter )
1185
1203
{
1186
- GimpImage * image = gimp_item_get_image (GIMP_ITEM (filter -> drawable ));
1187
- GimpChannel * mask ;
1204
+ GimpImage * image = gimp_item_get_image (GIMP_ITEM (filter -> drawable ));
1188
1205
1189
1206
if (! filter -> mask )
1190
- {
1191
- mask = GIMP_CHANNEL (gimp_item_duplicate (GIMP_ITEM (gimp_image_get_mask (image )),
1192
- GIMP_TYPE_CHANNEL ));
1193
-
1194
- g_set_object (& filter -> mask , mask );
1195
- g_object_unref (mask );
1196
- }
1207
+ g_object_set (filter ,
1208
+ "mask" , GIMP_DRAWABLE (gimp_image_get_mask (image )),
1209
+ NULL );
1197
1210
1198
1211
g_signal_handlers_disconnect_by_func (image ,
1199
1212
gimp_drawable_filter_mask_changed ,
0 commit comments