static gboolean gimp_operation_normal_parent_process (GeglOperation *operation, GeglOperationContext *context, const gchar *output_prop, const GeglRectangle *result, gint level) { #if 0 /* this code tries to be smart but is in fact just a too stupid * copy from gegl's normal mode. to fix it, it needs to take * mask and opacity into account */ const GeglRectangle *in_extent = NULL; const GeglRectangle *aux_extent = NULL; GObject *input; GObject *aux; /* get the raw values this does not increase the reference count */ input = gegl_operation_context_get_object (context, "input"); aux = gegl_operation_context_get_object (context, "aux"); /* pass the input/aux buffers directly through if they are not * overlapping */ if (input) in_extent = gegl_buffer_get_abyss (GEGL_BUFFER (input)); if (! input || (aux && ! gegl_rectangle_intersect (NULL, in_extent, result))) { gegl_operation_context_set_object (context, "output", aux); return TRUE; } if (aux) aux_extent = gegl_buffer_get_abyss (GEGL_BUFFER (aux)); if (! aux || (input && ! gegl_rectangle_intersect (NULL, aux_extent, result))) { gegl_operation_context_set_object (context, "output", input); return TRUE; } #endif /* chain up, which will create the needed buffers for our actual * process function */ return GEGL_OPERATION_CLASS (parent_class)->process (operation, context, output_prop, result, level); }
/* Fast paths */ static gboolean operation_process (GeglOperation *operation, GeglOperationContext *context, const gchar *output_prop, const GeglRectangle *result, gint level) { GeglOperationClass *operation_class; gpointer input, aux; operation_class = GEGL_OPERATION_CLASS (gegl_chant_parent_class); /* get the raw values this does not increase the reference count */ input = gegl_operation_context_get_object (context, "input"); aux = gegl_operation_context_get_object (context, "aux"); /* pass the input/aux buffers directly through if they are alone*/ { const GeglRectangle *in_extent = NULL; const GeglRectangle *aux_extent = NULL; if (input) in_extent = gegl_buffer_get_abyss (input); if ((!input || (aux && !gegl_rectangle_intersect (NULL, in_extent, result)))) { gegl_operation_context_take_object (context, "output", g_object_ref (aux)); return TRUE; } if (aux) aux_extent = gegl_buffer_get_abyss (aux); if (!aux || (input && !gegl_rectangle_intersect (NULL, aux_extent, result))) { gegl_operation_context_take_object (context, "output", g_object_ref (input)); return TRUE; } } /* chain up, which will create the needed buffers for our actual * process function */ return operation_class->process (operation, context, output_prop, result, level); }
static gboolean photos_operation_svg_multiply_operation_process (GeglOperation *operation, GeglOperationContext *context, const gchar *output_pad, const GeglRectangle *roi, gint level) { GObject *aux; GObject *input; const GeglRectangle *aux_bbox = NULL; const GeglRectangle *in_bbox = NULL; gboolean ret_val = TRUE; aux = gegl_operation_context_get_object (context, "aux"); if (aux != NULL) aux_bbox = gegl_buffer_get_abyss (GEGL_BUFFER (aux)); input = gegl_operation_context_get_object (context, "input"); if (input != NULL) in_bbox = gegl_buffer_get_abyss (GEGL_BUFFER (input)); if (aux == NULL || (input != NULL && !gegl_rectangle_intersect (NULL, aux_bbox, roi))) { gegl_operation_context_set_object (context, "output", input); goto out; } if (input == NULL || (aux != NULL && !gegl_rectangle_intersect (NULL, in_bbox, roi))) { gegl_operation_context_set_object (context, "output", aux); goto out; } ret_val = GEGL_OPERATION_CLASS (photos_operation_svg_multiply_parent_class)->process (operation, context, output_pad, roi, level); out: return ret_val; }