/* ----------------------------------------------- * p_getMergedFrameImageLayer * ----------------------------------------------- * * return -1 if FAILED, or layerId (positive integer) on success */ gint32 p_getMergedFrameImageLayer(GapAnimInfo *ainfo_ptr, gint32 frameNr) { gint32 imageId; gint32 layerId; layerId = -1; if(ainfo_ptr->new_filename != NULL) { g_free(ainfo_ptr->new_filename); } ainfo_ptr->new_filename = gap_lib_alloc_fname(ainfo_ptr->basename, frameNr, ainfo_ptr->extension); if(ainfo_ptr->new_filename == NULL) { printf("could not create frame filename for frameNr:%d\n", (int)frameNr); return -1; } if(!g_file_test(ainfo_ptr->new_filename, G_FILE_TEST_EXISTS)) { printf("file not found: %s\n", ainfo_ptr->new_filename); return -1; } /* load current frame */ imageId = gap_lib_load_image(ainfo_ptr->new_filename); if(imageId >= 0) { layerId = gap_image_merge_visible_layers(imageId, GIMP_CLIP_TO_IMAGE); } return(layerId); }
/* ------------------------------------ * gap_image_merge_to_specified_layer * ------------------------------------ * remove all other layers from the image except the specified layer_id * (by removing other layers, make ref_layer_id visible and perform merging) */ gint32 gap_image_merge_to_specified_layer(gint32 ref_layer_id, GimpMergeType mergemode) { gint32 l_image_id; l_image_id = gimp_item_get_image(ref_layer_id); if(l_image_id >= 0) { gint32 l_idx; gint l_nlayers; gint32 *l_layers_list; l_layers_list = gimp_image_get_layers(l_image_id, &l_nlayers); if(l_layers_list != NULL) { for(l_idx = 0; l_idx < l_nlayers; l_idx++) { if (l_layers_list[l_idx] == ref_layer_id) { gimp_item_set_visible(l_layers_list[l_idx], TRUE); } else { gimp_image_remove_layer(l_image_id, l_layers_list[l_idx]); } } g_free (l_layers_list); return (gap_image_merge_visible_layers(l_image_id, mergemode)); } } return (-1); } /* end gap_image_merge_to_specified_layer */
/* ---------------------------- * gap_frame_fetch_dup_image * ---------------------------- * returns merged or selected layer_id * (that is the only visible layer in temporary created scratch image) * the caller is resonsible to delete the scratch image when processing is done. * this can be done by calling gap_frame_fetch_delete_list_of_duplicated_images() */ gint32 gap_frame_fetch_dup_image(gint32 ffetch_user_id ,const char *filename /* full filename of the image (already contains framenr) */ ,gint32 stackpos /* 0 pick layer on top of stack, -1 merge visible layers */ ,gboolean addToCache /* enable caching */ ) { gint32 resulting_layer; gint32 image_id; gint32 dup_image_id; resulting_layer = -1; dup_image_id = -1; image_id = p_load_cache_image(filename, ffetch_user_id, addToCache); if (image_id < 0) { return(-1); } if (stackpos < 0) { dup_image_id = gimp_image_duplicate(image_id); gap_frame_fetch_remove_parasite(dup_image_id); resulting_layer = gap_image_merge_visible_layers(dup_image_id, GIMP_CLIP_TO_IMAGE); } else { gint l_nlayers; gint32 *l_layers_list; l_layers_list = gimp_image_get_layers(image_id, &l_nlayers); if(l_layers_list != NULL) { if (stackpos < l_nlayers) { gint32 src_layer_id; gdouble l_xresoulution, l_yresoulution; gint32 l_unit; src_layer_id = l_layers_list[stackpos]; dup_image_id = gimp_image_new (gimp_image_width(image_id) , gimp_image_height(image_id) , gimp_image_base_type(image_id) ); gimp_image_get_resolution(image_id, &l_xresoulution, &l_yresoulution); gimp_image_set_resolution(dup_image_id, l_xresoulution, l_yresoulution); l_unit = gimp_image_get_unit(image_id); gimp_image_set_unit(dup_image_id, l_unit); resulting_layer = gap_layer_copy_to_image (dup_image_id, src_layer_id); } g_free (l_layers_list); } } p_add_image_to_list_of_duplicated_images(dup_image_id, ffetch_user_id); if (addToCache != TRUE) { GimpParasite *l_parasite; l_parasite = gimp_image_parasite_find(image_id, GAP_IMAGE_CACHE_PARASITE); if(l_parasite) { gimp_parasite_free(l_parasite); } else { /* the original image is not cached * (delete it because the caller gets the preprocessed duplicate) */ gap_image_delete_immediate(image_id); } } return(resulting_layer); } /* end gap_frame_fetch_dup_image */