GObject * gimp_curves_config_new_spline (gint32 channel, const gdouble *points, gint n_points) { GimpCurvesConfig *config; GimpCurve *curve; gint i; g_return_val_if_fail (channel >= GIMP_HISTOGRAM_VALUE && channel <= GIMP_HISTOGRAM_ALPHA, NULL); g_return_val_if_fail (points != NULL, NULL); g_return_val_if_fail (n_points >= 2 && n_points <= 1024, NULL); config = g_object_new (GIMP_TYPE_CURVES_CONFIG, NULL); curve = config->curve[channel]; gimp_data_freeze (GIMP_DATA (curve)); gimp_curve_set_curve_type (curve, GIMP_CURVE_SMOOTH); gimp_curve_set_n_samples (curve, n_points); /* unset the last point */ gimp_curve_set_point (curve, curve->n_points - 1, -1.0, -1.0); for (i = 0; i < n_points; i++) gimp_curve_set_point (curve, i, (gdouble) points[i * 2], (gdouble) points[i * 2 + 1]); gimp_data_thaw (GIMP_DATA (curve)); return G_OBJECT (config); }
GObject * gimp_curves_config_new_explicit (gint32 channel, const gdouble *samples, gint n_samples) { GimpCurvesConfig *config; GimpCurve *curve; gint i; g_return_val_if_fail (channel >= GIMP_HISTOGRAM_VALUE && channel <= GIMP_HISTOGRAM_ALPHA, NULL); g_return_val_if_fail (samples != NULL, NULL); g_return_val_if_fail (n_samples >= 2 && n_samples <= 4096, NULL); config = g_object_new (GIMP_TYPE_CURVES_CONFIG, NULL); curve = config->curve[channel]; gimp_data_freeze (GIMP_DATA (curve)); gimp_curve_set_curve_type (curve, GIMP_CURVE_FREE); gimp_curve_set_n_samples (curve, n_samples); for (i = 0; i < n_samples; i++) gimp_curve_set_curve (curve, (gdouble) i / (gdouble) (n_samples - 1), (gdouble) samples[i]); gimp_data_thaw (GIMP_DATA (curve)); return G_OBJECT (config); }
static void gimp_curve_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GimpCurve *curve = GIMP_CURVE (object); switch (property_id) { case PROP_CURVE_TYPE: gimp_curve_set_curve_type (curve, g_value_get_enum (value)); break; case PROP_N_POINTS: gimp_curve_set_n_points (curve, g_value_get_int (value)); break; case PROP_POINTS: { GimpValueArray *array = g_value_get_boxed (value); gint length; gint i; if (! array) break; length = gimp_value_array_length (array); for (i = 0; i < curve->n_points && i * 2 < length; i++) { GValue *x = gimp_value_array_index (array, i * 2); GValue *y = gimp_value_array_index (array, i * 2 + 1); curve->points[i].x = g_value_get_double (x); curve->points[i].y = g_value_get_double (y); } } break; case PROP_N_SAMPLES: gimp_curve_set_n_samples (curve, g_value_get_int (value)); break; case PROP_SAMPLES: { GimpValueArray *array = g_value_get_boxed (value); gint length; gint i; if (! array) break; length = gimp_value_array_length (array); for (i = 0; i < curve->n_samples && i < length; i++) { GValue *v = gimp_value_array_index (array, i); curve->samples[i] = g_value_get_double (v); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } }