Пример #1
0
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);
}
Пример #2
0
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
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
// 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;
}
Пример #8
0
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
}