TileManager * gimp_projection_get_tiles_at_level (GimpProjection *proj, gint level, gboolean *is_premult) { g_return_val_if_fail (GIMP_IS_PROJECTION (proj), NULL); if (! proj->pyramid) { const Babl *format; gint bytes; gint width; gint height; format = gimp_projection_get_format (GIMP_PICKABLE (proj)); bytes = babl_format_get_bytes_per_pixel (format); gimp_projectable_get_size (proj->projectable, &width, &height); proj->pyramid = tile_pyramid_new (bytes, width, height); tile_pyramid_set_validate_proc (proj->pyramid, (TileValidateProc) gimp_projection_validate_tile, proj); } return tile_pyramid_get_tiles (proj->pyramid, level, is_premult); }
GeglNode * gimp_projection_get_sink_node (GimpProjection *proj) { GeglNode *graph; GeglBuffer *buffer; g_return_val_if_fail (GIMP_IS_PROJECTION (proj), NULL); if (proj->sink_node) return proj->sink_node; proj->graph = gegl_node_new (); g_object_set (proj->graph, "dont-cache", TRUE, NULL); graph = gimp_projectable_get_graph (proj->projectable); gegl_node_add_child (proj->graph, graph); buffer = gimp_projection_get_buffer (GIMP_PICKABLE (proj)); proj->sink_node = gegl_node_new_child (proj->graph, "operation", "gegl:write-buffer", "buffer", buffer, NULL); gegl_node_connect_to (graph, "output", proj->sink_node, "input"); return proj->sink_node; }
void gimp_projection_flush_now (GimpProjection *proj) { g_return_if_fail (GIMP_IS_PROJECTION (proj)); /* Construct NOW */ gimp_projection_flush_whenever (proj, TRUE); }
void gimp_projection_flush (GimpProjection *proj) { g_return_if_fail (GIMP_IS_PROJECTION (proj)); /* Construct on idle time */ gimp_projection_flush_whenever (proj, FALSE); }
void gimp_projection_finish_draw (GimpProjection *proj) { g_return_if_fail (GIMP_IS_PROJECTION (proj)); if (proj->idle_render.idle_id) { g_source_remove (proj->idle_render.idle_id); proj->idle_render.idle_id = 0; while (gimp_projection_idle_render_callback (proj)); } }
void gimp_projection_finish_draw (GimpProjection *proj) { g_return_if_fail (GIMP_IS_PROJECTION (proj)); if (proj->idle_render.idle_id) { #if 0 g_printerr ("%s: flushing idle render queue\n", G_STRFUNC); #endif g_source_remove (proj->idle_render.idle_id); proj->idle_render.idle_id = 0; while (gimp_projection_idle_render_callback (proj)); } }
void gimp_projection_construct (GimpProjection *proj, gint x, gint y, gint w, gint h) { g_return_if_fail (GIMP_IS_PROJECTION (proj)); #if 0 GList *layers = gimp_projectable_get_layers (proj->projectable); if (layers && ! layers->next) /* a single layer */ { GimpLayer *layer = layers->data; GimpDrawable *drawable = GIMP_DRAWABLE (layer); GimpItem *item = GIMP_ITEM (layer); gint width, height; gint off_x, off_y; gimp_projectable_get_offset (proj->projectable, &proj_off_x, &proj_off_y); gimp_projectable_get_size (proj->projectable, &width, &height); gimp_item_get_offset (item, &off_x, &off_y); if (gimp_drawable_has_alpha (drawable) && gimp_item_get_visible (item) && gimp_item_get_width (item) == width && gimp_item_get_height (item) == height && ! gimp_drawable_is_indexed (layer) && gimp_layer_get_opacity (layer) == GIMP_OPACITY_OPAQUE && off_x == 0 && off_y == 0 && proj_offset_x == 0 && proj_offset_y == 0) { PixelRegion srcPR, destPR; g_printerr ("cow-projection!"); pixel_region_init (&srcPR, gimp_drawable_get_tiles (layer), x, y, w,h, FALSE); pixel_region_init (&destPR, gimp_pickable_get_tiles (GIMP_PICKABLE (proj)), x, y, w,h, TRUE); copy_region (&srcPR, &destPR); proj->construct_flag = TRUE; gimp_projection_construct_legacy (proj, FALSE, x, y, w, h); return; } } #endif /* First, determine if the projection image needs to be * initialized--this is the case when there are no visible * layers that cover the entire canvas--either because layers * are offset or only a floating selection is visible */ gimp_projection_initialize (proj, x, y, w, h); /* call functions which process the list of layers and * the list of channels */ if (proj->use_gegl) { gimp_projection_construct_gegl (proj, x, y, w, h); } else { proj->construct_flag = FALSE; gimp_projection_construct_legacy (proj, TRUE, x, y, w, h); } }