42
42
gimp_gradient_load (const gchar *filename,
43
gboolean stingy_memory_use,
46
45
GimpGradient *gradient;
47
GimpGradientSegment *seg;
48
46
GimpGradientSegment *prev;
55
53
g_return_val_if_fail (filename != NULL, NULL);
56
54
g_return_val_if_fail (g_path_is_absolute (filename), NULL);
57
55
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
59
file = fopen (filename, "rb");
57
file = g_fopen (filename, "rb");
62
61
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
68
fgets (line, 1024, file);
69
if (strcmp (line, "GIMP Gradient\n") != 0)
68
if (! fgets (line, sizeof (line), file))
70
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
71
_("Fatal parse error in gradient file '%s': "
72
"Read error in line %d."),
73
gimp_filename_to_utf8 (filename), linenum);
78
if (! g_str_has_prefix (line, "GIMP Gradient"))
71
80
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
72
81
_("Fatal parse error in gradient file '%s': "
79
gradient = g_object_new (GIMP_TYPE_GRADIENT, NULL);
81
fgets (line, 1024, file);
82
if (! strncmp (line, "Name: ", strlen ("Name: ")))
88
gradient = g_object_new (GIMP_TYPE_GRADIENT,
89
"mime-type", "application/x-gimp-gradient",
93
if (! fgets (line, sizeof (line), file))
95
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
96
_("Fatal parse error in gradient file '%s': "
97
"Read error in line %d."),
98
gimp_filename_to_utf8 (filename), linenum);
100
g_object_unref (gradient);
104
if (g_str_has_prefix (line, "Name: "))
86
utf8 = gimp_any_to_utf8 (&line[strlen ("Name: ")], -1,
108
utf8 = gimp_any_to_utf8 (g_strstrip (line + strlen ("Name: ")), -1,
87
109
_("Invalid UTF-8 string in gradient file '%s'."),
88
110
gimp_filename_to_utf8 (filename));
91
gimp_object_set_name (GIMP_OBJECT (gradient), utf8);
94
fgets (line, 1024, file);
111
gimp_object_take_name (GIMP_OBJECT (gradient), utf8);
114
if (! fgets (line, sizeof (line), file))
116
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
117
_("Fatal parse error in gradient file '%s': "
118
"Read error in line %d."),
119
gimp_filename_to_utf8 (filename), linenum);
121
g_object_unref (gradient);
96
125
else /* old gradient format */
101
basename = g_path_get_basename (filename);
103
utf8 = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
106
gimp_object_set_name (GIMP_OBJECT (gradient), utf8);
127
gimp_object_take_name (GIMP_OBJECT (gradient),
128
g_filename_display_basename (filename));
110
131
num_segments = atoi (line);
114
135
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
115
136
_("Fatal parse error in gradient file '%s': "
117
gimp_filename_to_utf8 (filename));
137
"File is corrupt in line %d."),
138
gimp_filename_to_utf8 (filename), linenum);
118
139
g_object_unref (gradient);
125
146
for (i = 0; i < num_segments; i++)
148
GimpGradientSegment *seg;
152
gint left_color_type;
153
gint right_color_type;
129
155
seg = gimp_gradient_segment_new ();
131
157
seg->prev = prev;
136
gradient->segments = seg;
162
gradient->segments = seg;
138
fgets (line, 1024, file);
165
if (! fgets (line, sizeof (line), file))
167
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
168
_("Fatal parse error in gradient file '%s': "
169
"Read error in line %d."),
170
gimp_filename_to_utf8 (filename), linenum);
172
g_object_unref (gradient);
140
176
seg->left = g_ascii_strtod (line, &end);
141
177
if (end && errno != ERANGE)
161
197
if (end && errno != ERANGE)
162
198
seg->right_color.a = g_ascii_strtod (end, &end);
164
if (errno != ERANGE &&
165
sscanf (end, "%d %d", &type, &color) == 2)
167
seg->type = (GimpGradientSegmentType) type;
168
seg->color = (GimpGradientSegmentColor) color;
202
switch (sscanf (end, "%d %d %d %d",
204
&left_color_type, &right_color_type))
207
seg->left_color_type = (GimpGradientColor) left_color_type;
208
seg->right_color_type = (GimpGradientColor) right_color_type;
212
seg->type = (GimpGradientSegmentType) type;
213
seg->color = (GimpGradientSegmentColor) color;
217
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
218
_("Fatal parse error in gradient file '%s': "
219
"Corrupt segment %d in line %d."),
220
gimp_filename_to_utf8 (filename), i, linenum);
221
g_object_unref (gradient);
172
228
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
173
_("Corrupt segment %d in gradient file '%s'."),
174
i, gimp_filename_to_utf8 (filename));
229
_("Fatal parse error in gradient file '%s': "
230
"Corrupt segment %d in line %d."),
231
gimp_filename_to_utf8 (filename), i, linenum);
175
232
g_object_unref (gradient);
180
237
if ( (prev && (prev->right < seg->left))
181
238
|| (!prev && (0. < seg->left) ))