Load pngs without gdk-pixbuf

Use our own loader for pngs, which will allow
us to get e.g. 16-bit data in the future.
This commit is contained in:
Matthias Clasen
2021-09-11 16:23:53 -04:00
committed by Benjamin Otte
parent f51f7f85eb
commit a71877bf99

View File

@@ -46,6 +46,7 @@
#include "gdksnapshot.h"
#include <graphene.h>
#include "loaders/gdkpngprivate.h"
G_DEFINE_QUARK (gdk-texture-error-quark, gdk_texture_error)
@@ -423,24 +424,40 @@ GdkTexture *
gdk_texture_new_from_bytes (GBytes *bytes,
GError **error)
{
GInputStream *stream;
GdkPixbuf *pixbuf;
GdkTexture *texture;
const char *data;
gsize size;
g_return_val_if_fail (bytes != NULL, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
stream = g_memory_input_stream_new_from_bytes (bytes);
pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, error);
g_object_unref (stream);
data = g_bytes_get_data (bytes, &size);
if (pixbuf == NULL)
return NULL;
if (size > strlen (PNG_SIGNATURE) &&
memcmp (data, PNG_SIGNATURE, strlen (PNG_SIGNATURE)) == 0)
{
return gdk_load_png (bytes, error);
}
else
{
GInputStream *stream;
GdkPixbuf *pixbuf;
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
stream = g_memory_input_stream_new_from_bytes (bytes);
pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, error);
g_object_unref (stream);
return texture;
if (pixbuf)
{
GdkTexture *texture;
texture = gdk_texture_new_for_pixbuf (pixbuf);
g_object_unref (pixbuf);
return texture;
}
}
return NULL;
}
/**