#include <gtk/gtk.h>
#include "gdk/loaders/gdkpngprivate.h"
#include "gdk/loaders/gdktiffprivate.h"
#include "gdk/loaders/gdkjpegprivate.h"
static void
assert_texture_equal (GdkTexture *t1,
GdkTexture *t2)
{
int width;
int height;
int stride;
guchar *d1;
guchar *d2;
width = gdk_texture_get_width (t1);
height = gdk_texture_get_height (t1);
stride = 4 * width;
g_assert_cmpint (width, ==, gdk_texture_get_width (t2));
g_assert_cmpint (height, ==, gdk_texture_get_height (t2));
d1 = g_malloc (stride * height);
d2 = g_malloc (stride * height);
gdk_texture_download (t1, d1, stride);
gdk_texture_download (t2, d2, stride);
g_assert_cmpmem (d1, stride * height, d2, stride * height);
g_free (d1);
g_free (d2);
}
static void
test_load_image (gconstpointer data)
{
const char *filename = data;
GdkTexture *texture;
char *path;
GFile *file;
GBytes *bytes;
GError *error = NULL;
path = g_test_build_filename (G_TEST_DIST, "image-data" , filename, NULL);
file = g_file_new_for_path (path);
bytes = g_file_load_bytes (file, NULL, NULL, &error);
g_assert_no_error (error);
/* use the internal api, we want to avoid pixbuf fallback here */
if (g_str_has_suffix (filename, ".png" ))
texture = gdk_load_png (bytes, NULL, &error);
else if (g_str_has_suffix (filename, ".tiff" ))
texture = gdk_load_tiff (bytes, &error);
else if (g_str_has_suffix (filename, ".jpeg" ))
texture = gdk_load_jpeg (bytes, &error);
else
g_assert_not_reached ();
g_assert_no_error (error);
g_assert_true (GDK_IS_TEXTURE (texture));
g_assert_cmpint (gdk_texture_get_width (texture), >, 0 );
g_assert_cmpint (gdk_texture_get_height (texture), >, 0 );
g_object_unref (texture);
g_bytes_unref (bytes);
g_object_unref (file);
g_free (path);
}
static void
test_save_image (gconstpointer test_data)
{
const char *filename = test_data;
char *path;
GdkTexture *texture;
GFile *file;
GdkTexture *texture2;
GError *error = NULL;
GBytes *bytes = NULL;
GIOStream *stream;
path = g_test_build_filename (G_TEST_DIST, "image-data" , filename, NULL);
texture = gdk_texture_new_from_filename (path, &error);
g_assert_no_error (error);
/* Test the internal apis here */
if (g_str_has_suffix (filename, ".png" ))
bytes = gdk_save_png (texture, NULL);
else if (g_str_has_suffix (filename, ".tiff" ))
bytes = gdk_save_tiff (texture);
else if (g_str_has_suffix (filename, ".jpeg" ))
bytes = gdk_save_jpeg (texture);
else
g_assert_not_reached ();
file = g_file_new_tmp ("imageXXXXXX" , (GFileIOStream **)&stream, NULL);
g_object_unref (stream);
g_file_replace_contents (file,
g_bytes_get_data (bytes, NULL),
g_bytes_get_size (bytes),
NULL, FALSE , 0 ,
NULL, NULL, &error);
g_assert_no_error (error);
texture2 = gdk_texture_new_from_file (file, &error);
g_assert_no_error (error);
if (!g_str_has_suffix (filename, ".jpeg" ))
assert_texture_equal (texture, texture2);
g_bytes_unref (bytes);
g_object_unref (texture2);
g_object_unref (texture);
g_object_unref (file);
g_free (path);
}
static void
test_load_image_fail (gconstpointer data)
{
const char *filename = data;
char *path;
GdkTexture *texture;
GError *error = NULL;
path = g_test_build_filename (G_TEST_DIST, "bad-image-data" , filename, NULL);
texture = gdk_texture_new_from_filename (path, &error);
g_assert_nonnull (error);
g_assert_null (texture);
g_error_free (error);
g_free (path);
}
int
main (int argc, char *argv[])
{
char *path;
GDir *dir;
GError *error = NULL;
const char *name;
(g_test_init) (&argc, &argv, NULL);
path = g_test_build_filename (G_TEST_DIST, "image-data" , NULL);
dir = g_dir_open (path, 0 , &error);
g_assert_no_error (error);
g_free (path);
while ((name = g_dir_read_name (dir)) != NULL)
{
char *test = g_strconcat ("/image/load/" , name, NULL);
g_test_add_data_func_full (test, g_strdup (name), test_load_image, g_free);
g_free (test);
}
g_dir_close (dir);
path = g_test_build_filename (G_TEST_DIST, "bad-image-data" , NULL);
dir = g_dir_open (path, 0 , &error);
g_assert_no_error (error);
g_free (path);
while ((name = g_dir_read_name (dir)) != NULL)
{
char *test = g_strconcat ("/image/fail/" , name, NULL);
g_test_add_data_func_full (test, g_strdup (name), test_load_image_fail, g_free);
g_free (test);
}
g_dir_close (dir);
g_test_add_data_func ("/image/save/image.png" , "image.png" , test_save_image);
g_test_add_data_func ("/image/save/image.tiff" , "image.tiff" , test_save_image);
g_test_add_data_func ("/image/save/image.jpeg" , "image.jpeg" , test_save_image);
return g_test_run ();
}
Messung V0.5 in Prozent C=99 H=92 G=95
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-07-03)
¤
*© Formatika GbR, Deutschland