void psd_layer_and_mask_free(psd_context * context) { psd_int i; for(i = 0; i < context->layer_count; i ++) psd_layer_free(&context->layer_records[i]); psd_freeif(context->layer_records); psd_freeif(context->temp_channel_data); psd_pattern_free(context); }
psd_static void psd_layer_free(psd_layer_record * layer) { psd_int i; for(i = 0; i < layer->layer_info_count; i ++) { if(layer->layer_info_data[i] != 0) { switch(layer->layer_info_type[i]) { case psd_layer_info_type_levels: psd_layer_levels_free(layer->layer_info_data[i]); break; case psd_layer_info_type_curves: psd_layer_curves_free(layer->layer_info_data[i]); break; case psd_layer_info_type_gradient_map: psd_layer_gradient_map_free(layer->layer_info_data[i]); break; case psd_layer_info_type_type_tool: psd_layer_type_tool_free(layer->layer_info_data[i]); break; case psd_layer_info_type_effects: case psd_layer_info_type_effects2: psd_layer_effects_free(layer->layer_info_data[i]); break; default: psd_freeif((void *)layer->layer_info_data[i]); break; } layer->layer_info_data[i] = 0; } } layer->layer_info_count = 0; psd_freeif(layer->channel_info); layer->channel_info = NULL; psd_freeif(layer->unicode_name); layer->unicode_name = NULL; psd_freeif(layer->image_data); layer->image_data = NULL; psd_freeif(layer->layer_mask_info.mask_data); layer->layer_mask_info.mask_data = NULL; psd_freeif(layer->layer_blending_ranges.channel_black_src); layer->layer_blending_ranges.channel_black_src = NULL; psd_freeif(layer->layer_blending_ranges.channel_white_src); layer->layer_blending_ranges.channel_white_src = NULL; psd_freeif(layer->layer_blending_ranges.channel_black_dst); layer->layer_blending_ranges.channel_black_dst = NULL; psd_freeif(layer->layer_blending_ranges.channel_white_dst); layer->layer_blending_ranges.channel_white_dst = NULL; #ifdef PSD_GET_PATH_RESOURCE psd_layer_vector_mask_free(layer); #endif }
static void psd_path_record_free(psd_path * path) { psd_int i; if (path == NULL) return; for (i = 0; i < path->number_of_subpaths; i ++) psd_freeif(path->subpaths[i].bezier_points); psd_freeif(path->subpaths); }
void psd_layer_levels_free(psd_uint info_data) { psd_layer_levels * data; data = (psd_layer_levels *)info_data; psd_freeif(data->extra_record); psd_free(data); }
void psd_path_free(psd_context * context) { psd_int i; if (context->paths == NULL) return; for (i = 0; i < context->path_count; i ++) psd_path_record_free(&context->paths[i]); psd_freeif(context->paths); context->paths = NULL; }
void psd_layer_vector_mask_free(psd_layer_record * layer) { psd_path_record_free(layer->vector_mask.path); psd_freeif(layer->vector_mask.path); layer->vector_mask.path = NULL; }
// The fourth section of a Photoshop file contains information about layers and masks. // This section of the document describes the formats of layer and mask records. psd_status psd_get_layer_and_mask(psd_context * context) { psd_int length, prev_stream_pos, extra_stream_pos, size; psd_status status; psd_uint tag; // Length of the layer and mask information section. (**PSB** length is 8 bytes.) length = psd_stream_get_int(context); if(length <= 0) return psd_status_done; prev_stream_pos = context->stream.current_pos; if(context->load_tag == psd_load_tag_merged || context->load_tag == psd_load_tag_thumbnail || context->load_tag == psd_load_tag_exif) { psd_stream_get_null(context, length); return psd_status_done; } // Layer info status = psd_get_layer_info(context); psd_freeif(context->temp_image_data); context->temp_image_data = NULL; context->temp_image_length = 0; psd_freeif(context->temp_channel_data); context->temp_channel_data = NULL; context->temp_channel_length = 0; if(status != psd_status_done) return status; // Global layer mask info status = psd_get_mask_info(context); while(prev_stream_pos + length - context->stream.current_pos > 12) { tag = psd_stream_get_int(context); if(tag == '8BIM') { tag = psd_stream_get_int(context); if (tag == 'Lr16') { status = psd_get_layer_info(context); continue; } size = psd_stream_get_int(context); switch(tag) { case 'Patt': case 'Pat2': while(size >= 4) { extra_stream_pos = context->stream.current_pos; status = psd_get_pattern(context); size -= context->stream.current_pos - extra_stream_pos; } if(size > 0) psd_stream_get_null(context, size); break; default: if(size > 0) psd_stream_get_null(context, size); break; } } else { break; } } // Filler: zeros psd_stream_get_null(context, prev_stream_pos + length - context->stream.current_pos); return status; }
void psd_image_resource_free(psd_context * context) { psd_int i; psd_alpha_channel_free(context); psd_freeif(context->layer_group_id); psd_freeif(context->thumbnail_resource.jfif_data); psd_freeif(context->thumbnail_resource.thumbnail_data); psd_freeif(context->version_info.writer_name); psd_freeif(context->version_info.reader_name); psd_freeif(context->grid_guides.guide_coordinate); psd_freeif(context->grid_guides.guide_direction); psd_freeif(context->slices_resource.slices_resource_block); psd_freeif(context->color_samplers.resource); for (i = 0; i < context->url_list.number_of_urls; i ++) psd_freeif(context->url_list.items[i].name); psd_freeif(context->url_list.items); #ifdef PSD_INCLUDDE_LIBEXIF exif_data_free((ExifData *)context->exif_data); #else psd_freeif(context->exif_data); #endif #ifdef PSD_INCLUDE_LIBXML xmlFreeDoc((xmlDocPtr)context->XMP_metadata); #else psd_freeif(context->XMP_metadata); #endif #ifdef PSD_GET_PATH_RESOURCE psd_path_free(context); #endif }