diff options
author | Darin Adler <darin@src.gnome.org> | 2000-05-04 14:53:48 +0000 |
---|---|---|
committer | Darin Adler <darin@src.gnome.org> | 2000-05-04 14:53:48 +0000 |
commit | c4f23a2bf201be430ac5b2d4ed0a622cfc6df4ae (patch) | |
tree | fd194ba72e8dbb57543e4748cf7de3b5bc9cea1a /gdk-pixbuf/test-gdk-pixbuf.c | |
parent | caf029d9998bce0115257ad979a308868dbda962 (diff) | |
download | gdk-pixbuf-c4f23a2bf201be430ac5b2d4ed0a622cfc6df4ae.tar.gz |
Added some tests of composite to highlight problems in the old
* gdk-pixbuf/.cvsignore:
* gdk-pixbuf/Makefile.am:
* gdk-pixbuf/test-gdk-pixbuf.c (store_pixel), (fill_with_pixel),
(load_pixel), (simple_composite_test_one),
(simple_composite_test_one_type), (simple_composite_test), (main):
Added some tests of composite to highlight problems in the old
implementation. These tests run without any user interaction.
Just do "make check".
* gdk-pixbuf/pixops/pixops.c (pixops_composite_nearest),
(composite_pixel), (composite_line): Fix composite to do a textbook
"A over B" composite. This was clearly the intent, and it was easy
to fix the code to do it. (Note to those that read my earlier tries
at a patch; this version fixes typos that were present in all
my patch attempts. I checked the final version by adding more tests.)
Diffstat (limited to 'gdk-pixbuf/test-gdk-pixbuf.c')
-rw-r--r-- | gdk-pixbuf/test-gdk-pixbuf.c | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/gdk-pixbuf/test-gdk-pixbuf.c b/gdk-pixbuf/test-gdk-pixbuf.c index 5b96dddd0..b75f2e65e 100644 --- a/gdk-pixbuf/test-gdk-pixbuf.c +++ b/gdk-pixbuf/test-gdk-pixbuf.c @@ -1,3 +1,5 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + /* GdkPixbuf library - test program * * Copyright (C) 1999 The Free Software Foundation @@ -27,7 +29,210 @@ +static void +store_pixel (guchar *pixels, + int pixel, + gboolean alpha) +{ + if (alpha) { + pixels[0] = pixel >> 24; + pixels[1] = pixel >> 16; + pixels[2] = pixel >> 8; + pixels[3] = pixel; + } else { + pixels[0] = pixel >> 16; + pixels[1] = pixel >> 8; + pixels[2] = pixel; + } +} + +static void +fill_with_pixel (GdkPixbuf *pixbuf, + int pixel) +{ + int x, y; + + for (x = 0; x < gdk_pixbuf_get_width (pixbuf); x++) { + for (y = 0; y < gdk_pixbuf_get_height (pixbuf); y++) { + store_pixel (gdk_pixbuf_get_pixels (pixbuf) + + y * gdk_pixbuf_get_rowstride (pixbuf) + + x * gdk_pixbuf_get_n_channels (pixbuf), + pixel, + gdk_pixbuf_get_has_alpha (pixbuf)); + } + } +} + +static int +load_pixel (const guchar *pixels, + gboolean alpha) +{ + if (alpha) + return (((((pixels[0] << 8) | pixels[1]) << 8) | pixels[2]) << 8) | pixels[3]; + else + return (((pixels[0] << 8) | pixels[1]) << 8) | pixels[2]; +} + +static gboolean +simple_composite_test_one (GdkInterpType type, + int source_pixel, + gboolean source_alpha, + int destination_pixel, + gboolean destination_alpha, + int expected_result) +{ + GdkPixbuf *source_pixbuf; + GdkPixbuf *destination_pixbuf; + int result_pixel; + + source_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, source_alpha, 8, 32, 32); + destination_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, destination_alpha, 8, 32, 32); + + fill_with_pixel (source_pixbuf, source_pixel); + fill_with_pixel (destination_pixbuf, destination_pixel); + + gdk_pixbuf_composite (source_pixbuf, destination_pixbuf, + 0, 0, 32, 32, 0, 0, 1, 1, type, 0xFF); + + result_pixel = load_pixel (gdk_pixbuf_get_pixels (destination_pixbuf) + + 16 * gdk_pixbuf_get_rowstride (destination_pixbuf) + + 16 * gdk_pixbuf_get_n_channels (destination_pixbuf), + destination_alpha); + + gdk_pixbuf_unref (source_pixbuf); + gdk_pixbuf_unref (destination_pixbuf); + + if (result_pixel != expected_result) { + char *interpolation_type, *source_string, *destination_string, *result_string, *expected_string; + + switch (type) { + case GDK_INTERP_NEAREST: interpolation_type = "GDK_INTERP_NEAREST"; break; + case GDK_INTERP_TILES: interpolation_type = "GDK_INTERP_TILES"; break; + case GDK_INTERP_BILINEAR: interpolation_type = "GDK_INTERP_BILINEAR"; break; + case GDK_INTERP_HYPER: interpolation_type = "GDK_INTERP_HYPER"; break; + default: interpolation_type = "???"; + } + + if (source_alpha) { + source_string = g_strdup_printf ("0x%08X", source_pixel); + } else { + source_string = g_strdup_printf ("0x%06X", source_pixel); + } + + if (destination_alpha) { + destination_string = g_strdup_printf ("0x%08X", destination_pixel); + result_string = g_strdup_printf ("0x%08X", result_pixel); + expected_string = g_strdup_printf ("0x%08X", expected_result); + } else { + destination_string = g_strdup_printf ("0x%06X", destination_pixel); + result_string = g_strdup_printf ("0x%06X", result_pixel); + expected_string = g_strdup_printf ("0x%06X", expected_result); + } + + g_message ("simple_composite_test (%s): composite %s on top of %s, expected %s, got %s", + interpolation_type, + source_string, destination_string, expected_string, result_string); + return FALSE; + } + + return TRUE; +} + +static gboolean +simple_composite_test_one_type (GdkInterpType type) +{ + gboolean success; + + success = TRUE; + + /* There are only a few trivial cases in here. + * But these were enough to expose the problems in the old composite code. + */ + + /* Non-alpha into non-alpha. */ + success &= simple_composite_test_one (type, 0x000000, FALSE, 0x000000, FALSE, 0x000000); + success &= simple_composite_test_one (type, 0x000000, FALSE, 0xFFFFFF, FALSE, 0x000000); + success &= simple_composite_test_one (type, 0xFF0000, FALSE, 0x000000, FALSE, 0xFF0000); + success &= simple_composite_test_one (type, 0x00FF00, FALSE, 0x000000, FALSE, 0x00FF00); + success &= simple_composite_test_one (type, 0x0000FF, FALSE, 0x000000, FALSE, 0x0000FF); + success &= simple_composite_test_one (type, 0x000000, FALSE, 0xFF0000, FALSE, 0x000000); + success &= simple_composite_test_one (type, 0x000000, FALSE, 0x00FF00, FALSE, 0x000000); + success &= simple_composite_test_one (type, 0x000000, FALSE, 0x0000FF, FALSE, 0x000000); + success &= simple_composite_test_one (type, 0x00FF00, FALSE, 0xFFFFFF, FALSE, 0x00FF00); + success &= simple_composite_test_one (type, 0xFFFFFF, FALSE, 0xFFFFFF, FALSE, 0xFFFFFF); + + /* Alpha into non-alpha. */ + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0x000000, FALSE, 0x000000); + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0xFFFFFF, FALSE, 0xFFFFFF); + success &= simple_composite_test_one (type, 0x0000007F, TRUE, 0xFFFFFF, FALSE, 0x808080); + success &= simple_composite_test_one (type, 0x00000080, TRUE, 0xFFFFFF, FALSE, 0x7F7F7F); + success &= simple_composite_test_one (type, 0x000000FF, TRUE, 0xFFFFFF, FALSE, 0x000000); + success &= simple_composite_test_one (type, 0x000000FF, TRUE, 0xFFFFFF, FALSE, 0x000000); + success &= simple_composite_test_one (type, 0xFF0000FF, TRUE, 0x000000, FALSE, 0xFF0000); + success &= simple_composite_test_one (type, 0x00FF00FF, TRUE, 0x000000, FALSE, 0x00FF00); + success &= simple_composite_test_one (type, 0x0000FFFF, TRUE, 0x000000, FALSE, 0x0000FF); + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0xFF0000, FALSE, 0xFF0000); + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0x00FF00, FALSE, 0x00FF00); + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0x0000FF, FALSE, 0x0000FF); + success &= simple_composite_test_one (type, 0x00FF0080, TRUE, 0xFFFFFF, FALSE, 0x7FFF7F); + success &= simple_composite_test_one (type, 0xFFFFFFFF, TRUE, 0xFFFFFF, FALSE, 0xFFFFFF); + + /* Non-alpha into alpha. */ + success &= simple_composite_test_one (type, 0x000000, FALSE, 0x00000000, TRUE, 0x000000FF); + success &= simple_composite_test_one (type, 0x000000, FALSE, 0xFFFFFFFF, TRUE, 0x000000FF); + success &= simple_composite_test_one (type, 0xFF0000, FALSE, 0x00000000, TRUE, 0xFF0000FF); + success &= simple_composite_test_one (type, 0x00FF00, FALSE, 0x00000000, TRUE, 0x00FF00FF); + success &= simple_composite_test_one (type, 0x0000FF, FALSE, 0x00000000, TRUE, 0x0000FFFF); + success &= simple_composite_test_one (type, 0x000000, FALSE, 0xFF0000FF, TRUE, 0x000000FF); + success &= simple_composite_test_one (type, 0x000000, FALSE, 0x00FF00FF, TRUE, 0x000000FF); + success &= simple_composite_test_one (type, 0x000000, FALSE, 0x0000FFFF, TRUE, 0x000000FF); + success &= simple_composite_test_one (type, 0x00FF00, FALSE, 0xFFFFFF00, TRUE, 0x00FF00FF); + success &= simple_composite_test_one (type, 0xFFFFFF, FALSE, 0xFFFFFFFF, TRUE, 0xFFFFFFFF); + + /* Alpha into alpha. */ + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0x00000000, TRUE, 0x00000000); + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0xFFFFFFFF, TRUE, 0xFFFFFFFF); + success &= simple_composite_test_one (type, 0x0000007F, TRUE, 0xFFFFFFFF, TRUE, 0x808080FF); + success &= simple_composite_test_one (type, 0x00000080, TRUE, 0xFFFFFFFF, TRUE, 0x7F7F7FFF); + success &= simple_composite_test_one (type, 0x000000FF, TRUE, 0xFFFFFFFF, TRUE, 0x000000FF); + success &= simple_composite_test_one (type, 0xFF0000FF, TRUE, 0x00000000, TRUE, 0xFF0000FF); + success &= simple_composite_test_one (type, 0x00FF00FF, TRUE, 0x00000000, TRUE, 0x00FF00FF); + success &= simple_composite_test_one (type, 0x0000FFFF, TRUE, 0x00000000, TRUE, 0x0000FFFF); + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0xFF0000FF, TRUE, 0xFF0000FF); + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0x00FF00FF, TRUE, 0x00FF00FF); + success &= simple_composite_test_one (type, 0x00000000, TRUE, 0x0000FFFF, TRUE, 0x0000FFFF); + success &= simple_composite_test_one (type, 0x00FF0080, TRUE, 0xFFFFFF00, TRUE, 0x7FFF7F80); + success &= simple_composite_test_one (type, 0xFFFFFFFF, TRUE, 0xFFFFFFFF, TRUE, 0xFFFFFFFF); + + return success; +} + +static gboolean +simple_composite_test (void) +{ + gboolean success; + + success = TRUE; + + success &= simple_composite_test_one_type (GDK_INTERP_NEAREST); + success &= simple_composite_test_one_type (GDK_INTERP_TILES); + success &= simple_composite_test_one_type (GDK_INTERP_BILINEAR); + success &= simple_composite_test_one_type (GDK_INTERP_HYPER); + + return success; +} + int main (int argc, char **argv) { + int result; + + result = EXIT_SUCCESS; + + /* Run some tests. */ + if (!simple_composite_test ()) { + result = EXIT_FAILURE; + } + + return result; } |