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; }
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; }