Ejemplo n.º 1
0
psd_bool psd_layer_blend_channel_mixer(psd_context * context, psd_layer_record * layer, psd_rect * dst_rect)
{
	psd_uint layer_info_data;
	psd_int i;

	if(context->color_mode != psd_color_mode_rgb)
		return psd_false;

	for(i = 0; i < layer->layer_info_count; i ++)
	{
		if(layer->layer_info_type[i] == psd_layer_info_type_channel_mixer)
		{
			layer_info_data = layer->layer_info_data[i];
			break;
		}
	}
	if(layer_info_data == 0)
		return psd_false;

	psd_adjustment_blend_color(context, layer, dst_rect, psd_channel_mixer_proc, layer_info_data);

	layer->adjustment_valid = psd_false;
	
	return psd_true;
}
Ejemplo n.º 2
0
psd_bool psd_layer_blend_hue_saturation(psd_context * context, psd_layer_record * layer, psd_rect * dst_rect)
{
	psd_uint layer_info_data;
	psd_layer_hue_saturation * data = NULL;
	psd_int i, j, increase, range_value[4];

	for(i = 0; i < layer->layer_info_count; i ++)
	{
		if(layer->layer_info_type[i] == psd_layer_info_type_new_hue_saturation)
		{
			layer_info_data = layer->layer_info_data[i];
			data = (psd_layer_hue_saturation *)layer_info_data;
			break;
		}
	}
	if(data == NULL)
		return psd_false;

	if(layer->adjustment_valid == psd_true)
	{
		for(i = 0; i < 6; i ++)
		{
			if(data->setting_values[i][0] != 0 || data->setting_values[i][1] != 0 ||
				data->setting_values[i][2] != 0)
			{
				if(data->range_values[i][0] > data->range_values[i][1] ||
					data->range_values[i][1] > data->range_values[i][2] ||
					data->range_values[i][2] > data->range_values[i][3])
				{
					increase = 0;
					range_value[0] = data->range_values[i][0];
					if(data->range_values[i][0] > data->range_values[i][1])
						increase = 360;
					range_value[1] = data->range_values[i][1] + increase;
					if(data->range_values[i][1] > data->range_values[i][2] && increase == 0)
						increase = 360;
					range_value[2] = data->range_values[i][2] + increase;
					if(data->range_values[i][2] > data->range_values[i][3] && increase == 0)
						increase = 360;
					range_value[3] = data->range_values[i][3] + increase;
					
					for(j = 0; j < 360; j ++)
					{
						if(j >= range_value[0] && j < range_value[3])
						{
							if(j >= range_value[1] && j < range_value[2])
								data->lookup_table[i][j] = 255;
							else if(j < range_value[1] && range_value[1] > range_value[0])
								data->lookup_table[i][j] = 255 * (j - range_value[0]) / (range_value[1] - range_value[0]);
							else if(j >= range_value[2] && range_value[3] > range_value[2])
								data->lookup_table[i][j] = 255 * (range_value[3] - j) / (range_value[3] - range_value[2]);
							else
								data->lookup_table[i][j] = 0;
						}
						else if(j + 360 >= range_value[0] && j + 360 < range_value[3])
						{
							if(j + 360 >= range_value[1] && j + 360 < range_value[2])
								data->lookup_table[i][j] = 255;
							else if(j + 360 < range_value[1] && range_value[1] > range_value[0])
								data->lookup_table[i][j] = 255 * (j + 360 - range_value[0]) / (range_value[1] - range_value[0]);
							else if(j + 360 >= range_value[2] && range_value[3] > range_value[2])
								data->lookup_table[i][j] = 255 * (range_value[3] - (j + 360)) / (range_value[3] - range_value[2]);
							else
								data->lookup_table[i][j] = 0;
						}
						else
						{
							data->lookup_table[i][j] = 0;
						}
					}
				}
				else
				{
					for(j = 0; j < 360; j ++)
					{
						if(j >= data->range_values[i][0] && j < data->range_values[i][3])
						{
							if(j >= data->range_values[i][1] && j < data->range_values[i][2])
								data->lookup_table[i][j] = 255;
							else if(j < data->range_values[i][1] && data->range_values[i][1] > data->range_values[i][0])
								data->lookup_table[i][j] = 255 * (j - data->range_values[i][0]) / (data->range_values[i][1] - data->range_values[i][0]);
							else if(j >= data->range_values[i][2] && data->range_values[i][3] > data->range_values[i][2])
								data->lookup_table[i][j] = 255 * (data->range_values[i][3] - j) / (data->range_values[i][3] - data->range_values[i][2]);
							else
								data->lookup_table[i][j] = 0;
						}
						else
						{
							data->lookup_table[i][j] = 0;
						}
					}
				}
			}
			else
			{
				memset(data->lookup_table[i], 0, 360);
			}
		}
	}

	psd_adjustment_blend_color(context, layer, dst_rect, psd_hue_saturation_proc, layer_info_data);

	layer->adjustment_valid = psd_false;
	
	return psd_true;
}