diff options
Diffstat (limited to 'pixman/test')
-rw-r--r-- | pixman/test/Makefile.am | 65 | ||||
-rw-r--r-- | pixman/test/Makefile.in | 196 | ||||
-rw-r--r-- | pixman/test/alpha-test.c | 117 | ||||
-rw-r--r-- | pixman/test/clip-in.c | 50 | ||||
-rw-r--r-- | pixman/test/clip-test.c | 70 | ||||
-rw-r--r-- | pixman/test/composite-test.c | 212 | ||||
-rw-r--r-- | pixman/test/convolution-test.c | 47 | ||||
-rw-r--r-- | pixman/test/fetch-test.c | 2 | ||||
-rw-r--r-- | pixman/test/gradient-test.c | 102 | ||||
-rw-r--r-- | pixman/test/oob-test.c | 101 | ||||
-rw-r--r-- | pixman/test/region-test.c | 63 | ||||
-rw-r--r-- | pixman/test/scaling-test.c | 474 | ||||
-rw-r--r-- | pixman/test/screen-test.c | 44 | ||||
-rw-r--r-- | pixman/test/trap-crasher.c | 27 | ||||
-rw-r--r-- | pixman/test/trap-test.c | 49 | ||||
-rw-r--r-- | pixman/test/utils.c | 113 | ||||
-rw-r--r-- | pixman/test/utils.h | 6 | ||||
-rw-r--r-- | pixman/test/window-test.c | 173 |
18 files changed, 1620 insertions, 291 deletions
diff --git a/pixman/test/Makefile.am b/pixman/test/Makefile.am index 33e2200db..324cb723d 100644 --- a/pixman/test/Makefile.am +++ b/pixman/test/Makefile.am @@ -1,19 +1,64 @@ -if HAVE_GTK +TEST_LDADD = $(top_builddir)/pixman/libpixman-1.la +INCLUDES = -I$(top_srcdir)/pixman -I$(top_builddir)/pixman + TESTPROGRAMS = \ + region-test \ + scaling-test \ + fetch-test \ + oob-test \ + window-test \ + trap-crasher + +fetch_test_LDADD = $(TEST_LDADD) +region_test_LDADD = $(TEST_LDADD) +scaling_test_LDADD = $(TEST_LDADD) +trap_crasher_LDADD = $(TEST_LDADD) +oob_test_LDADD = $(TEST_LDADD) +window_test_LDADD = $(TEST_LDADD) + +# GTK using test programs + +if HAVE_GTK + +GTK_LDADD = $(TEST_LDADD) $(GTK_LIBS) + +TESTPROGRAMS += \ clip-test \ + clip-in \ composite-test \ gradient-test \ - region-test \ - fetch-test + alpha-test \ + screen-test \ + convolution-test \ + trap-test -noinst_PROGRAMS = $(TESTPROGRAMS) +INCLUDES += $(GTK_CFLAGS) + +gradient_test_LDADD = $(GTK_LDADD) +gradient_test_SOURCES = gradient-test.c utils.c utils.h + +alpha_test_LDADD = $(GTK_LDADD) +alpha_test_SOURCES = alpha-test.c utils.c utils.h + +composite_test_LDADD = $(GTK_LDADD) +composite_test_SOURCES = composite-test.c utils.c utils.h + +clip_test_LDADD = $(GTK_LDADD) +clip_test_SOURCES = clip-test.c utils.c utils.h -INCLUDES = -I$(top_srcdir)/pixman -I$(top_builddir)/pixman $(GTK_CFLAGS) +clip_in_LDADD = $(GTK_LDADD) +clip_in_SOURCES = clip-in.c utils.c utils.h -composite_test_LDADD = $(top_builddir)/pixman/libpixman-1.la $(GTK_LIBS) -gradient_test_LDADD = $(top_builddir)/pixman/libpixman-1.la $(GTK_LIBS) -fetch_test_LDADD = $(top_builddir)/pixman/libpixman-1.la -region_test_LDADD = $(top_builddir)/pixman/libpixman-1.la -clip_test_LDADD = $(top_builddir)/pixman/libpixman-1.la $(GTK_LIBS) +trap_test_LDADD = $(GTK_LDADD) +trap_test_SOURCES = trap-test.c utils.c utils.h + +screen_test_LDADD = $(GTK_LDADD) +screen_test_SOURCES = screen-test.c utils.c utils.h + +convolution_test_LDADD = $(GTK_LDADD) +convolution_test_SOURCES = convolution-test.c utils.c utils.h endif + +noinst_PROGRAMS = $(TESTPROGRAMS) + diff --git a/pixman/test/Makefile.in b/pixman/test/Makefile.in index e6ee5c05c..acdef4f78 100644 --- a/pixman/test/Makefile.in +++ b/pixman/test/Makefile.in @@ -32,7 +32,18 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -@HAVE_GTK_TRUE@noinst_PROGRAMS = $(am__EXEEXT_1) +@HAVE_GTK_TRUE@am__append_1 = \ +@HAVE_GTK_TRUE@ clip-test \ +@HAVE_GTK_TRUE@ clip-in \ +@HAVE_GTK_TRUE@ composite-test \ +@HAVE_GTK_TRUE@ gradient-test \ +@HAVE_GTK_TRUE@ alpha-test \ +@HAVE_GTK_TRUE@ screen-test \ +@HAVE_GTK_TRUE@ convolution-test \ +@HAVE_GTK_TRUE@ trap-test + +@HAVE_GTK_TRUE@am__append_2 = $(GTK_CFLAGS) +noinst_PROGRAMS = $(am__EXEEXT_2) subdir = test DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -42,34 +53,74 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -@HAVE_GTK_TRUE@am__EXEEXT_1 = clip-test$(EXEEXT) \ +@HAVE_GTK_TRUE@am__EXEEXT_1 = clip-test$(EXEEXT) clip-in$(EXEEXT) \ @HAVE_GTK_TRUE@ composite-test$(EXEEXT) gradient-test$(EXEEXT) \ -@HAVE_GTK_TRUE@ region-test$(EXEEXT) fetch-test$(EXEEXT) +@HAVE_GTK_TRUE@ alpha-test$(EXEEXT) screen-test$(EXEEXT) \ +@HAVE_GTK_TRUE@ convolution-test$(EXEEXT) trap-test$(EXEEXT) +am__EXEEXT_2 = region-test$(EXEEXT) scaling-test$(EXEEXT) \ + fetch-test$(EXEEXT) oob-test$(EXEEXT) window-test$(EXEEXT) \ + trap-crasher$(EXEEXT) $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) -clip_test_SOURCES = clip-test.c -clip_test_OBJECTS = clip-test.$(OBJEXT) +am__alpha_test_SOURCES_DIST = alpha-test.c utils.c utils.h +@HAVE_GTK_TRUE@am_alpha_test_OBJECTS = alpha-test.$(OBJEXT) \ +@HAVE_GTK_TRUE@ utils.$(OBJEXT) +alpha_test_OBJECTS = $(am_alpha_test_OBJECTS) am__DEPENDENCIES_1 = -@HAVE_GTK_TRUE@clip_test_DEPENDENCIES = \ -@HAVE_GTK_TRUE@ $(top_builddir)/pixman/libpixman-1.la \ -@HAVE_GTK_TRUE@ $(am__DEPENDENCIES_1) -composite_test_SOURCES = composite-test.c -composite_test_OBJECTS = composite-test.$(OBJEXT) -@HAVE_GTK_TRUE@composite_test_DEPENDENCIES = \ -@HAVE_GTK_TRUE@ $(top_builddir)/pixman/libpixman-1.la \ +@HAVE_GTK_TRUE@am__DEPENDENCIES_2 = $(TEST_LDADD) \ @HAVE_GTK_TRUE@ $(am__DEPENDENCIES_1) +@HAVE_GTK_TRUE@alpha_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +am__clip_in_SOURCES_DIST = clip-in.c utils.c utils.h +@HAVE_GTK_TRUE@am_clip_in_OBJECTS = clip-in.$(OBJEXT) utils.$(OBJEXT) +clip_in_OBJECTS = $(am_clip_in_OBJECTS) +@HAVE_GTK_TRUE@clip_in_DEPENDENCIES = $(am__DEPENDENCIES_2) +am__clip_test_SOURCES_DIST = clip-test.c utils.c utils.h +@HAVE_GTK_TRUE@am_clip_test_OBJECTS = clip-test.$(OBJEXT) \ +@HAVE_GTK_TRUE@ utils.$(OBJEXT) +clip_test_OBJECTS = $(am_clip_test_OBJECTS) +@HAVE_GTK_TRUE@clip_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +am__composite_test_SOURCES_DIST = composite-test.c utils.c utils.h +@HAVE_GTK_TRUE@am_composite_test_OBJECTS = composite-test.$(OBJEXT) \ +@HAVE_GTK_TRUE@ utils.$(OBJEXT) +composite_test_OBJECTS = $(am_composite_test_OBJECTS) +@HAVE_GTK_TRUE@composite_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +am__convolution_test_SOURCES_DIST = convolution-test.c utils.c utils.h +@HAVE_GTK_TRUE@am_convolution_test_OBJECTS = \ +@HAVE_GTK_TRUE@ convolution-test.$(OBJEXT) utils.$(OBJEXT) +convolution_test_OBJECTS = $(am_convolution_test_OBJECTS) +@HAVE_GTK_TRUE@convolution_test_DEPENDENCIES = $(am__DEPENDENCIES_2) fetch_test_SOURCES = fetch-test.c fetch_test_OBJECTS = fetch-test.$(OBJEXT) -@HAVE_GTK_TRUE@fetch_test_DEPENDENCIES = \ -@HAVE_GTK_TRUE@ $(top_builddir)/pixman/libpixman-1.la -gradient_test_SOURCES = gradient-test.c -gradient_test_OBJECTS = gradient-test.$(OBJEXT) -@HAVE_GTK_TRUE@gradient_test_DEPENDENCIES = \ -@HAVE_GTK_TRUE@ $(top_builddir)/pixman/libpixman-1.la \ -@HAVE_GTK_TRUE@ $(am__DEPENDENCIES_1) +fetch_test_DEPENDENCIES = $(TEST_LDADD) +am__gradient_test_SOURCES_DIST = gradient-test.c utils.c utils.h +@HAVE_GTK_TRUE@am_gradient_test_OBJECTS = gradient-test.$(OBJEXT) \ +@HAVE_GTK_TRUE@ utils.$(OBJEXT) +gradient_test_OBJECTS = $(am_gradient_test_OBJECTS) +@HAVE_GTK_TRUE@gradient_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +oob_test_SOURCES = oob-test.c +oob_test_OBJECTS = oob-test.$(OBJEXT) +oob_test_DEPENDENCIES = $(TEST_LDADD) region_test_SOURCES = region-test.c region_test_OBJECTS = region-test.$(OBJEXT) -@HAVE_GTK_TRUE@region_test_DEPENDENCIES = \ -@HAVE_GTK_TRUE@ $(top_builddir)/pixman/libpixman-1.la +region_test_DEPENDENCIES = $(TEST_LDADD) +scaling_test_SOURCES = scaling-test.c +scaling_test_OBJECTS = scaling-test.$(OBJEXT) +scaling_test_DEPENDENCIES = $(TEST_LDADD) +am__screen_test_SOURCES_DIST = screen-test.c utils.c utils.h +@HAVE_GTK_TRUE@am_screen_test_OBJECTS = screen-test.$(OBJEXT) \ +@HAVE_GTK_TRUE@ utils.$(OBJEXT) +screen_test_OBJECTS = $(am_screen_test_OBJECTS) +@HAVE_GTK_TRUE@screen_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +trap_crasher_SOURCES = trap-crasher.c +trap_crasher_OBJECTS = trap-crasher.$(OBJEXT) +trap_crasher_DEPENDENCIES = $(TEST_LDADD) +am__trap_test_SOURCES_DIST = trap-test.c utils.c utils.h +@HAVE_GTK_TRUE@am_trap_test_OBJECTS = trap-test.$(OBJEXT) \ +@HAVE_GTK_TRUE@ utils.$(OBJEXT) +trap_test_OBJECTS = $(am_trap_test_OBJECTS) +@HAVE_GTK_TRUE@trap_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +window_test_SOURCES = window-test.c +window_test_OBJECTS = window-test.$(OBJEXT) +window_test_DEPENDENCIES = $(TEST_LDADD) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -82,16 +133,27 @@ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ -SOURCES = clip-test.c composite-test.c fetch-test.c gradient-test.c \ - region-test.c -DIST_SOURCES = clip-test.c composite-test.c fetch-test.c \ - gradient-test.c region-test.c +SOURCES = $(alpha_test_SOURCES) $(clip_in_SOURCES) \ + $(clip_test_SOURCES) $(composite_test_SOURCES) \ + $(convolution_test_SOURCES) fetch-test.c \ + $(gradient_test_SOURCES) oob-test.c region-test.c \ + scaling-test.c $(screen_test_SOURCES) trap-crasher.c \ + $(trap_test_SOURCES) window-test.c +DIST_SOURCES = $(am__alpha_test_SOURCES_DIST) \ + $(am__clip_in_SOURCES_DIST) $(am__clip_test_SOURCES_DIST) \ + $(am__composite_test_SOURCES_DIST) \ + $(am__convolution_test_SOURCES_DIST) fetch-test.c \ + $(am__gradient_test_SOURCES_DIST) oob-test.c region-test.c \ + scaling-test.c $(am__screen_test_SOURCES_DIST) trap-crasher.c \ + $(am__trap_test_SOURCES_DIST) window-test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ +ARM_NEON_CFLAGS = @ARM_NEON_CFLAGS@ +ARM_SIMD_CFLAGS = @ARM_SIMD_CFLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ @@ -137,6 +199,7 @@ LT_VERSION_INFO = @LT_VERSION_INFO@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MMX_CFLAGS = @MMX_CFLAGS@ +MMX_LDFLAGS = @MMX_LDFLAGS@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ @@ -147,6 +210,7 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ +PIXMAN_TIMERS = @PIXMAN_TIMERS@ PIXMAN_VERSION_MAJOR = @PIXMAN_VERSION_MAJOR@ PIXMAN_VERSION_MICRO = @PIXMAN_VERSION_MICRO@ PIXMAN_VERSION_MINOR = @PIXMAN_VERSION_MINOR@ @@ -156,6 +220,7 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE2_LDFLAGS = @SSE2_LDFLAGS@ STRIP = @STRIP@ VERSION = @VERSION@ VMX_CFLAGS = @VMX_CFLAGS@ @@ -208,21 +273,39 @@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -@HAVE_GTK_TRUE@TESTPROGRAMS = \ -@HAVE_GTK_TRUE@ clip-test \ -@HAVE_GTK_TRUE@ composite-test \ -@HAVE_GTK_TRUE@ gradient-test \ -@HAVE_GTK_TRUE@ region-test \ -@HAVE_GTK_TRUE@ fetch-test - -@HAVE_GTK_TRUE@INCLUDES = -I$(top_srcdir)/pixman -I$(top_builddir)/pixman $(GTK_CFLAGS) -@HAVE_GTK_TRUE@composite_test_LDADD = $(top_builddir)/pixman/libpixman-1.la $(GTK_LIBS) -@HAVE_GTK_TRUE@gradient_test_LDADD = $(top_builddir)/pixman/libpixman-1.la $(GTK_LIBS) -@HAVE_GTK_TRUE@fetch_test_LDADD = $(top_builddir)/pixman/libpixman-1.la -@HAVE_GTK_TRUE@region_test_LDADD = $(top_builddir)/pixman/libpixman-1.la -@HAVE_GTK_TRUE@clip_test_LDADD = $(top_builddir)/pixman/libpixman-1.la $(GTK_LIBS) +TEST_LDADD = $(top_builddir)/pixman/libpixman-1.la +INCLUDES = -I$(top_srcdir)/pixman -I$(top_builddir)/pixman \ + $(am__append_2) +TESTPROGRAMS = region-test scaling-test fetch-test oob-test \ + window-test trap-crasher $(am__append_1) +fetch_test_LDADD = $(TEST_LDADD) +region_test_LDADD = $(TEST_LDADD) +scaling_test_LDADD = $(TEST_LDADD) +trap_crasher_LDADD = $(TEST_LDADD) +oob_test_LDADD = $(TEST_LDADD) +window_test_LDADD = $(TEST_LDADD) + +# GTK using test programs +@HAVE_GTK_TRUE@GTK_LDADD = $(TEST_LDADD) $(GTK_LIBS) +@HAVE_GTK_TRUE@gradient_test_LDADD = $(GTK_LDADD) +@HAVE_GTK_TRUE@gradient_test_SOURCES = gradient-test.c utils.c utils.h +@HAVE_GTK_TRUE@alpha_test_LDADD = $(GTK_LDADD) +@HAVE_GTK_TRUE@alpha_test_SOURCES = alpha-test.c utils.c utils.h +@HAVE_GTK_TRUE@composite_test_LDADD = $(GTK_LDADD) +@HAVE_GTK_TRUE@composite_test_SOURCES = composite-test.c utils.c utils.h +@HAVE_GTK_TRUE@clip_test_LDADD = $(GTK_LDADD) +@HAVE_GTK_TRUE@clip_test_SOURCES = clip-test.c utils.c utils.h +@HAVE_GTK_TRUE@clip_in_LDADD = $(GTK_LDADD) +@HAVE_GTK_TRUE@clip_in_SOURCES = clip-in.c utils.c utils.h +@HAVE_GTK_TRUE@trap_test_LDADD = $(GTK_LDADD) +@HAVE_GTK_TRUE@trap_test_SOURCES = trap-test.c utils.c utils.h +@HAVE_GTK_TRUE@screen_test_LDADD = $(GTK_LDADD) +@HAVE_GTK_TRUE@screen_test_SOURCES = screen-test.c utils.c utils.h +@HAVE_GTK_TRUE@convolution_test_LDADD = $(GTK_LDADD) +@HAVE_GTK_TRUE@convolution_test_SOURCES = convolution-test.c utils.c utils.h all: all-am .SUFFIXES: @@ -263,21 +346,48 @@ clean-noinstPROGRAMS: echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done +alpha-test$(EXEEXT): $(alpha_test_OBJECTS) $(alpha_test_DEPENDENCIES) + @rm -f alpha-test$(EXEEXT) + $(LINK) $(alpha_test_OBJECTS) $(alpha_test_LDADD) $(LIBS) +clip-in$(EXEEXT): $(clip_in_OBJECTS) $(clip_in_DEPENDENCIES) + @rm -f clip-in$(EXEEXT) + $(LINK) $(clip_in_OBJECTS) $(clip_in_LDADD) $(LIBS) clip-test$(EXEEXT): $(clip_test_OBJECTS) $(clip_test_DEPENDENCIES) @rm -f clip-test$(EXEEXT) $(LINK) $(clip_test_OBJECTS) $(clip_test_LDADD) $(LIBS) composite-test$(EXEEXT): $(composite_test_OBJECTS) $(composite_test_DEPENDENCIES) @rm -f composite-test$(EXEEXT) $(LINK) $(composite_test_OBJECTS) $(composite_test_LDADD) $(LIBS) +convolution-test$(EXEEXT): $(convolution_test_OBJECTS) $(convolution_test_DEPENDENCIES) + @rm -f convolution-test$(EXEEXT) + $(LINK) $(convolution_test_OBJECTS) $(convolution_test_LDADD) $(LIBS) fetch-test$(EXEEXT): $(fetch_test_OBJECTS) $(fetch_test_DEPENDENCIES) @rm -f fetch-test$(EXEEXT) $(LINK) $(fetch_test_OBJECTS) $(fetch_test_LDADD) $(LIBS) gradient-test$(EXEEXT): $(gradient_test_OBJECTS) $(gradient_test_DEPENDENCIES) @rm -f gradient-test$(EXEEXT) $(LINK) $(gradient_test_OBJECTS) $(gradient_test_LDADD) $(LIBS) +oob-test$(EXEEXT): $(oob_test_OBJECTS) $(oob_test_DEPENDENCIES) + @rm -f oob-test$(EXEEXT) + $(LINK) $(oob_test_OBJECTS) $(oob_test_LDADD) $(LIBS) region-test$(EXEEXT): $(region_test_OBJECTS) $(region_test_DEPENDENCIES) @rm -f region-test$(EXEEXT) $(LINK) $(region_test_OBJECTS) $(region_test_LDADD) $(LIBS) +scaling-test$(EXEEXT): $(scaling_test_OBJECTS) $(scaling_test_DEPENDENCIES) + @rm -f scaling-test$(EXEEXT) + $(LINK) $(scaling_test_OBJECTS) $(scaling_test_LDADD) $(LIBS) +screen-test$(EXEEXT): $(screen_test_OBJECTS) $(screen_test_DEPENDENCIES) + @rm -f screen-test$(EXEEXT) + $(LINK) $(screen_test_OBJECTS) $(screen_test_LDADD) $(LIBS) +trap-crasher$(EXEEXT): $(trap_crasher_OBJECTS) $(trap_crasher_DEPENDENCIES) + @rm -f trap-crasher$(EXEEXT) + $(LINK) $(trap_crasher_OBJECTS) $(trap_crasher_LDADD) $(LIBS) +trap-test$(EXEEXT): $(trap_test_OBJECTS) $(trap_test_DEPENDENCIES) + @rm -f trap-test$(EXEEXT) + $(LINK) $(trap_test_OBJECTS) $(trap_test_LDADD) $(LIBS) +window-test$(EXEEXT): $(window_test_OBJECTS) $(window_test_DEPENDENCIES) + @rm -f window-test$(EXEEXT) + $(LINK) $(window_test_OBJECTS) $(window_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -285,11 +395,21 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alpha-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clip-in.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clip-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/composite-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convolution-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fetch-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gradient-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oob-test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/region-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scaling-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/screen-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trap-crasher.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trap-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/window-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< diff --git a/pixman/test/alpha-test.c b/pixman/test/alpha-test.c new file mode 100644 index 000000000..e2b97c789 --- /dev/null +++ b/pixman/test/alpha-test.c @@ -0,0 +1,117 @@ +#include <stdio.h> +#include <stdlib.h> +#include "pixman.h" +#include "utils.h" + +int +main (int argc, char **argv) +{ +#define WIDTH 400 +#define HEIGHT 200 + + uint32_t *alpha = malloc (WIDTH * HEIGHT * 4); + uint32_t *dest = malloc (WIDTH * HEIGHT * 4); + uint32_t *src = malloc (WIDTH * HEIGHT * 4); + pixman_image_t *grad_img; + pixman_image_t *alpha_img; + pixman_image_t *solid_img; + pixman_image_t *dest_img; + pixman_image_t *src_img; + int i; + pixman_gradient_stop_t stops[2] = + { + { pixman_int_to_fixed (0), { 0x0000, 0x0000, 0x0000, 0x0000 } }, + { pixman_int_to_fixed (1), { 0xffff, 0x0000, 0x1111, 0xffff } } + }; + pixman_point_fixed_t p1 = { pixman_double_to_fixed (0), 0 }; + pixman_point_fixed_t p2 = { pixman_double_to_fixed (WIDTH), + pixman_int_to_fixed (0) }; + pixman_transform_t trans = { + { { pixman_double_to_fixed (2), pixman_double_to_fixed (0.5), pixman_double_to_fixed (-100), }, + { pixman_double_to_fixed (0), pixman_double_to_fixed (3), pixman_double_to_fixed (0), }, + { pixman_double_to_fixed (0), pixman_double_to_fixed (0.000), pixman_double_to_fixed (1.0) } + } + }; + + pixman_transform_t id = { + { { pixman_fixed_1, 0, 0 }, + { 0, pixman_fixed_1, 0 }, + { 0, 0, pixman_fixed_1 } } + }; + + pixman_point_fixed_t c_inner; + pixman_point_fixed_t c_outer; + pixman_fixed_t r_inner; + pixman_fixed_t r_outer; + pixman_color_t red = { 0xffff, 0x0000, 0x0000, 0xffff }; + + for (i = 0; i < WIDTH * HEIGHT; ++i) + alpha[i] = 0x4f00004f; /* pale blue */ + + alpha_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, + WIDTH, HEIGHT, + alpha, + WIDTH * 4); + + for (i = 0; i < WIDTH * HEIGHT; ++i) + dest[i] = 0xffffff00; /* yellow */ + + dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, + WIDTH, HEIGHT, + dest, + WIDTH * 4); + + for (i = 0; i < WIDTH * HEIGHT; ++i) + src[i] = 0xffff0000; + + src_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, + WIDTH, HEIGHT, + src, + WIDTH * 4); + + c_inner.x = pixman_double_to_fixed (50.0); + c_inner.y = pixman_double_to_fixed (50.0); + c_outer.x = pixman_double_to_fixed (50.0); + c_outer.y = pixman_double_to_fixed (50.0); + r_inner = 0; + r_outer = pixman_double_to_fixed (50.0); + +#if 0 + grad_img = pixman_image_create_conical_gradient (&c_inner, r_inner, + stops, 2); +#endif +#if 0 + grad_img = pixman_image_create_conical_gradient (&c_inner, r_inner, + stops, 2); + grad_img = pixman_image_create_linear_gradient (&c_inner, &c_outer, + r_inner, r_outer, + stops, 2); +#endif + + grad_img = pixman_image_create_linear_gradient (&p1, &p2, + stops, 2); + + pixman_image_set_transform (grad_img, &id); + pixman_image_set_repeat (grad_img, PIXMAN_REPEAT_PAD); + + pixman_image_composite (PIXMAN_OP_OVER, grad_img, NULL, alpha_img, + 0, 0, 0, 0, 0, 0, 10 * WIDTH, HEIGHT); + + pixman_image_set_alpha_map (src_img, alpha_img, 10, 10); + + pixman_image_composite (PIXMAN_OP_OVER, src_img, NULL, dest_img, + 0, 0, 0, 0, 0, 0, 10 * WIDTH, HEIGHT); + + printf ("0, 0: %x\n", dest[0]); + printf ("10, 10: %x\n", dest[10 * 10 + 10]); + printf ("w, h: %x\n", dest[(HEIGHT - 1) * 100 + (WIDTH - 1)]); + + show_image (dest_img); + + pixman_image_unref (src_img); + pixman_image_unref (grad_img); + pixman_image_unref (alpha_img); + free (dest); + + return 0; +} diff --git a/pixman/test/clip-in.c b/pixman/test/clip-in.c new file mode 100644 index 000000000..55459b204 --- /dev/null +++ b/pixman/test/clip-in.c @@ -0,0 +1,50 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "pixman.h" +#include "utils.h" + +/* This test demonstrates that clipping is done totally different depending + * on whether the source is transformed or not. + */ +int +main (int argc, char **argv) +{ +#define WIDTH 200 +#define HEIGHT 200 + +#define SMALL 25 + + uint32_t *sbits = malloc (SMALL * SMALL * 4); + uint32_t *bits = malloc (WIDTH * HEIGHT * 4); + pixman_transform_t trans = { + { + { pixman_double_to_fixed (1.0), pixman_double_to_fixed (0), pixman_double_to_fixed (-0.1), }, + { pixman_double_to_fixed (0), pixman_double_to_fixed (1), pixman_double_to_fixed (-0.1), }, + { pixman_double_to_fixed (0), pixman_double_to_fixed (0), pixman_double_to_fixed (1.0) } + } }; + + pixman_image_t *src_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, SMALL, SMALL, sbits, 4 * SMALL); + pixman_image_t *dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, bits, 4 * WIDTH); + + memset (bits, 0xff, WIDTH * HEIGHT * 4); + memset (sbits, 0x00, SMALL * SMALL * 4); + + pixman_image_composite (PIXMAN_OP_IN, + src_img, NULL, dest_img, + 0, 0, 0, 0, SMALL, SMALL, 200, 200); + + pixman_image_set_transform (src_img, &trans); + + pixman_image_composite (PIXMAN_OP_IN, + src_img, NULL, dest_img, + 0, 0, 0, 0, SMALL * 2, SMALL * 2, 200, 200); + + show_image (dest_img); + + pixman_image_unref (src_img); + pixman_image_unref (dest_img); + free (bits); + + return 0; +} diff --git a/pixman/test/clip-test.c b/pixman/test/clip-test.c index 457e97a2b..900013718 100644 --- a/pixman/test/clip-test.c +++ b/pixman/test/clip-test.c @@ -1,70 +1,7 @@ #include <stdio.h> #include <stdlib.h> -#include <gtk/gtk.h> #include "pixman.h" - -GdkPixbuf * -pixbuf_from_argb32 (uint32_t *bits, - int width, - int height, - int stride) -{ - GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, - 8, width, height); - int p_stride = gdk_pixbuf_get_rowstride (pixbuf); - guint32 *p_bits = (guint32 *)gdk_pixbuf_get_pixels (pixbuf); - int w, h; - - for (h = 0; h < height; ++h) - { - for (w = 0; w < width; ++w) - { - uint32_t argb = bits[h * stride + w]; - guint32 abgr; - - abgr = (argb & 0xff000000) | - (argb & 0xff) << 16 | - (argb & 0x00ff00) | - (argb & 0xff0000) >> 16; - - p_bits[h * (p_stride / 4) + w] = abgr; - } - } - - return pixbuf; -} - -static gboolean -on_expose (GtkWidget *widget, GdkEventExpose *expose, gpointer data) -{ - GdkPixbuf *pixbuf = data; - - gdk_draw_pixbuf (widget->window, NULL, - pixbuf, 0, 0, 0, 0, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - GDK_RGB_DITHER_NONE, - 0, 0); - - return TRUE; -} - -static void -show_window (pixman_image_t *img, int w, int h, int stride) -{ - GdkPixbuf *pixbuf; - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - pixbuf = pixbuf_from_argb32 (pixman_image_get_data (img), w, h, stride); - - g_signal_connect (window, "expose_event", G_CALLBACK (on_expose), pixbuf); - g_signal_connect (window, "delete_event", G_CALLBACK (gtk_main_quit), NULL); - - gtk_widget_show (window); - - gtk_main (); -} +#include "utils.h" #define WIDTH 200 #define HEIGHT 200 @@ -109,8 +46,6 @@ main (int argc, char **argv) } }; - gtk_init (&argc, &argv); - src_img = create_solid_bits (0xff0000ff); c_inner.x = pixman_double_to_fixed (100.0); @@ -136,6 +71,7 @@ main (int argc, char **argv) pixman_region32_init_rect (&clip_region, 50, 0, 100, 200); pixman_image_set_clip_region32 (src_img, &clip_region); pixman_image_set_source_clipping (src_img, TRUE); + pixman_image_set_has_client_clip (src_img, TRUE); pixman_image_set_transform (src_img, &trans); pixman_image_set_repeat (src_img, PIXMAN_REPEAT_NORMAL); @@ -150,7 +86,7 @@ main (int argc, char **argv) printf ("w, h: %x\n", src[(HEIGHT - 1) * 100 + (WIDTH - 1)]); #endif - show_window (dst_img, WIDTH, HEIGHT, WIDTH); + show_image (dst_img); pixman_image_unref (gradient_img); pixman_image_unref (src_img); diff --git a/pixman/test/composite-test.c b/pixman/test/composite-test.c index d6596f496..49e0220a4 100644 --- a/pixman/test/composite-test.c +++ b/pixman/test/composite-test.c @@ -1,70 +1,49 @@ +#include <gtk/gtk.h> #include <stdlib.h> #include <stdio.h> #include "pixman.h" - -#include <gtk/gtk.h> - -static GdkPixbuf * -pixbuf_from_argb32 (uint32_t *bits, - int width, - int height, - int stride) -{ - GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, - 8, width, height); - int p_stride = gdk_pixbuf_get_rowstride (pixbuf); - guint32 *p_bits = (guint32 *)gdk_pixbuf_get_pixels (pixbuf); - int w, h; - - for (h = 0; h < height; ++h) - { - for (w = 0; w < width; ++w) - { - uint32_t argb = bits[h * stride + w]; - guint32 rgba; - - rgba = (argb << 8) | (argb >> 24); - - p_bits[h * (p_stride / 4) + w] = rgba; - } - } - - return pixbuf; -} - -static gboolean -on_expose (GtkWidget *widget, GdkEventExpose *expose, gpointer data) -{ - GdkPixbuf *pixbuf = data; - - gdk_draw_pixbuf (widget->window, NULL, - pixbuf, 0, 0, 0, 0, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - GDK_RGB_DITHER_NONE, - 0, 0); - - return TRUE; -} - -static void -show_window (uint32_t *bits, int w, int h, int stride) -{ - GdkPixbuf *pixbuf; - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - pixbuf = pixbuf_from_argb32 (bits, w, h, stride); - - g_signal_connect (window, "expose_event", G_CALLBACK (on_expose), pixbuf); - - gtk_widget_show (window); - - gtk_main (); -} - -#define WIDTH 100 -#define HEIGHT 100 +#include "utils.h" + +#define WIDTH 60 +#define HEIGHT 60 + +typedef struct { + const char *name; + pixman_op_t op; +} operator_t; + +static const operator_t operators[] = { + { "CLEAR", PIXMAN_OP_CLEAR }, + { "SRC", PIXMAN_OP_SRC }, + { "DST", PIXMAN_OP_DST }, + { "OVER", PIXMAN_OP_OVER }, + { "OVER_REVERSE", PIXMAN_OP_OVER_REVERSE }, + { "IN", PIXMAN_OP_IN }, + { "IN_REVERSE", PIXMAN_OP_IN_REVERSE }, + { "OUT", PIXMAN_OP_OUT }, + { "OUT_REVERSE", PIXMAN_OP_OUT_REVERSE }, + { "ATOP", PIXMAN_OP_ATOP }, + { "ATOP_REVERSE", PIXMAN_OP_ATOP_REVERSE }, + { "XOR", PIXMAN_OP_XOR }, + { "ADD", PIXMAN_OP_ADD }, + { "SATURATE", PIXMAN_OP_SATURATE }, + + { "MULTIPLY", PIXMAN_OP_MULTIPLY }, + { "SCREEN", PIXMAN_OP_SCREEN }, + { "OVERLAY", PIXMAN_OP_OVERLAY }, + { "DARKEN", PIXMAN_OP_DARKEN }, + { "LIGHTEN", PIXMAN_OP_LIGHTEN }, + { "COLOR_DODGE", PIXMAN_OP_COLOR_DODGE }, + { "COLOR_BURN", PIXMAN_OP_COLOR_BURN }, + { "HARD_LIGHT", PIXMAN_OP_HARD_LIGHT }, + { "SOFT_LIGHT", PIXMAN_OP_SOFT_LIGHT }, + { "DIFFERENCE", PIXMAN_OP_DIFFERENCE }, + { "EXCLUSION", PIXMAN_OP_EXCLUSION }, + { "HSL_HUE", PIXMAN_OP_HSL_HUE }, + { "HSL_SATURATION", PIXMAN_OP_HSL_SATURATION }, + { "HSL_COLOR", PIXMAN_OP_HSL_COLOR }, + { "HSL_LUMINOSITY", PIXMAN_OP_HSL_LUMINOSITY }, +}; static uint32_t reader (const void *src, int size) @@ -104,52 +83,107 @@ writer (void *src, uint32_t value, int size) int main (int argc, char **argv) { - uint32_t *src = malloc (WIDTH * HEIGHT * 4); +#define d2f pixman_double_to_fixed + + GtkWidget *window, *swindow; + GtkWidget *table; uint32_t *dest = malloc (WIDTH * HEIGHT * 4); + uint32_t *src = malloc (WIDTH * HEIGHT * 4); pixman_image_t *src_img; pixman_image_t *dest_img; - int i, j; + pixman_point_fixed_t p1 = { -10 << 0, 0 }; + pixman_point_fixed_t p2 = { WIDTH << 16, (HEIGHT - 10) << 16 }; + uint16_t full = 0xcfff; + uint16_t low = 0x5000; + uint16_t alpha = 0xffff; + pixman_gradient_stop_t stops[6] = + { + { d2f (0.0), { full, low, low, alpha } }, + { d2f (0.25), { full, full, low, alpha } }, + { d2f (0.4), { low, full, low, alpha } }, + { d2f (0.5), { low, full, full, alpha } }, + { d2f (0.8), { low, low, full, alpha } }, + { d2f (1.0), { full, low, full, alpha } }, + }; + + + int i; + gtk_init (&argc, &argv); - for (i = 0; i < WIDTH * HEIGHT; ++i) - src[i] = 0x7f7f0000; /* red */ + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - for (i = 0; i < WIDTH * HEIGHT; ++i) - dest[i] = 0x7f0000ff; /* blue */ + gtk_window_set_default_size (window, 800, 600); - src_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, - WIDTH, HEIGHT, - src, - WIDTH * 4); + g_signal_connect (window, "delete-event", + G_CALLBACK (gtk_main_quit), + NULL); + table = gtk_table_new (G_N_ELEMENTS (operators) / 6, 6, TRUE); + src_img = pixman_image_create_linear_gradient (&p1, &p2, stops, + sizeof (stops) / sizeof (stops[0])); + + pixman_image_set_repeat (src_img, PIXMAN_REPEAT_PAD); + dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, dest, WIDTH * 4); - - pixman_image_set_accessors (src_img, reader, writer); pixman_image_set_accessors (dest_img, reader, writer); - - pixman_image_composite (PIXMAN_OP_OVER, src_img, NULL, dest_img, - 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); -#if 0 - for (i = 0; i < WIDTH; ++i) + for (i = 0; i < G_N_ELEMENTS (operators); ++i) { + GtkWidget *image; + GdkPixbuf *pixbuf; + GtkWidget *vbox; + GtkWidget *label; + int j, k; + + vbox = gtk_vbox_new (FALSE, 0); + + label = gtk_label_new (operators[i].name); + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 6); + gtk_widget_show (label); + for (j = 0; j < HEIGHT; ++j) - g_print ("%x, ", dest[i * WIDTH + j]); - g_print ("\n"); + { + for (k = 0; k < WIDTH; ++k) + dest[j * WIDTH + k] = 0x7f6f6f00; + } + pixman_image_composite (operators[i].op, src_img, NULL, dest_img, + 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); + pixbuf = pixbuf_from_argb32 (pixman_image_get_data (dest_img), TRUE, + WIDTH, HEIGHT, WIDTH * 4); + image = gtk_image_new_from_pixbuf (pixbuf); + gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0); + gtk_widget_show (image); + + gtk_table_attach_defaults (GTK_TABLE (table), vbox, + i % 6, (i % 6) + 1, i / 6, (i / 6) + 1); + gtk_widget_show (vbox); + + g_object_unref (pixbuf); } -#endif - - show_window (dest, WIDTH, HEIGHT, WIDTH); - + pixman_image_unref (src_img); - pixman_image_unref (dest_img); free (src); + pixman_image_unref (dest_img); free (dest); - + swindow = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (swindow), table); + gtk_widget_show (table); + + gtk_container_add (GTK_CONTAINER (window), swindow); + gtk_widget_show (swindow); + + gtk_widget_show (window); + + gtk_main (); + return 0; } diff --git a/pixman/test/convolution-test.c b/pixman/test/convolution-test.c new file mode 100644 index 000000000..8609d38a0 --- /dev/null +++ b/pixman/test/convolution-test.c @@ -0,0 +1,47 @@ +#include <stdio.h> +#include <stdlib.h> +#include "pixman.h" +#include "utils.h" + +int +main (int argc, char **argv) +{ +#define WIDTH 200 +#define HEIGHT 200 + +#define d2f pixman_double_to_fixed + + uint32_t *src = malloc (WIDTH * HEIGHT * 4); + uint32_t *mask = malloc (WIDTH * HEIGHT * 4); + uint32_t *dest = malloc (WIDTH * HEIGHT * 4); + pixman_fixed_t convolution[] = + { + d2f (3), d2f (3), + d2f (0.5), d2f (0.5), d2f (0.5), + d2f (0.5), d2f (0.5), d2f (0.5), + d2f (0.5), d2f (0.5), d2f (0.5), + }; + pixman_image_t *simg, *mimg, *dimg; + + int i; + + for (i = 0; i < WIDTH * HEIGHT; ++i) + { + src[i] = 0x7f007f00; + mask[i] = (i % 256) * 0x01000000; + dest[i] = 0; + } + + simg = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, src, WIDTH * 4); + mimg = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, mask, WIDTH * 4); + dimg = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, dest, WIDTH * 4); + + pixman_image_set_filter (mimg, PIXMAN_FILTER_CONVOLUTION, + convolution, 11); + + pixman_image_composite (PIXMAN_OP_OVER, simg, mimg, dimg, 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); + + show_image (dimg); + + return 0; +} diff --git a/pixman/test/fetch-test.c b/pixman/test/fetch-test.c index 717f6d4fd..c41f1a63e 100644 --- a/pixman/test/fetch-test.c +++ b/pixman/test/fetch-test.c @@ -3,10 +3,8 @@ #include <stdio.h> #include "pixman.h" - #define SIZE 1024 - pixman_indexed_t mono_pallete = { .rgba = { 0x00000000, 0x00ffffff }, }; diff --git a/pixman/test/gradient-test.c b/pixman/test/gradient-test.c index 8a99ff0e6..2593ee38a 100644 --- a/pixman/test/gradient-test.c +++ b/pixman/test/gradient-test.c @@ -1,75 +1,12 @@ #include <stdio.h> #include <stdlib.h> -#include <gtk/gtk.h> #include "pixman.h" - -GdkPixbuf * -pixbuf_from_argb32 (uint32_t *bits, - int width, - int height, - int stride) -{ - GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, - 8, width, height); - int p_stride = gdk_pixbuf_get_rowstride (pixbuf); - guint32 *p_bits = (guint32 *)gdk_pixbuf_get_pixels (pixbuf); - int w, h; - - for (h = 0; h < height; ++h) - { - for (w = 0; w < width; ++w) - { - uint32_t argb = bits[h * stride + w]; - guint32 abgr; - - abgr = (argb & 0xff000000) | - (argb & 0xff) << 16 | - (argb & 0x00ff00) | - (argb & 0xff0000) >> 16; - - p_bits[h * (p_stride / 4) + w] = abgr; - } - } - - return pixbuf; -} - -static gboolean -on_expose (GtkWidget *widget, GdkEventExpose *expose, gpointer data) -{ - GdkPixbuf *pixbuf = data; - - gdk_draw_pixbuf (widget->window, NULL, - pixbuf, 0, 0, 0, 0, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - GDK_RGB_DITHER_NONE, - 0, 0); - - return TRUE; -} - -static void -show_window (uint32_t *bits, int w, int h, int stride) -{ - GdkPixbuf *pixbuf; - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - pixbuf = pixbuf_from_argb32 (bits, w, h, stride); - - g_signal_connect (window, "expose_event", G_CALLBACK (on_expose), pixbuf); - g_signal_connect (window, "delete_event", G_CALLBACK (gtk_main_quit), NULL); - - gtk_widget_show (window); - - gtk_main (); -} +#include "utils.h" int main (int argc, char **argv) { -#define WIDTH 200 +#define WIDTH 400 #define HEIGHT 200 uint32_t *dest = malloc (WIDTH * HEIGHT * 4); @@ -78,16 +15,16 @@ main (int argc, char **argv) int i; pixman_gradient_stop_t stops[2] = { - { pixman_int_to_fixed (0), { 0xffff, 0x0000, 0x0000, 0xffff } }, - { pixman_int_to_fixed (1), { 0xffff, 0xffff, 0x0000, 0xffff } } + { pixman_int_to_fixed (0), { 0xffff, 0xeeee, 0xeeee, 0xeeee } }, + { pixman_int_to_fixed (1), { 0xffff, 0x1111, 0x1111, 0x1111 } } }; - pixman_point_fixed_t p1 = { 0, 0 }; - pixman_point_fixed_t p2 = { pixman_int_to_fixed (WIDTH), - pixman_int_to_fixed (HEIGHT) }; + pixman_point_fixed_t p1 = { pixman_double_to_fixed (0), 0 }; + pixman_point_fixed_t p2 = { pixman_double_to_fixed (WIDTH / 8.), + pixman_int_to_fixed (0) }; pixman_transform_t trans = { { { pixman_double_to_fixed (2), pixman_double_to_fixed (0.5), pixman_double_to_fixed (-100), }, - { pixman_double_to_fixed (0), pixman_double_to_fixed (2), pixman_double_to_fixed (0), }, - { pixman_double_to_fixed (0), pixman_double_to_fixed (0.004990), pixman_double_to_fixed (1.0) } + { pixman_double_to_fixed (0), pixman_double_to_fixed (3), pixman_double_to_fixed (0), }, + { pixman_double_to_fixed (0), pixman_double_to_fixed (0.000), pixman_double_to_fixed (1.0) } } }; @@ -102,10 +39,8 @@ main (int argc, char **argv) pixman_fixed_t r_inner; pixman_fixed_t r_outer; - gtk_init (&argc, &argv); - for (i = 0; i < WIDTH * HEIGHT; ++i) - dest[i] = 0x3f0000ff; /* pale blue */ + dest[i] = 0x4f00004f; /* pale blue */ dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, @@ -119,25 +54,30 @@ main (int argc, char **argv) r_inner = 0; r_outer = pixman_double_to_fixed (50.0); - src_img = pixman_image_create_radial_gradient (&c_inner, &c_outer, + src_img = pixman_image_create_conical_gradient (&c_inner, r_inner, + stops, 2); +#if 0 + src_img = pixman_image_create_conical_gradient (&c_inner, r_inner, + stops, 2); + src_img = pixman_image_create_linear_gradient (&c_inner, &c_outer, r_inner, r_outer, stops, 2); +#endif -#if 0 src_img = pixman_image_create_linear_gradient (&p1, &p2, stops, 2); -#endif - pixman_image_set_transform (src_img, &trans); + pixman_image_set_transform (src_img, &id); + pixman_image_set_repeat (src_img, PIXMAN_REPEAT_PAD); pixman_image_composite (PIXMAN_OP_OVER, src_img, NULL, dest_img, - 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); + 0, 0, 0, 0, 0, 0, 10 * WIDTH, HEIGHT); printf ("0, 0: %x\n", dest[0]); printf ("10, 10: %x\n", dest[10 * 10 + 10]); printf ("w, h: %x\n", dest[(HEIGHT - 1) * 100 + (WIDTH - 1)]); - show_window (dest, WIDTH, HEIGHT, WIDTH); + show_image (dest_img); pixman_image_unref (src_img); pixman_image_unref (dest_img); diff --git a/pixman/test/oob-test.c b/pixman/test/oob-test.c new file mode 100644 index 000000000..4f9e5a244 --- /dev/null +++ b/pixman/test/oob-test.c @@ -0,0 +1,101 @@ +#include <stdio.h> +#include <stdlib.h> +#include "pixman.h" + +typedef struct +{ + int width; + int height; + int stride; + pixman_format_code_t format; + +} image_info_t; + +typedef struct +{ + pixman_op_t op; + + image_info_t src; + image_info_t dest; + + int src_x; + int src_y; + int dest_x; + int dest_y; + int width; + int height; +} composite_info_t; + +const composite_info_t info[] = +{ + { + PIXMAN_OP_SRC, + { 3, 6, 16, PIXMAN_a8r8g8b8 }, + { 5, 7, 20, PIXMAN_x8r8g8b8 }, + 1, 8, + 1, -1, + 1, 8 + }, + { + PIXMAN_OP_SRC, + { 7, 5, 36, PIXMAN_a8r8g8b8 }, + { 6, 5, 28, PIXMAN_x8r8g8b8 }, + 8, 5, + 5, 3, + 1, 2 + }, + { + PIXMAN_OP_OVER, + { 10, 10, 40, PIXMAN_a2b10g10r10 }, + { 10, 10, 40, PIXMAN_a2b10g10r10 }, + 0, 0, + 0, 0, + 10, 10 + }, + { + PIXMAN_OP_OVER, + { 10, 10, 40, PIXMAN_x2b10g10r10 }, + { 10, 10, 40, PIXMAN_x2b10g10r10 }, + 0, 0, + 0, 0, + 10, 10 + }, +}; + +static pixman_image_t * +make_image (const image_info_t *info) +{ + char *data = malloc (info->stride * info->height); + int i; + + for (i = 0; i < info->height * info->stride; ++i) + data[i] = (i % 255) ^ (((i % 16) << 4) | (i & 0xf0)); + + return pixman_image_create_bits (info->format, info->width, info->height, (uint32_t *)data, info->stride); +} + +static void +test_composite (const composite_info_t *info) +{ + pixman_image_t *src = make_image (&info->src); + pixman_image_t *dest = make_image (&info->dest); + + pixman_image_composite (PIXMAN_OP_SRC, src, NULL, dest, + info->src_x, info->src_y, + 0, 0, + info->dest_x, info->dest_y, + info->width, info->height); +} + + + +int +main (int argc, char **argv) +{ + int i; + + for (i = 0; i < sizeof (info) / sizeof (info[0]); ++i) + test_composite (&info[i]); + + return 0; +} diff --git a/pixman/test/region-test.c b/pixman/test/region-test.c index e214e9b89..3568969f1 100644 --- a/pixman/test/region-test.c +++ b/pixman/test/region-test.c @@ -3,21 +3,76 @@ #include <stdio.h> #include "pixman.h" -/* This used to go into an infinite loop before pixman-region.c - * was fixed to not use explict "short" variables - */ int main () { pixman_region32_t r1; pixman_region32_t r2; pixman_region32_t r3; + pixman_box32_t boxes[] = { + { 10, 10, 20, 20 }, + { 30, 30, 30, 40 }, + { 50, 45, 60, 44 }, + }; + pixman_box32_t boxes2[] = { + { 2, 6, 7, 6 }, + { 4, 1, 6, 7 }, + }; + pixman_box32_t boxes3[] = { + { 2, 6, 7, 6 }, + { 4, 1, 6, 1 }, + }; + int i; + pixman_box32_t *b; + /* This used to go into an infinite loop before pixman-region.c + * was fixed to not use explict "short" variables + */ pixman_region32_init_rect (&r1, 0, 0, 20, 64000); pixman_region32_init_rect (&r2, 0, 0, 20, 64000); pixman_region32_init_rect (&r3, 0, 0, 20, 64000); pixman_region32_subtract (&r1, &r2, &r3); -} + /* This would produce a region containing an empty + * rectangle in it. Such regions are considered malformed, + * but using an empty rectangle for initialization should + * work. + */ + pixman_region32_init_rects (&r1, boxes, 3); + + b = pixman_region32_rectangles (&r1, &i); + + assert (i == 1); + + while (i--) + { + assert (b[i].x1 < b[i].x2); + assert (b[i].y1 < b[i].y2); + } + + /* This would produce a rectangle containing the bounding box + * of the two rectangles. The correct result is to eliminate + * the broken rectangle. + */ + pixman_region32_init_rects (&r1, boxes2, 2); + + b = pixman_region32_rectangles (&r1, &i); + + assert (i == 1); + + assert (b[0].x1 == 4); + assert (b[0].y1 == 1); + assert (b[0].x2 == 6); + assert (b[0].y2 == 7); + + /* This should produce an empty region */ + pixman_region32_init_rects (&r1, boxes3, 2); + + b = pixman_region32_rectangles (&r1, &i); + + assert (i == 0); + + return 0; +} diff --git a/pixman/test/scaling-test.c b/pixman/test/scaling-test.c new file mode 100644 index 000000000..8899c594f --- /dev/null +++ b/pixman/test/scaling-test.c @@ -0,0 +1,474 @@ +/* + * Test program, which can detect problems with nearest neighbout scaling + * implementation. Also SRC and OVER opetations tested for 16bpp and 32bpp + * images. + * + * Just run it without any command line arguments, and it will report either + * "scaling test passed" - everything is ok + * "scaling test failed!" - there is some problem + * + * In the case of failure, finding the problem involves the following steps: + * 1. Get the reference 'scaling-test' binary. It makes sense to disable all + * the cpu specific optimizations in pixman and also configure it with + * '--disable-shared' option. Those who are paranoid can also tweak the + * sources to disable all fastpath functions. The resulting binary + * can be renamed to something like 'scaling-test.ref'. + * 2. Compile the buggy binary (also with the '--disable-shared' option). + * 3. Run 'ruby scaling-test-bisect.rb ./scaling-test.ref ./scaling-test' + * 4. Look at the information about failed case (destination buffer content + * will be shown) and try to figure out what is wrong. It is possible + * to use debugging print to stderr in pixman to get more information, + * this does not interfere with the testing script. + */ +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> +#include "pixman.h" + +/* A primitive pseudorandom number generator, taken from POSIX.1-2001 example */ + +static uint32_t lcg_seed; + +uint32_t +lcg_rand (void) +{ + lcg_seed = lcg_seed * 1103515245 + 12345; + return ((uint32_t)(lcg_seed / 65536) % 32768); +} + +void +lcg_srand (uint32_t seed) +{ + lcg_seed = seed; +} + +uint32_t +lcg_rand_n (int max) +{ + return lcg_rand () % max; +} + +/*----------------------------------------------------------------------------*\ +* CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. +* +* This program generates the CRC-32 values for the files named in the +* command-line arguments. These are the same CRC-32 values used by GZIP, +* PKZIP, and ZMODEM. The compute_crc32() can also be detached and +* used independently. +* +* THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. +* +* Based on the byte-oriented implementation "File Verification Using CRC" +* by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. +* +* v1.0.0: original release. +* v1.0.1: fixed printf formats. +* v1.0.2: fixed something else. +* v1.0.3: replaced CRC constant table by generator function. +* v1.0.4: reformatted code, made ANSI C. 1994-12-05. +* v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. +\*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*\ +* NAME: +* compute_crc32() - computes the CRC-32 value of a memory buffer +* DESCRIPTION: +* Computes or accumulates the CRC-32 value for a memory buffer. +* The 'in_crc32' gives a previously accumulated CRC-32 value to allow +* a CRC to be generated for multiple sequential buffer-fuls of data. +* The 'in_crc32' for the first buffer must be zero. +* ARGUMENTS: +* in_crc32 - accumulated CRC-32 value, must be 0 on first call +* buf - buffer to compute CRC-32 value for +* buf_len - number of bytes in buffer +* RETURNS: +* crc32 - computed CRC-32 value +* ERRORS: +* (no errors are possible) +\*----------------------------------------------------------------------------*/ + +static uint32_t +compute_crc32 (uint32_t in_crc32, + const void *buf, + size_t buf_len) +{ + static const uint32_t crc_table[256] = { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, + 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, + 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, + 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, + 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, + 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, + 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, + 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, + 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, + 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, + 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, + 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, + 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, + 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, + 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, + 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, + 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, + 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, + 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, + 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, + 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, + 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, + 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, + 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, + 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, + 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, + 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, + 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, + 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, + 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, + 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, + 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, + 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + + uint32_t crc32; + unsigned char * byte_buf; + size_t i; + + /** accumulate crc32 for buffer **/ + crc32 = in_crc32 ^ 0xFFFFFFFF; + byte_buf = (unsigned char*) buf; + + for (i = 0; i < buf_len; i++) + crc32 = (crc32 >> 8) ^ crc_table[(crc32 ^ byte_buf[i]) & 0xFF]; + + return (crc32 ^ 0xFFFFFFFF); +} + +/* perform endian conversion of pixel data */ +static void +image_endian_swap (pixman_image_t *img, + int bpp) +{ + int stride = pixman_image_get_stride (img); + uint32_t *data = pixman_image_get_data (img); + int height = pixman_image_get_height (img); + int i, j; + + /* swap bytes only on big endian systems */ + volatile uint16_t endian_check_var = 0x1234; + if (*(volatile uint8_t *)&endian_check_var != 0x12) + return; + + for (i = 0; i < height; i++) + { + char *line_data = (char *)data + stride * i; + + /* swap bytes only for 16, 24 and 32 bpp for now */ + switch (bpp) + { + case 16: + for (j = 0; j + 2 <= stride; j += 2) + { + char t1 = line_data[j + 0]; + char t2 = line_data[j + 1]; + line_data[j + 1] = t1; + line_data[j + 0] = t2; + } + break; + + case 24: + for (j = 0; j + 3 <= stride; j += 3) + { + char t1 = line_data[j + 0]; + char t2 = line_data[j + 1]; + char t3 = line_data[j + 2]; + line_data[j + 2] = t1; + line_data[j + 1] = t2; + line_data[j + 0] = t3; + } + break; + + case 32: + for (j = 0; j + 4 <= stride; j += 4) + { + char t1 = line_data[j + 0]; + char t2 = line_data[j + 1]; + char t3 = line_data[j + 2]; + char t4 = line_data[j + 3]; + line_data[j + 3] = t1; + line_data[j + 2] = t2; + line_data[j + 1] = t3; + line_data[j + 0] = t4; + } + break; + + default: + break; + } + } +} + +#define MAX_SRC_WIDTH 10 +#define MAX_SRC_HEIGHT 10 +#define MAX_DST_WIDTH 10 +#define MAX_DST_HEIGHT 10 +#define MAX_STRIDE 4 + +/* + * Composite operation with pseudorandom images + */ +uint32_t +test_composite (uint32_t initcrc, + int testnum, + int verbose) +{ + int i; + pixman_image_t * src_img; + pixman_image_t * dst_img; + pixman_transform_t transform; + pixman_region16_t clip; + int src_width, src_height; + int dst_width, dst_height; + int src_stride, dst_stride; + int src_x, src_y; + int dst_x, dst_y; + int src_bpp; + int dst_bpp; + int w, h; + int scale_x = 32768, scale_y = 32768; + int op; + int repeat = 0; + int src_fmt, dst_fmt; + uint32_t * srcbuf; + uint32_t * dstbuf; + uint32_t crc32; + + lcg_srand (testnum); + + src_bpp = (lcg_rand_n (2) == 0) ? 2 : 4; + dst_bpp = (lcg_rand_n (2) == 0) ? 2 : 4; + op = (lcg_rand_n (2) == 0) ? PIXMAN_OP_SRC : PIXMAN_OP_OVER; + + src_width = lcg_rand_n (MAX_SRC_WIDTH) + 1; + src_height = lcg_rand_n (MAX_SRC_HEIGHT) + 1; + dst_width = lcg_rand_n (MAX_DST_WIDTH) + 1; + dst_height = lcg_rand_n (MAX_DST_HEIGHT) + 1; + src_stride = src_width * src_bpp + lcg_rand_n (MAX_STRIDE) * src_bpp; + dst_stride = dst_width * dst_bpp + lcg_rand_n (MAX_STRIDE) * dst_bpp; + + if (src_stride & 3) + src_stride += 2; + + if (dst_stride & 3) + dst_stride += 2; + + src_x = -(src_width / 4) + lcg_rand_n (src_width * 3 / 2); + src_y = -(src_height / 4) + lcg_rand_n (src_height * 3 / 2); + dst_x = -(dst_width / 4) + lcg_rand_n (dst_width * 3 / 2); + dst_y = -(dst_height / 4) + lcg_rand_n (dst_height * 3 / 2); + w = lcg_rand_n (dst_width * 3 / 2 - dst_x); + h = lcg_rand_n (dst_height * 3 / 2 - dst_y); + + srcbuf = (uint32_t *)malloc (src_stride * src_height); + dstbuf = (uint32_t *)malloc (dst_stride * dst_height); + + for (i = 0; i < src_stride * src_height; i++) + *((uint8_t *)srcbuf + i) = lcg_rand_n (256); + + for (i = 0; i < dst_stride * dst_height; i++) + *((uint8_t *)dstbuf + i) = lcg_rand_n (256); + + src_fmt = src_bpp == 4 ? (lcg_rand_n (2) == 0 ? + PIXMAN_a8r8g8b8 : PIXMAN_x8r8g8b8) : PIXMAN_r5g6b5; + + dst_fmt = dst_bpp == 4 ? (lcg_rand_n (2) == 0 ? + PIXMAN_a8r8g8b8 : PIXMAN_x8r8g8b8) : PIXMAN_r5g6b5; + + src_img = pixman_image_create_bits ( + src_fmt, src_width, src_height, srcbuf, src_stride); + + dst_img = pixman_image_create_bits ( + dst_fmt, dst_width, dst_height, dstbuf, dst_stride); + + image_endian_swap (src_img, src_bpp * 8); + image_endian_swap (dst_img, dst_bpp * 8); + + if (lcg_rand_n (8) > 0) + { + scale_x = 32768 + lcg_rand_n (65536); + scale_y = 32768 + lcg_rand_n (65536); + pixman_transform_init_scale (&transform, scale_x, scale_y); + pixman_image_set_transform (src_img, &transform); + } + + switch (lcg_rand_n (4)) + { + case 0: + repeat = PIXMAN_REPEAT_NONE; + break; + + case 1: + repeat = PIXMAN_REPEAT_NORMAL; + break; + + case 2: + repeat = PIXMAN_REPEAT_PAD; + break; + + case 3: + repeat = PIXMAN_REPEAT_REFLECT; + break; + } + pixman_image_set_repeat (src_img, repeat); + + if (verbose) + { + printf ("src_fmt=%08X, dst_fmt=%08X\n", src_fmt, dst_fmt); + printf ("op=%d, scale_x=%d, scale_y=%d, repeat=%d\n", + op, scale_x, scale_y, repeat); + printf ("src_width=%d, src_height=%d, dst_width=%d, dst_height=%d\n", + src_width, src_height, dst_width, dst_height); + printf ("src_x=%d, src_y=%d, dst_x=%d, dst_y=%d\n", + src_x, src_y, dst_x, dst_y); + printf ("w=%d, h=%d\n", w, h); + } + + if (lcg_rand_n (8) == 0) + { + pixman_box16_t clip_boxes[2]; + int n = lcg_rand_n (2) + 1; + + for (i = 0; i < n; i++) + { + clip_boxes[i].x1 = lcg_rand_n (src_width); + clip_boxes[i].y1 = lcg_rand_n (src_height); + clip_boxes[i].x2 = + clip_boxes[i].x1 + lcg_rand_n (src_width - clip_boxes[i].x1); + clip_boxes[i].y2 = + clip_boxes[i].y1 + lcg_rand_n (src_height - clip_boxes[i].y1); + + if (verbose) + { + printf ("source clip box: [%d,%d-%d,%d]\n", + clip_boxes[i].x1, clip_boxes[i].y1, + clip_boxes[i].x2, clip_boxes[i].y2); + } + } + + pixman_region_init_rects (&clip, clip_boxes, n); + pixman_image_set_clip_region (src_img, &clip); + pixman_image_set_source_clipping (src_img, 1); + pixman_region_fini (&clip); + } + + if (lcg_rand_n (8) == 0) + { + pixman_box16_t clip_boxes[2]; + int n = lcg_rand_n (2) + 1; + for (i = 0; i < n; i++) + { + clip_boxes[i].x1 = lcg_rand_n (dst_width); + clip_boxes[i].y1 = lcg_rand_n (dst_height); + clip_boxes[i].x2 = + clip_boxes[i].x1 + lcg_rand_n (dst_width - clip_boxes[i].x1); + clip_boxes[i].y2 = + clip_boxes[i].y1 + lcg_rand_n (dst_height - clip_boxes[i].y1); + + if (verbose) + { + printf ("destination clip box: [%d,%d-%d,%d]\n", + clip_boxes[i].x1, clip_boxes[i].y1, + clip_boxes[i].x2, clip_boxes[i].y2); + } + } + pixman_region_init_rects (&clip, clip_boxes, n); + pixman_image_set_clip_region (dst_img, &clip); + pixman_region_fini (&clip); + } + + pixman_image_composite (op, src_img, NULL, dst_img, + src_x, src_y, 0, 0, dst_x, dst_y, w, h); + + if (dst_fmt == PIXMAN_x8r8g8b8) + { + /* ignore unused part */ + for (i = 0; i < dst_stride * dst_height / 4; i++) + dstbuf[i] &= 0xFFFFFF; + } + + image_endian_swap (dst_img, dst_bpp * 8); + + if (verbose) + { + int j; + + for (i = 0; i < dst_height; i++) + { + for (j = 0; j < dst_stride; j++) + printf ("%02X ", *((uint8_t *)dstbuf + i * dst_stride + j)); + + printf ("\n"); + } + } + + pixman_image_unref (src_img); + pixman_image_unref (dst_img); + + crc32 = compute_crc32 (initcrc, dstbuf, dst_stride * dst_height); + free (srcbuf); + free (dstbuf); + return crc32; +} + +int +main (int argc, char *argv[]) +{ + int i, n = 0; + uint32_t crc = 0; + + pixman_disable_out_of_bounds_workaround (); + + if (argc >= 2) + n = atoi (argv[1]); + + if (n == 0) n = 3000000; + + if (n < 0) + { + crc = test_composite (0, -n, 1); + printf ("crc32=%08X\n", crc); + } + else + { + for (i = 1; i <= n; i++) + crc = test_composite (crc, i, 0); + + printf ("crc32=%08X\n", crc); + + if (n == 3000000) + { + /* predefined value for running with all the fastpath functions disabled */ + /* it needs to be updated every time changes are introduced to this program! */ + + if (crc == 0x0B633CF4) + { + printf ("scaling test passed\n"); + } + else + { + printf ("scaling test failed!\n"); + return 1; + } + } + } + + return 0; +} diff --git a/pixman/test/screen-test.c b/pixman/test/screen-test.c new file mode 100644 index 000000000..5e02eee08 --- /dev/null +++ b/pixman/test/screen-test.c @@ -0,0 +1,44 @@ +#include <stdio.h> +#include <stdlib.h> +#include "pixman.h" +#include "utils.h" + +int +main (int argc, char **argv) +{ +#define WIDTH 40 +#define HEIGHT 40 + + uint32_t *src1 = malloc (WIDTH * HEIGHT * 4); + uint32_t *src2 = malloc (WIDTH * HEIGHT * 4); + uint32_t *src3 = malloc (WIDTH * HEIGHT * 4); + uint32_t *dest = malloc (3 * WIDTH * 2 * HEIGHT * 4); + pixman_image_t *simg1, *simg2, *simg3, *dimg; + + int i; + + for (i = 0; i < WIDTH * HEIGHT; ++i) + { + src1[i] = 0x7ff00000; + src2[i] = 0x7f00ff00; + src3[i] = 0x7f0000ff; + } + + for (i = 0; i < 3 * WIDTH * 2 * HEIGHT; ++i) + { + dest[i] = 0x0; + } + + simg1 = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, src1, WIDTH * 4); + simg2 = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, src2, WIDTH * 4); + simg3 = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, src3, WIDTH * 4); + dimg = pixman_image_create_bits (PIXMAN_a8r8g8b8, 3 * WIDTH, 2 * HEIGHT, dest, 3 * WIDTH * 4); + + pixman_image_composite (PIXMAN_OP_SCREEN, simg1, NULL, dimg, 0, 0, 0, 0, WIDTH, HEIGHT / 4, WIDTH, HEIGHT); + pixman_image_composite (PIXMAN_OP_SCREEN, simg2, NULL, dimg, 0, 0, 0, 0, (WIDTH/2), HEIGHT / 4 + HEIGHT / 2, WIDTH, HEIGHT); + pixman_image_composite (PIXMAN_OP_SCREEN, simg3, NULL, dimg, 0, 0, 0, 0, (4 * WIDTH) / 3, HEIGHT, WIDTH, HEIGHT); + + show_image (dimg); + + return 0; +} diff --git a/pixman/test/trap-crasher.c b/pixman/test/trap-crasher.c new file mode 100644 index 000000000..42b82f674 --- /dev/null +++ b/pixman/test/trap-crasher.c @@ -0,0 +1,27 @@ +#include <stdlib.h> +#include <pixman.h> + +int +main() +{ + pixman_image_t *dst; + pixman_trapezoid_t traps[1] = { + { + .top = 2147483646, + .bottom = 2147483647, + .left = { + .p1 = { .x = 0, .y = 0 }, + .p2 = { .x = 0, .y = 2147483647 } + }, + .right = { + .p1 = { .x = 65536, .y = 0 }, + .p2 = { .x = 0, .y = 2147483647 } + } + }, + }; + + dst = pixman_image_create_bits (PIXMAN_a8, 1, 1, NULL, -1); + + pixman_add_trapezoids (dst, 0, 0, sizeof (traps)/sizeof (traps[0]), traps); + return (0); +} diff --git a/pixman/test/trap-test.c b/pixman/test/trap-test.c new file mode 100644 index 000000000..1da439bd6 --- /dev/null +++ b/pixman/test/trap-test.c @@ -0,0 +1,49 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "pixman.h" +#include "utils.h" + +int +main (int argc, char **argv) +{ +#define WIDTH 200 +#define HEIGHT 200 + + pixman_image_t *src_img; + pixman_image_t *mask_img; + pixman_image_t *dest_img; + pixman_trap_t trap; + pixman_color_t white = { 0x0000, 0xffff, 0x0000, 0xffff }; + uint32_t *bits = malloc (WIDTH * HEIGHT * 4); + uint32_t *mbits = malloc (WIDTH * HEIGHT); + + memset (mbits, 0, WIDTH * HEIGHT); + memset (bits, 0xff, WIDTH * HEIGHT * 4); + + trap.top.l = pixman_int_to_fixed (50) + 0x8000; + trap.top.r = pixman_int_to_fixed (150) + 0x8000; + trap.top.y = pixman_int_to_fixed (30); + + trap.bot.l = pixman_int_to_fixed (50) + 0x8000; + trap.bot.r = pixman_int_to_fixed (150) + 0x8000; + trap.bot.y = pixman_int_to_fixed (150); + + mask_img = pixman_image_create_bits (PIXMAN_a8, WIDTH, HEIGHT, mbits, WIDTH); + src_img = pixman_image_create_solid_fill (&white); + dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, bits, WIDTH * 4); + + pixman_add_traps (mask_img, 0, 0, 1, &trap); + + pixman_image_composite (PIXMAN_OP_OVER, + src_img, mask_img, dest_img, + 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); + + show_image (dest_img); + + pixman_image_unref (src_img); + pixman_image_unref (dest_img); + free (bits); + + return 0; +} diff --git a/pixman/test/utils.c b/pixman/test/utils.c new file mode 100644 index 000000000..a609315c5 --- /dev/null +++ b/pixman/test/utils.c @@ -0,0 +1,113 @@ +#include <gtk/gtk.h> +#include <config.h> +#include "pixman-private.h" /* For image->bits.format + * FIXME: there should probably be public API for this + */ +#include "utils.h" + +GdkPixbuf * +pixbuf_from_argb32 (uint32_t *bits, + gboolean has_alpha, + int width, + int height, + int stride) +{ + GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, + 8, width, height); + int p_stride = gdk_pixbuf_get_rowstride (pixbuf); + guint32 *p_bits = (guint32 *)gdk_pixbuf_get_pixels (pixbuf); + int w, h; + + for (h = 0; h < height; ++h) + { + for (w = 0; w < width; ++w) + { + uint32_t argb = bits[h * (stride / 4) + w]; + guint r, g, b, a; + char *pb = (char *)p_bits; + + pb += h * p_stride + w * 4; + + r = (argb & 0x00ff0000) >> 16; + g = (argb & 0x0000ff00) >> 8; + b = (argb & 0x000000ff) >> 0; + a = has_alpha? (argb & 0xff000000) >> 24 : 0xff; + + if (a) + { + r = (r * 255) / a; + g = (g * 255) / a; + b = (b * 255) / a; + } + + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + + pb[0] = r; + pb[1] = g; + pb[2] = b; + pb[3] = a; + } + } + + return pixbuf; +} + + +static gboolean +on_expose (GtkWidget *widget, GdkEventExpose *expose, gpointer data) +{ + GdkPixbuf *pixbuf = data; + + gdk_draw_pixbuf (widget->window, NULL, + pixbuf, 0, 0, 0, 0, + gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf), + GDK_RGB_DITHER_NONE, + 0, 0); + + return TRUE; +} + +void +show_image (pixman_image_t *image) +{ + GtkWidget *window; + GdkPixbuf *pixbuf; + int width, height, stride; + int argc; + char **argv; + char *arg0 = g_strdup ("pixman-test-program"); + gboolean has_alpha; + pixman_format_code_t format; + + argc = 1; + argv = (char **)&arg0; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + width = pixman_image_get_width (image); + height = pixman_image_get_height (image); + stride = pixman_image_get_stride (image); + + format = image->bits.format; + + if (format == PIXMAN_a8r8g8b8) + has_alpha = TRUE; + else if (format == PIXMAN_x8r8g8b8) + has_alpha = FALSE; + else + g_error ("Can't deal with this format: %x\n", format); + + pixbuf = pixbuf_from_argb32 (pixman_image_get_data (image), has_alpha, + width, height, stride); + + g_signal_connect (window, "expose_event", G_CALLBACK (on_expose), pixbuf); + g_signal_connect (window, "delete_event", G_CALLBACK (gtk_main_quit), NULL); + + gtk_widget_show (window); + + gtk_main (); +} diff --git a/pixman/test/utils.h b/pixman/test/utils.h new file mode 100644 index 000000000..bc110d847 --- /dev/null +++ b/pixman/test/utils.h @@ -0,0 +1,6 @@ +#include <stdio.h> +#include <stdlib.h> +#include <glib.h> +#include "pixman.h" + +void show_image (pixman_image_t *image); diff --git a/pixman/test/window-test.c b/pixman/test/window-test.c new file mode 100644 index 000000000..bbaa3e211 --- /dev/null +++ b/pixman/test/window-test.c @@ -0,0 +1,173 @@ +#include <stdio.h> +#include <stdlib.h> +#include <config.h> +#include "pixman.h" +#include "pixman-private.h" + +#define FALSE 0 +#define TRUE 1 + +/* Randomly decide between 32 and 16 bit + * + * Allocate bits with random width, stride and height + * + * Then make up some random offset (dx, dy) + * + * Then make an image with those values. + * + * Do this for both source and destination + * + * Composite them together using OVER. + * + * The bits in the source and the destination should have + * recognizable colors so that the result can be verified. + * + * Ie., walk the bits and verify that they have been composited. + */ + +static int +get_rand (int bound) +{ + return rand () % bound; +} + +static pixman_image_t * +make_image (int width, int height, pixman_bool_t src, int *rx, int *ry) +{ + pixman_format_code_t format; + pixman_image_t *image; + pixman_region32_t region; + uint8_t *bits; + int stride; + int bpp; + int dx, dy; + int i, j; + + if (src) + format = PIXMAN_a8r8g8b8; + else + format = PIXMAN_r5g6b5; + + bpp = PIXMAN_FORMAT_BPP (format) / 8; + + stride = width + get_rand (width); + stride += (stride & 1); /* Make it an even number */ + + bits = malloc (height * stride * bpp); + + for (j = 0; j < height; ++j) + { + for (i = 0; i < width; ++i) + { + uint8_t *pixel = bits + (stride * j + i) * bpp; + + if (src) + *(uint32_t *)pixel = 0x7f00007f; + else + *(uint16_t *)pixel = 0xf100; + } + } + + dx = dy = 0; + + dx = get_rand (500); + dy = get_rand (500); + + if (!src) + { + /* Now simulate the bogus X server translations */ + bits -= (dy * stride + dx) * bpp; + } + + image = pixman_image_create_bits ( + format, width, height, (uint32_t *)bits, stride * bpp); + + if (!src) + { + /* And add the bogus clip region */ + pixman_region32_init_rect (®ion, dx, dy, dx + width, dy + height); + + pixman_image_set_clip_region32 (image, ®ion); + } + + pixman_image_set_source_clipping (image, TRUE); + + if (src) + { + pixman_transform_t trans; + + pixman_transform_init_identity (&trans); + + pixman_transform_translate (&trans, + NULL, + - pixman_int_to_fixed (width / 2), + - pixman_int_to_fixed (height / 2)); + + pixman_transform_scale (&trans, + NULL, + pixman_double_to_fixed (0.5), + pixman_double_to_fixed (0.5)); + + pixman_transform_translate (&trans, + NULL, + pixman_int_to_fixed (width / 2), + pixman_int_to_fixed (height / 2)); + + pixman_image_set_transform (image, &trans); + pixman_image_set_filter (image, PIXMAN_FILTER_BILINEAR, NULL, 0); + pixman_image_set_repeat (image, PIXMAN_REPEAT_PAD); + } + + if (!src) + { + *rx = dx; + *ry = dy; + } + else + { + *rx = *ry = 0; + } + + return image; +} + +int +main () +{ + pixman_image_t *src, *dest; + int src_x, src_y, dest_x, dest_y; + int i, j; + int width = get_rand (500); + int height = get_rand (500); + + src = make_image (width, height, TRUE, &src_x, &src_y); + dest = make_image (width, height, FALSE, &dest_x, &dest_y); + + pixman_image_composite ( + PIXMAN_OP_OVER, src, NULL, dest, + src_x, src_y, + -1, -1, + dest_x, dest_y, + width, height); + + for (i = 0; i < height; ++i) + { + for (j = 0; j < width; ++j) + { + uint8_t *bits = (uint8_t *)dest->bits.bits; + int bpp = PIXMAN_FORMAT_BPP (dest->bits.format) / 8; + int stride = dest->bits.rowstride * 4; + + uint8_t *pixel = + bits + (i + dest_y) * stride + (j + dest_x) * bpp; + + if (*(uint16_t *)pixel != 0x788f) + { + printf ("bad pixel %x\n", *(uint16_t *)pixel); + assert (*(uint16_t *)pixel == 0x788f); + } + } + } + + return 0; +} |