mirror of https://github.com/GNOME/gimp.git
Add support for GdkPixbuf patterns, so now all of png, jpex, pnm, xbm,
2004-06-03 Dave Neary <bolsh@gimp.org> * app/core/gimp.c: * app/core/gimpdatafactory.c: * app/core/gimppattern.[ch]: Add support for GdkPixbuf patterns, so now all of png, jpex, pnm, xbm, bmp, gif, ico, pcx, ras, tga, xpm and tiff can be used for patterns.
This commit is contained in:
parent
421b2a0d0e
commit
d088fd3fe1
|
@ -1,3 +1,11 @@
|
||||||
|
2004-06-03 Dave Neary <bolsh@gimp.org>
|
||||||
|
|
||||||
|
* app/core/gimp.c:
|
||||||
|
* app/core/gimpdatafactory.c:
|
||||||
|
* app/core/gimppattern.[ch]: Add support for GdkPixbuf patterns,
|
||||||
|
so now all of png, jpex, pnm, xbm, bmp, gif, ico, pcx, ras, tga,
|
||||||
|
xpm and tiff can be used for patterns.
|
||||||
|
|
||||||
2004-06-03 Michael Natterer <mitch@gimp.org>
|
2004-06-03 Michael Natterer <mitch@gimp.org>
|
||||||
|
|
||||||
* app/actions/vectors-actions.c: added alternative actions
|
* app/actions/vectors-actions.c: added alternative actions
|
||||||
|
|
|
@ -567,19 +567,20 @@ gimp_real_initialize (Gimp *gimp,
|
||||||
|
|
||||||
static const GimpDataFactoryLoaderEntry pattern_loader_entries[] =
|
static const GimpDataFactoryLoaderEntry pattern_loader_entries[] =
|
||||||
{
|
{
|
||||||
{ gimp_pattern_load, GIMP_PATTERN_FILE_EXTENSION }
|
{ gimp_pattern_native_load, GIMP_PATTERN_FILE_EXTENSION },
|
||||||
|
{ gimp_pattern_load, NULL /* Fallback - try to load all files */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const GimpDataFactoryLoaderEntry gradient_loader_entries[] =
|
static const GimpDataFactoryLoaderEntry gradient_loader_entries[] =
|
||||||
{
|
{
|
||||||
{ gimp_gradient_load, GIMP_GRADIENT_FILE_EXTENSION },
|
{ gimp_gradient_load, GIMP_GRADIENT_FILE_EXTENSION },
|
||||||
{ gimp_gradient_load, NULL /* legacy loader */ }
|
{ gimp_gradient_load, NULL /* fallback loader */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const GimpDataFactoryLoaderEntry palette_loader_entries[] =
|
static const GimpDataFactoryLoaderEntry palette_loader_entries[] =
|
||||||
{
|
{
|
||||||
{ gimp_palette_load, GIMP_PALETTE_FILE_EXTENSION },
|
{ gimp_palette_load, GIMP_PALETTE_FILE_EXTENSION },
|
||||||
{ gimp_palette_load, NULL /* legacy loader */ }
|
{ gimp_palette_load, NULL /* fallback loader */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
if (gimp->be_verbose)
|
if (gimp->be_verbose)
|
||||||
|
|
|
@ -579,9 +579,11 @@ gimp_data_factory_load_data (const GimpDatafileData *file_data,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_message (_("Trying legacy loader on file '%s' "
|
/*
|
||||||
|
g_message (_("Trying fallback loader on file '%s' "
|
||||||
"with unknown extension."),
|
"with unknown extension."),
|
||||||
gimp_filename_to_utf8 (file_data->filename));
|
gimp_filename_to_utf8 (file_data->filename));
|
||||||
|
*/
|
||||||
goto insert;
|
goto insert;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -307,7 +307,7 @@ gimp_pattern_get_standard (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
GimpData *
|
GimpData *
|
||||||
gimp_pattern_load (const gchar *filename,
|
gimp_pattern_native_load (const gchar *filename,
|
||||||
gboolean stingy_memory_use,
|
gboolean stingy_memory_use,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
@ -437,6 +437,103 @@ gimp_pattern_load (const gchar *filename,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GimpData *
|
||||||
|
gimp_pattern_load (const gchar *filename,
|
||||||
|
gboolean stingy_memory_use,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
GimpPattern *pattern = NULL;
|
||||||
|
GdkPixbuf *pat_buf = NULL;
|
||||||
|
guchar *pat_data, *buf_data;
|
||||||
|
gchar *name = NULL;
|
||||||
|
gint width,
|
||||||
|
height,
|
||||||
|
bytes,
|
||||||
|
rowstride,
|
||||||
|
i;
|
||||||
|
gchar *utf8_filename;
|
||||||
|
gsize filename_length;
|
||||||
|
|
||||||
|
g_return_val_if_fail (filename != NULL, NULL);
|
||||||
|
g_return_val_if_fail (g_path_is_absolute (filename), NULL);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
|
pat_buf = gdk_pixbuf_new_from_file (filename, error);
|
||||||
|
|
||||||
|
if (*error)
|
||||||
|
{
|
||||||
|
if ((*error)->domain == G_FILE_ERROR)
|
||||||
|
g_message (_("Could not open file %s: %s"),
|
||||||
|
gimp_filename_to_utf8 (filename),
|
||||||
|
(*error)->message);
|
||||||
|
else if ((*error)->domain == GDK_PIXBUF_ERROR)
|
||||||
|
g_message (_("Filename %s is not a valid GdkPixbuf: %s"),
|
||||||
|
gimp_filename_to_utf8 (filename),
|
||||||
|
(*error)->message);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Read in the pattern name -
|
||||||
|
First try to get a "comment" option, this could be set for pnm,
|
||||||
|
jpeg and gif (it isn't yet)
|
||||||
|
Then try the tEXt option, which is set for pngs,
|
||||||
|
Then fall back to filename
|
||||||
|
*/
|
||||||
|
|
||||||
|
utf8_filename = g_filename_to_utf8 (filename, -1, NULL, &filename_length,
|
||||||
|
error);
|
||||||
|
if (*error)
|
||||||
|
{
|
||||||
|
g_message (_("Problem converting filename to UTF8: %s"),
|
||||||
|
(*error)->message);
|
||||||
|
utf8_filename = "Unnamed";
|
||||||
|
g_clear_error (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
name = g_strdup (gdk_pixbuf_get_option (pat_buf, "comment"));
|
||||||
|
|
||||||
|
if (name == NULL)
|
||||||
|
name = g_strdup (gdk_pixbuf_get_option (pat_buf, "tEXt"));
|
||||||
|
|
||||||
|
if (name == NULL)
|
||||||
|
name = g_strdup (utf8_filename);
|
||||||
|
|
||||||
|
pattern = g_object_new (GIMP_TYPE_PATTERN,
|
||||||
|
"name", name,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_free (name);
|
||||||
|
g_free (utf8_filename);
|
||||||
|
|
||||||
|
width = gdk_pixbuf_get_width (pat_buf);
|
||||||
|
height = gdk_pixbuf_get_height (pat_buf);
|
||||||
|
bytes = gdk_pixbuf_get_n_channels (pat_buf);
|
||||||
|
rowstride = gdk_pixbuf_get_rowstride (pat_buf);
|
||||||
|
|
||||||
|
pattern->mask = temp_buf_new (width, height, bytes,
|
||||||
|
0, 0, NULL);
|
||||||
|
|
||||||
|
pat_data = gdk_pixbuf_get_pixels (pat_buf);
|
||||||
|
buf_data = temp_buf_data (pattern->mask);
|
||||||
|
|
||||||
|
for (i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
memcpy(buf_data + i * width * bytes, pat_data, width * bytes);
|
||||||
|
pat_data += rowstride;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free up loaded Pixbuf */
|
||||||
|
g_object_unref (pat_buf);
|
||||||
|
|
||||||
|
/* Swap the pattern to disk (if we're being stingy with memory) */
|
||||||
|
if (stingy_memory_use)
|
||||||
|
temp_buf_swap (pattern->mask);
|
||||||
|
|
||||||
|
return GIMP_DATA (pattern);
|
||||||
|
}
|
||||||
|
|
||||||
TempBuf *
|
TempBuf *
|
||||||
gimp_pattern_get_mask (const GimpPattern *pattern)
|
gimp_pattern_get_mask (const GimpPattern *pattern)
|
||||||
{
|
{
|
||||||
|
|
|
@ -307,7 +307,7 @@ gimp_pattern_get_standard (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
GimpData *
|
GimpData *
|
||||||
gimp_pattern_load (const gchar *filename,
|
gimp_pattern_native_load (const gchar *filename,
|
||||||
gboolean stingy_memory_use,
|
gboolean stingy_memory_use,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
@ -437,6 +437,103 @@ gimp_pattern_load (const gchar *filename,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GimpData *
|
||||||
|
gimp_pattern_load (const gchar *filename,
|
||||||
|
gboolean stingy_memory_use,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
GimpPattern *pattern = NULL;
|
||||||
|
GdkPixbuf *pat_buf = NULL;
|
||||||
|
guchar *pat_data, *buf_data;
|
||||||
|
gchar *name = NULL;
|
||||||
|
gint width,
|
||||||
|
height,
|
||||||
|
bytes,
|
||||||
|
rowstride,
|
||||||
|
i;
|
||||||
|
gchar *utf8_filename;
|
||||||
|
gsize filename_length;
|
||||||
|
|
||||||
|
g_return_val_if_fail (filename != NULL, NULL);
|
||||||
|
g_return_val_if_fail (g_path_is_absolute (filename), NULL);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
|
pat_buf = gdk_pixbuf_new_from_file (filename, error);
|
||||||
|
|
||||||
|
if (*error)
|
||||||
|
{
|
||||||
|
if ((*error)->domain == G_FILE_ERROR)
|
||||||
|
g_message (_("Could not open file %s: %s"),
|
||||||
|
gimp_filename_to_utf8 (filename),
|
||||||
|
(*error)->message);
|
||||||
|
else if ((*error)->domain == GDK_PIXBUF_ERROR)
|
||||||
|
g_message (_("Filename %s is not a valid GdkPixbuf: %s"),
|
||||||
|
gimp_filename_to_utf8 (filename),
|
||||||
|
(*error)->message);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Read in the pattern name -
|
||||||
|
First try to get a "comment" option, this could be set for pnm,
|
||||||
|
jpeg and gif (it isn't yet)
|
||||||
|
Then try the tEXt option, which is set for pngs,
|
||||||
|
Then fall back to filename
|
||||||
|
*/
|
||||||
|
|
||||||
|
utf8_filename = g_filename_to_utf8 (filename, -1, NULL, &filename_length,
|
||||||
|
error);
|
||||||
|
if (*error)
|
||||||
|
{
|
||||||
|
g_message (_("Problem converting filename to UTF8: %s"),
|
||||||
|
(*error)->message);
|
||||||
|
utf8_filename = "Unnamed";
|
||||||
|
g_clear_error (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
name = g_strdup (gdk_pixbuf_get_option (pat_buf, "comment"));
|
||||||
|
|
||||||
|
if (name == NULL)
|
||||||
|
name = g_strdup (gdk_pixbuf_get_option (pat_buf, "tEXt"));
|
||||||
|
|
||||||
|
if (name == NULL)
|
||||||
|
name = g_strdup (utf8_filename);
|
||||||
|
|
||||||
|
pattern = g_object_new (GIMP_TYPE_PATTERN,
|
||||||
|
"name", name,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_free (name);
|
||||||
|
g_free (utf8_filename);
|
||||||
|
|
||||||
|
width = gdk_pixbuf_get_width (pat_buf);
|
||||||
|
height = gdk_pixbuf_get_height (pat_buf);
|
||||||
|
bytes = gdk_pixbuf_get_n_channels (pat_buf);
|
||||||
|
rowstride = gdk_pixbuf_get_rowstride (pat_buf);
|
||||||
|
|
||||||
|
pattern->mask = temp_buf_new (width, height, bytes,
|
||||||
|
0, 0, NULL);
|
||||||
|
|
||||||
|
pat_data = gdk_pixbuf_get_pixels (pat_buf);
|
||||||
|
buf_data = temp_buf_data (pattern->mask);
|
||||||
|
|
||||||
|
for (i = 0; i < height; i++)
|
||||||
|
{
|
||||||
|
memcpy(buf_data + i * width * bytes, pat_data, width * bytes);
|
||||||
|
pat_data += rowstride;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free up loaded Pixbuf */
|
||||||
|
g_object_unref (pat_buf);
|
||||||
|
|
||||||
|
/* Swap the pattern to disk (if we're being stingy with memory) */
|
||||||
|
if (stingy_memory_use)
|
||||||
|
temp_buf_swap (pattern->mask);
|
||||||
|
|
||||||
|
return GIMP_DATA (pattern);
|
||||||
|
}
|
||||||
|
|
||||||
TempBuf *
|
TempBuf *
|
||||||
gimp_pattern_get_mask (const GimpPattern *pattern)
|
gimp_pattern_get_mask (const GimpPattern *pattern)
|
||||||
{
|
{
|
||||||
|
|
|
@ -54,6 +54,9 @@ GType gimp_pattern_get_type (void) G_GNUC_CONST;
|
||||||
GimpData * gimp_pattern_new (const gchar *name,
|
GimpData * gimp_pattern_new (const gchar *name,
|
||||||
gboolean stingy_memory_use);
|
gboolean stingy_memory_use);
|
||||||
GimpData * gimp_pattern_get_standard (void);
|
GimpData * gimp_pattern_get_standard (void);
|
||||||
|
GimpData * gimp_pattern_native_load (const gchar *filename,
|
||||||
|
gboolean stingy_memory_use,
|
||||||
|
GError **error);
|
||||||
GimpData * gimp_pattern_load (const gchar *filename,
|
GimpData * gimp_pattern_load (const gchar *filename,
|
||||||
gboolean stingy_memory_use,
|
gboolean stingy_memory_use,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
Loading…
Reference in New Issue