Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Check pixbuf loader signals #76

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion tests/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ t_null_error = executable('t_null_error', 't_null_error.c', dependencies : [gdk
t_scaled = executable('t_scaled', 't_scaled.c', dependencies : [gdkpb, webp, webpdemux])
t_jpeg = executable('t_jpeg', 't_jpeg.c', dependencies : [gdkpb, webp, webpdemux])
t_large = executable('t_large', 't_large.c', dependencies : [gdkpb, webp, webpdemux, gio])
t_signals = executable('t_signals', 't_signals.c', dependencies : [gdkpb, webp, webpdemux, gio])

loaders_data = configuration_data()
loaders_data.set('MODULE_PATH', fs.as_posix(pbl_webp.full_path()))
Expand All @@ -29,4 +30,5 @@ test('icc data', t_icc, env : test_env + [ test_file_base / 't2.webp']
test('NULL GError', t_null_error, env : test_env + [ test_file_base / 't2.webp'])
test('large file', t_large, env : test_env + [ test_file_base / 't_large.webp'])
test('scaled image', t_scaled, env : test_env + [ test_file_base / 't2.webp', 'TEST_FILE_ANIM=' + meson.current_source_dir() / 'data' / 't3.webp'])
test('jpeg with .webp extension', t_jpeg, env : test_env + [ test_file_base / 'test_jpeg_as_webp.webp'])
test('jpeg with .webp extension', t_jpeg, env : test_env + [ test_file_base / 'test_jpeg_as_webp.webp'])
test('signal handling', t_signals, env : test_env + [ test_file_base / 't2.webp'])
97 changes: 97 additions & 0 deletions tests/t_signals.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#include <gdk-pixbuf/gdk-pixbuf.h>

typedef struct
{
gint area_prepared_cb_count;
gint area_updated_cb_count;
gint closed_cb_count;
gint size_prepared_cb_count;
} SignalsCounters;

void
area_prepared_cb (GdkPixbufLoader* self, gpointer user_data)
{
SignalsCounters *counters = (SignalsCounters *) user_data;

counters->area_prepared_cb_count++;
}

void
area_updated_cb (GdkPixbufLoader* self, gint x, gint y, gint width, gint height, gpointer user_data)
{
SignalsCounters *counters = (SignalsCounters *) user_data;

counters->area_updated_cb_count++;

g_assert_cmpint (x, ==, 0);
g_assert_cmpint (y, ==, 0);
g_assert_cmpint (width, ==, 200);
g_assert_cmpint (height, ==, 200);
}

void
closed_cb (GdkPixbufLoader* self, gpointer user_data)
{
SignalsCounters *counters = (SignalsCounters *) user_data;

counters->closed_cb_count++;
}

void
size_prepared_cb (GdkPixbufLoader* self, gint width, gint height, gpointer user_data)
{
SignalsCounters *counters = (SignalsCounters *) user_data;

counters->size_prepared_cb_count++;

g_assert_cmpint (width, ==, 200);
g_assert_cmpint (height, ==, 200);
}

gint
main (gint argc, gchar **argv)
{
gchar **env = g_get_environ ();
GdkPixbufLoader *loader;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a big fan of uninitialized pointers, please call gdk_pixbuf_loader_new() here or just declare the variable down below, we can use modern C patterns here.

GError *error = NULL;
gsize pixbuf_size;
guchar *pixbuf_data;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please set to NULL for safety

SignalsCounters *counters = g_new0(SignalsCounters, 1);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can actually do SignalsCounter counters = { 0 }; and then pass it as &counters. No need to allocate from the heap.


loader = gdk_pixbuf_loader_new();

g_signal_connect (G_OBJECT(loader), "area-prepared", G_CALLBACK(area_prepared_cb), counters);
g_signal_connect (G_OBJECT(loader), "area-updated", G_CALLBACK(area_updated_cb), counters);
g_signal_connect (G_OBJECT(loader), "closed", G_CALLBACK(closed_cb), counters);
g_signal_connect (G_OBJECT(loader), "size-prepared", G_CALLBACK(size_prepared_cb), counters);

g_file_get_contents (g_environ_getenv (env, "TEST_FILE"), (gchar**)&pixbuf_data, &pixbuf_size, &error);
if (error)
g_error ("%s", error->message);
g_assert (error == NULL);

gdk_pixbuf_loader_write(loader, pixbuf_data, pixbuf_size, &error);
if (error)
g_error ("%s", error->message);
g_assert (error == NULL);

g_clear_pointer(&pixbuf_data, g_free);

gdk_pixbuf_loader_close(loader, &error);
if (error)
g_error ("%s", error->message);
g_assert (error == NULL);

g_clear_object(&loader);

g_clear_pointer(&env, g_strfreev);

g_assert_cmpint (counters->area_prepared_cb_count, ==, 1);
g_assert_cmpint (counters->area_updated_cb_count, ==, 1);
g_assert_cmpint (counters->closed_cb_count, ==, 1);
g_assert_cmpint (counters->size_prepared_cb_count, ==, 1);

g_clear_pointer(&counters, g_free);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As we use counters on the stack we don't need to free it anymore so we need to drop this line.


return 0;
}
Loading