void gimp_curves_config_to_cruft (GimpCurvesConfig *config, Curves *cruft, gboolean is_color) { GimpHistogramChannel channel; g_return_if_fail (GIMP_IS_CURVES_CONFIG (config)); g_return_if_fail (cruft != NULL); for (channel = GIMP_HISTOGRAM_VALUE; channel <= GIMP_HISTOGRAM_ALPHA; channel++) { gimp_curve_get_uchar (config->curve[channel], sizeof (cruft->curve[channel]), cruft->curve[channel]); } if (! is_color) { gimp_curve_get_uchar (config->curve[GIMP_HISTOGRAM_ALPHA], sizeof (cruft->curve[1]), cruft->curve[1]); } }
void gimp_curves_config_reset_channel (GimpCurvesConfig *config) { g_return_if_fail (GIMP_IS_CURVES_CONFIG (config)); gimp_config_reset (GIMP_CONFIG (config->curve[config->channel])); }
gboolean gimp_curves_config_save_cruft (GimpCurvesConfig *config, gpointer fp, GError **error) { FILE *file = fp; gint i; g_return_val_if_fail (GIMP_IS_CURVES_CONFIG (config), FALSE); g_return_val_if_fail (file != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); fprintf (file, "# GIMP Curves File\n"); for (i = 0; i < 5; i++) { GimpCurve *curve = config->curve[i]; gint j; if (curve->curve_type == GIMP_CURVE_FREE) { gint n_points; for (j = 0; j < curve->n_points; j++) { curve->points[j].x = -1; curve->points[j].y = -1; } /* pick some points from the curve and make them control * points */ n_points = CLAMP (9, curve->n_points / 2, curve->n_points); for (j = 0; j < n_points; j++) { gint sample = j * (curve->n_samples - 1) / (n_points - 1); gint point = j * (curve->n_points - 1) / (n_points - 1); curve->points[point].x = ((gdouble) sample / (gdouble) (curve->n_samples - 1)); curve->points[point].y = curve->samples[sample]; } } for (j = 0; j < curve->n_points; j++) { /* don't use gimp_curve_get_point() becaue that doesn't * work when the curve type is GIMP_CURVE_FREE */ gdouble x = curve->points[j].x; gdouble y = curve->points[j].y; if (x < 0.0 || y < 0.0) { fprintf (file, "%d %d ", -1, -1); } else { fprintf (file, "%d %d ", (gint) (x * 255.999), (gint) (y * 255.999)); } } fprintf (file, "\n"); } return TRUE; }
gboolean gimp_curves_config_load_cruft (GimpCurvesConfig *config, gpointer fp, GError **error) { FILE *file = fp; gint i, j; gint fields; gchar buf[50]; gint index[5][GIMP_CURVE_N_CRUFT_POINTS]; gint value[5][GIMP_CURVE_N_CRUFT_POINTS]; g_return_val_if_fail (GIMP_IS_CURVES_CONFIG (config), FALSE); g_return_val_if_fail (file != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); if (! fgets (buf, sizeof (buf), file) || strcmp (buf, "# GIMP Curves File\n") != 0) { g_set_error_literal (error, GIMP_CONFIG_ERROR, GIMP_CONFIG_ERROR_PARSE, _("not a GIMP Curves file")); return FALSE; } for (i = 0; i < 5; i++) { for (j = 0; j < GIMP_CURVE_N_CRUFT_POINTS; j++) { fields = fscanf (file, "%d %d ", &index[i][j], &value[i][j]); if (fields != 2) { /* FIXME: should have a helpful error message here */ g_printerr ("fields != 2"); g_set_error_literal (error, GIMP_CONFIG_ERROR, GIMP_CONFIG_ERROR_PARSE, _("parse error")); return FALSE; } } } g_object_freeze_notify (G_OBJECT (config)); for (i = 0; i < 5; i++) { GimpCurve *curve = config->curve[i]; gimp_data_freeze (GIMP_DATA (curve)); gimp_curve_set_curve_type (curve, GIMP_CURVE_SMOOTH); gimp_curve_reset (curve, FALSE); for (j = 0; j < GIMP_CURVE_N_CRUFT_POINTS; j++) { if (index[i][j] < 0 || value[i][j] < 0) gimp_curve_set_point (curve, j, -1.0, -1.0); else gimp_curve_set_point (curve, j, (gdouble) index[i][j] / 255.0, (gdouble) value[i][j] / 255.0); } gimp_data_thaw (GIMP_DATA (curve)); } g_object_thaw_notify (G_OBJECT (config)); return TRUE; }
gboolean gimp_curves_config_save_cruft (GimpCurvesConfig *config, GOutputStream *output, GError **error) { GString *string; gsize bytes_written; gint i; g_return_val_if_fail (GIMP_IS_CURVES_CONFIG (config), FALSE); g_return_val_if_fail (G_IS_OUTPUT_STREAM (output), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); string = g_string_new ("# GIMP Curves File\n"); for (i = 0; i < 5; i++) { GimpCurve *curve = config->curve[i]; gint j; if (curve->curve_type == GIMP_CURVE_FREE) { gint n_points; for (j = 0; j < curve->n_points; j++) { curve->points[j].x = -1; curve->points[j].y = -1; } /* pick some points from the curve and make them control * points */ n_points = CLAMP (9, curve->n_points / 2, curve->n_points); for (j = 0; j < n_points; j++) { gint sample = j * (curve->n_samples - 1) / (n_points - 1); gint point = j * (curve->n_points - 1) / (n_points - 1); curve->points[point].x = ((gdouble) sample / (gdouble) (curve->n_samples - 1)); curve->points[point].y = curve->samples[sample]; } } for (j = 0; j < curve->n_points; j++) { /* don't use gimp_curve_get_point() becaue that doesn't * work when the curve type is GIMP_CURVE_FREE */ gdouble x = curve->points[j].x; gdouble y = curve->points[j].y; if (x < 0.0 || y < 0.0) { g_string_append_printf (string, "%d %d ", -1, -1); } else { g_string_append_printf (string, "%d %d ", (gint) (x * 255.999), (gint) (y * 255.999)); } } g_string_append_printf (string, "\n"); } if (! g_output_stream_write_all (output, string->str, string->len, &bytes_written, NULL, error) || bytes_written != string->len) { g_prefix_error (error, _("Writing curves file failed: ")); g_string_free (string, TRUE); return FALSE; } g_string_free (string, TRUE); return TRUE; }
gboolean gimp_curves_config_load_cruft (GimpCurvesConfig *config, GInputStream *input, GError **error) { GDataInputStream *data_input; gint index[5][GIMP_CURVE_N_CRUFT_POINTS]; gint value[5][GIMP_CURVE_N_CRUFT_POINTS]; gchar *line; gsize line_len; gint i, j; g_return_val_if_fail (GIMP_IS_CURVES_CONFIG (config), FALSE); g_return_val_if_fail (G_IS_INPUT_STREAM (input), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); data_input = g_data_input_stream_new (input); line_len = 64; line = g_data_input_stream_read_line (data_input, &line_len, NULL, error); if (! line) return FALSE; if (strcmp (line, "# GIMP Curves File") != 0) { g_set_error_literal (error, GIMP_CONFIG_ERROR, GIMP_CONFIG_ERROR_PARSE, _("not a GIMP Curves file")); g_object_unref (data_input); g_free (line); return FALSE; } for (i = 0; i < 5; i++) { for (j = 0; j < GIMP_CURVE_N_CRUFT_POINTS; j++) { gchar *x_str = NULL; gchar *y_str = NULL; if (! (x_str = g_data_input_stream_read_upto (data_input, " ", -1, NULL, NULL, error)) || ! g_data_input_stream_read_byte (data_input, NULL, error) || ! (y_str = g_data_input_stream_read_upto (data_input, " ", -1, NULL, NULL, error)) || ! g_data_input_stream_read_byte (data_input, NULL, error)) { g_free (x_str); g_free (y_str); g_object_unref (data_input); return FALSE; } if (sscanf (x_str, "%d", &index[i][j]) != 1 || sscanf (y_str, "%d", &value[i][j]) != 1) { g_set_error_literal (error, GIMP_CONFIG_ERROR, GIMP_CONFIG_ERROR_PARSE, _("Parse error, didn't find 2 integers")); g_free (x_str); g_free (y_str); g_object_unref (data_input); return FALSE; } g_free (x_str); g_free (y_str); } } g_object_unref (data_input); g_object_freeze_notify (G_OBJECT (config)); for (i = 0; i < 5; i++) { GimpCurve *curve = config->curve[i]; gimp_data_freeze (GIMP_DATA (curve)); gimp_curve_set_curve_type (curve, GIMP_CURVE_SMOOTH); gimp_curve_set_n_points (curve, GIMP_CURVE_N_CRUFT_POINTS); gimp_curve_reset (curve, FALSE); for (j = 0; j < GIMP_CURVE_N_CRUFT_POINTS; j++) { if (index[i][j] < 0 || value[i][j] < 0) gimp_curve_set_point (curve, j, -1.0, -1.0); else gimp_curve_set_point (curve, j, (gdouble) index[i][j] / 255.0, (gdouble) value[i][j] / 255.0); } gimp_data_thaw (GIMP_DATA (curve)); } g_object_thaw_notify (G_OBJECT (config)); return TRUE; }