app: port brush loading to GIO
This commit is contained in:
@ -128,31 +128,26 @@ gimp_brush_load (GimpContext *context,
|
||||
GFile *file,
|
||||
GError **error)
|
||||
{
|
||||
GimpBrush *brush;
|
||||
gchar *path;
|
||||
gint fd;
|
||||
GimpBrush *brush;
|
||||
GInputStream *input;
|
||||
GError *my_error = NULL;
|
||||
|
||||
g_return_val_if_fail (G_IS_FILE (file), NULL);
|
||||
|
||||
path = g_file_get_path (file);
|
||||
|
||||
g_return_val_if_fail (g_path_is_absolute (path), NULL);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||
|
||||
fd = g_open (path, O_RDONLY | _O_BINARY, 0);
|
||||
g_free (path);
|
||||
|
||||
if (fd == -1)
|
||||
input = G_INPUT_STREAM (g_file_read (file, NULL, &my_error));
|
||||
if (! input)
|
||||
{
|
||||
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
|
||||
_("Could not open '%s' for reading: %s"),
|
||||
gimp_file_get_utf8_name (file), g_strerror (errno));
|
||||
gimp_file_get_utf8_name (file), my_error->message);
|
||||
g_clear_error (&my_error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
brush = gimp_brush_load_brush (context, file, fd, error);
|
||||
brush = gimp_brush_load_brush (context, file, input, error);
|
||||
|
||||
close (fd);
|
||||
g_object_unref (input);
|
||||
|
||||
if (! brush)
|
||||
return NULL;
|
||||
@ -161,10 +156,10 @@ gimp_brush_load (GimpContext *context,
|
||||
}
|
||||
|
||||
GimpBrush *
|
||||
gimp_brush_load_brush (GimpContext *context,
|
||||
GFile *file,
|
||||
gint fd,
|
||||
GError **error)
|
||||
gimp_brush_load_brush (GimpContext *context,
|
||||
GFile *file,
|
||||
GInputStream *input,
|
||||
GError **error)
|
||||
{
|
||||
GimpBrush *brush;
|
||||
gint bn_size;
|
||||
@ -172,22 +167,27 @@ gimp_brush_load_brush (GimpContext *context,
|
||||
gchar *name = NULL;
|
||||
guchar *pixmap;
|
||||
guchar *mask;
|
||||
gsize bytes_read;
|
||||
gssize i, size;
|
||||
gboolean success = TRUE;
|
||||
GError *my_error = NULL;
|
||||
gboolean success = TRUE;
|
||||
|
||||
g_return_val_if_fail (G_IS_FILE (file), NULL);
|
||||
g_return_val_if_fail (fd != -1, NULL);
|
||||
g_return_val_if_fail (G_IS_INPUT_STREAM (input), NULL);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||
|
||||
/* Read in the header size */
|
||||
if (read (fd, &header, sizeof (header)) != sizeof (header))
|
||||
/* read the header */
|
||||
if (! g_input_stream_read_all (input, &header, sizeof (header),
|
||||
&bytes_read, NULL, &my_error) ||
|
||||
bytes_read != sizeof (header))
|
||||
{
|
||||
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
|
||||
ngettext ("Could not read %d byte from '%s': %s",
|
||||
"Could not read %d bytes from '%s': %s",
|
||||
(gint) sizeof (header)),
|
||||
(gint) sizeof (header),
|
||||
gimp_file_get_utf8_name (file), g_strerror (errno));
|
||||
gimp_file_get_utf8_name (file), my_error->message);
|
||||
g_clear_error (&my_error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -233,7 +233,10 @@ gimp_brush_load_brush (GimpContext *context,
|
||||
{
|
||||
case 1:
|
||||
/* If this is a version 1 brush, set the fp back 8 bytes */
|
||||
lseek (fd, -8, SEEK_CUR);
|
||||
if (! g_seekable_seek (G_SEEKABLE (input), -8, G_SEEK_CUR,
|
||||
NULL, error))
|
||||
return NULL;
|
||||
|
||||
header.header_size += 8;
|
||||
/* spacing is not defined in version 1 */
|
||||
header.spacing = 25;
|
||||
@ -273,7 +276,9 @@ gimp_brush_load_brush (GimpContext *context,
|
||||
|
||||
name = g_new (gchar, bn_size);
|
||||
|
||||
if ((read (fd, name, bn_size)) < bn_size)
|
||||
if (! g_input_stream_read_all (input, name, bn_size,
|
||||
&bytes_read, NULL, NULL) ||
|
||||
bytes_read != bn_size)
|
||||
{
|
||||
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_READ,
|
||||
_("Fatal parse error in brush file '%s': "
|
||||
@ -308,7 +313,9 @@ gimp_brush_load_brush (GimpContext *context,
|
||||
switch (header.bytes)
|
||||
{
|
||||
case 1:
|
||||
success = (read (fd, mask, size) == size);
|
||||
success = (g_input_stream_read_all (input, mask, size,
|
||||
&bytes_read, NULL, NULL) &&
|
||||
bytes_read == size);
|
||||
break;
|
||||
|
||||
case 2: /* cinepaint brush, 16 bit floats */
|
||||
@ -317,9 +324,11 @@ gimp_brush_load_brush (GimpContext *context,
|
||||
|
||||
for (i = 0; success && i < size;)
|
||||
{
|
||||
gssize bytes = MIN (size - i, sizeof (buf));
|
||||
gssize bytes = MIN (size - i, sizeof (buf));
|
||||
|
||||
success = (read (fd, buf, bytes) == bytes);
|
||||
success = (g_input_stream_read_all (input, buf, bytes,
|
||||
&bytes_read, NULL, NULL) &&
|
||||
bytes_read == bytes);
|
||||
|
||||
if (success)
|
||||
{
|
||||
@ -377,9 +386,11 @@ gimp_brush_load_brush (GimpContext *context,
|
||||
|
||||
for (i = 0; success && i < size;)
|
||||
{
|
||||
gssize bytes = MIN (size - i, sizeof (buf));
|
||||
gssize bytes = MIN (size - i, sizeof (buf));
|
||||
|
||||
success = (read (fd, buf, bytes) == bytes);
|
||||
success = (g_input_stream_read_all (input, buf, bytes,
|
||||
&bytes_read, NULL, NULL) &&
|
||||
bytes_read == bytes);
|
||||
|
||||
if (success)
|
||||
{
|
||||
|
||||
@ -25,17 +25,17 @@
|
||||
#define GIMP_BRUSH_PSP_FILE_EXTENSION ".jbr"
|
||||
|
||||
|
||||
GList * gimp_brush_load (GimpContext *context,
|
||||
GFile *file,
|
||||
GError **error);
|
||||
GimpBrush * gimp_brush_load_brush (GimpContext *context,
|
||||
GFile *file,
|
||||
gint fd,
|
||||
GError **error);
|
||||
GList * gimp_brush_load (GimpContext *context,
|
||||
GFile *file,
|
||||
GError **error);
|
||||
GimpBrush * gimp_brush_load_brush (GimpContext *context,
|
||||
GFile *file,
|
||||
GInputStream *input,
|
||||
GError **error);
|
||||
|
||||
GList * gimp_brush_load_abr (GimpContext *context,
|
||||
GFile *file,
|
||||
GError **error);
|
||||
GList * gimp_brush_load_abr (GimpContext *context,
|
||||
GFile *file,
|
||||
GError **error);
|
||||
|
||||
|
||||
#endif /* __GIMP_BRUSH_LOAD_H__ */
|
||||
|
||||
@ -19,28 +19,10 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
|
||||
#ifndef _O_BINARY
|
||||
#define _O_BINARY 0
|
||||
#endif
|
||||
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
#include <glib/gstdio.h>
|
||||
#include <gegl.h>
|
||||
|
||||
#ifdef G_OS_WIN32
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
#include "libgimpbase/gimpbase.h"
|
||||
#include "libgimpbase/gimpparasiteio.h"
|
||||
|
||||
@ -59,6 +41,7 @@ gimp_brush_pipe_load (GimpContext *context,
|
||||
GError **error)
|
||||
{
|
||||
GimpBrushPipe *pipe = NULL;
|
||||
GInputStream *input;
|
||||
GimpPixPipeParams params;
|
||||
gint i;
|
||||
gint num_of_brushes = 0;
|
||||
@ -66,24 +49,19 @@ gimp_brush_pipe_load (GimpContext *context,
|
||||
gchar *paramstring;
|
||||
GString *buffer;
|
||||
gchar c;
|
||||
gchar *path;
|
||||
gint fd;
|
||||
gsize bytes_read;
|
||||
GError *my_error = NULL;
|
||||
|
||||
g_return_val_if_fail (G_IS_FILE (file), NULL);
|
||||
|
||||
path = g_file_get_path (file);
|
||||
|
||||
g_return_val_if_fail (g_path_is_absolute (path), NULL);
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||
|
||||
fd = g_open (path, O_RDONLY | _O_BINARY, 0);
|
||||
g_free (path);
|
||||
|
||||
if (fd == -1)
|
||||
input = G_INPUT_STREAM (g_file_read (file, NULL, &my_error));
|
||||
if (! input)
|
||||
{
|
||||
g_set_error (error, GIMP_DATA_ERROR, GIMP_DATA_ERROR_OPEN,
|
||||
_("Could not open '%s' for reading: %s"),
|
||||
gimp_file_get_utf8_name (file), g_strerror (errno));
|
||||
gimp_file_get_utf8_name (file), my_error->message);
|
||||
g_clear_error (&my_error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -91,8 +69,13 @@ gimp_brush_pipe_load (GimpContext *context,
|
||||
|
||||
/* get the name */
|
||||
buffer = g_string_new (NULL);
|
||||
while (read (fd, &c, 1) == 1 && c != '\n' && buffer->len < 1024)
|
||||
g_string_append_c (buffer, c);
|
||||
while (g_input_stream_read_all (input, &c, 1, &bytes_read, NULL, NULL) &&
|
||||
bytes_read == 1 &&
|
||||
c != '\n' &&
|
||||
buffer->len < 1024)
|
||||
{
|
||||
g_string_append_c (buffer, c);
|
||||
}
|
||||
|
||||
if (buffer->len > 0 && buffer->len < 1024)
|
||||
{
|
||||
@ -117,14 +100,19 @@ gimp_brush_pipe_load (GimpContext *context,
|
||||
_("Fatal parse error in brush file '%s': "
|
||||
"File is corrupt."),
|
||||
gimp_file_get_utf8_name (file));
|
||||
close (fd);
|
||||
g_object_unref (input);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* get the number of brushes */
|
||||
buffer = g_string_new (NULL);
|
||||
while (read (fd, &c, 1) == 1 && c != '\n' && buffer->len < 1024)
|
||||
g_string_append_c (buffer, c);
|
||||
while (g_input_stream_read_all (input, &c, 1, &bytes_read, NULL, NULL) &&
|
||||
bytes_read == 1 &&
|
||||
c != '\n' &&
|
||||
buffer->len < 1024)
|
||||
{
|
||||
g_string_append_c (buffer, c);
|
||||
}
|
||||
|
||||
if (buffer->len > 0 && buffer->len < 1024)
|
||||
{
|
||||
@ -137,7 +125,7 @@ gimp_brush_pipe_load (GimpContext *context,
|
||||
_("Fatal parse error in brush file '%s': "
|
||||
"File is corrupt."),
|
||||
gimp_file_get_utf8_name (file));
|
||||
close (fd);
|
||||
g_object_unref (input);
|
||||
g_object_unref (pipe);
|
||||
g_string_free (buffer, TRUE);
|
||||
return NULL;
|
||||
@ -217,7 +205,7 @@ gimp_brush_pipe_load (GimpContext *context,
|
||||
GError *my_error = NULL;
|
||||
|
||||
pipe->brushes[pipe->n_brushes] = gimp_brush_load_brush (context,
|
||||
file, fd,
|
||||
file, input,
|
||||
&my_error);
|
||||
|
||||
if (pipe->brushes[pipe->n_brushes])
|
||||
@ -228,7 +216,7 @@ gimp_brush_pipe_load (GimpContext *context,
|
||||
else
|
||||
{
|
||||
g_propagate_error (error, my_error);
|
||||
close (fd);
|
||||
g_object_unref (input);
|
||||
g_object_unref (pipe);
|
||||
return NULL;
|
||||
}
|
||||
@ -236,7 +224,7 @@ gimp_brush_pipe_load (GimpContext *context,
|
||||
pipe->n_brushes++;
|
||||
}
|
||||
|
||||
close (fd);
|
||||
g_object_unref (input);
|
||||
|
||||
/* Current brush is the first one. */
|
||||
pipe->current = pipe->brushes[0];
|
||||
|
||||
Reference in New Issue
Block a user