diff --git a/lib/pixman/configure b/lib/pixman/configure index 2f4a20c4a..2cb2df6b8 100644 --- a/lib/pixman/configure +++ b/lib/pixman/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.62 for pixman 0.20.0. +# Generated by GNU Autoconf 2.62 for pixman 0.20.2. # # Report bugs to <"pixman@lists.freedesktop.org">. # @@ -750,8 +750,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='pixman' PACKAGE_TARNAME='pixman' -PACKAGE_VERSION='0.20.0' -PACKAGE_STRING='pixman 0.20.0' +PACKAGE_VERSION='0.20.2' +PACKAGE_STRING='pixman 0.20.2' PACKAGE_BUGREPORT='"pixman@lists.freedesktop.org"' # Factoring default headers for most tests. @@ -1529,7 +1529,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures pixman 0.20.0 to adapt to many kinds of systems. +\`configure' configures pixman 0.20.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1599,7 +1599,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of pixman 0.20.0:";; + short | recursive ) echo "Configuration of pixman 0.20.2:";; esac cat <<\_ACEOF @@ -1722,7 +1722,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -pixman configure 0.20.0 +pixman configure 0.20.2 generated by GNU Autoconf 2.62 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1736,7 +1736,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by pixman $as_me 0.20.0, which was +It was created by pixman $as_me 0.20.2, which was generated by GNU Autoconf 2.62. Invocation command line was $ $0 $@ @@ -2385,7 +2385,7 @@ fi # Define the identity of the package. PACKAGE='pixman' - VERSION='0.20.0' + VERSION='0.20.2' cat >>confdefs.h <<_ACEOF @@ -21074,13 +21074,13 @@ fi -LT_VERSION_INFO="20:0:20" +LT_VERSION_INFO="20:2:20" PIXMAN_VERSION_MAJOR=0 PIXMAN_VERSION_MINOR=20 -PIXMAN_VERSION_MICRO=0 +PIXMAN_VERSION_MICRO=2 @@ -23644,10 +23644,9 @@ support_for__thread=no $as_echo_n "checking for __thread... " >&6; } cat >conftest.$ac_ext <<_ACEOF -#ifdef defined __MINGW32__ && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#if defined(__MINGW32__) && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) #error This MinGW version has broken __thread support #endif -#endif #ifdef __OpenBSD__ #error OpenBSD has broken __thread support #endif @@ -24492,7 +24491,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by pixman $as_me 0.20.0, which was +This file was extended by pixman $as_me 0.20.2, which was generated by GNU Autoconf 2.62. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -24545,7 +24544,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ -pixman config.status 0.20.0 +pixman config.status 0.20.2 configured by $0, generated by GNU Autoconf 2.62, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/lib/pixman/configure.ac b/lib/pixman/configure.ac index f4cdb03da..84adb76ec 100644 --- a/lib/pixman/configure.ac +++ b/lib/pixman/configure.ac @@ -54,7 +54,7 @@ AC_PREREQ([2.57]) m4_define([pixman_major], 0) m4_define([pixman_minor], 20) -m4_define([pixman_micro], 0) +m4_define([pixman_micro], 2) m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro]) @@ -652,10 +652,9 @@ support_for__thread=no AC_MSG_CHECKING(for __thread) AC_LINK_IFELSE([ -#ifdef defined __MINGW32__ && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#if defined(__MINGW32__) && !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) #error This MinGW version has broken __thread support #endif -#endif #ifdef __OpenBSD__ #error OpenBSD has broken __thread support #endif diff --git a/lib/pixman/pixman/pixman-arm-neon-asm.S b/lib/pixman/pixman/pixman-arm-neon-asm.S index fdd13479d..5e1d52774 100644 --- a/lib/pixman/pixman/pixman-arm-neon-asm.S +++ b/lib/pixman/pixman/pixman-arm-neon-asm.S @@ -537,13 +537,13 @@ generate_composite_function \ /******************************************************************************/ .macro pixman_composite_add_8888_8888_process_pixblock_tail_head - vld1.8 {d0, d1, d2, d3}, [SRC]! + vld1.32 {d0, d1, d2, d3}, [SRC]! PF add PF_X, PF_X, #8 PF tst PF_CTL, #0xF - vld1.8 {d4, d5, d6, d7}, [DST_R, :128]! + vld1.32 {d4, d5, d6, d7}, [DST_R, :128]! PF addne PF_X, PF_X, #8 PF subne PF_CTL, PF_CTL, #1 - vst1.8 {d28, d29, d30, d31}, [DST_W, :128]! + vst1.32 {d28, d29, d30, d31}, [DST_W, :128]! PF cmp PF_X, ORIG_W PF pld, [PF_SRC, PF_X, lsl #src_bpp_shift] PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] diff --git a/lib/pixman/pixman/pixman-bits-image.c b/lib/pixman/pixman/pixman-bits-image.c index 2e83c8296..b27a73284 100644 --- a/lib/pixman/pixman/pixman-bits-image.c +++ b/lib/pixman/pixman/pixman-bits-image.c @@ -297,6 +297,7 @@ bits_image_fetch_bilinear_no_repeat_8888 (pixman_image_t * ima, uint32_t *bottom_row; uint32_t *end; uint32_t zero[2] = { 0, 0 }; + uint32_t one = 1; int y, y1, y2; int disty; int mask_inc; @@ -362,10 +363,8 @@ bits_image_fetch_bilinear_no_repeat_8888 (pixman_image_t * ima, */ if (!mask) { - uint32_t mask_bits = 1; - mask_inc = 0; - mask = &mask_bits; + mask = &one; } else { diff --git a/lib/pixman/pixman/pixman-combine.c.template b/lib/pixman/pixman/pixman-combine.c.template index 56dfb4300..f5dd8e120 100644 --- a/lib/pixman/pixman/pixman-combine.c.template +++ b/lib/pixman/pixman/pixman-combine.c.template @@ -959,15 +959,33 @@ set_lum (comp4_t dest[3], comp4_t src[3], comp4_t sa, comp4_t lum) if (min < 0) { - tmp[0] = l + (tmp[0] - l) * l / (l - min); - tmp[1] = l + (tmp[1] - l) * l / (l - min); - tmp[2] = l + (tmp[2] - l) * l / (l - min); + if (l - min == 0.0) + { + tmp[0] = 0; + tmp[1] = 0; + tmp[2] = 0; + } + else + { + tmp[0] = l + (tmp[0] - l) * l / (l - min); + tmp[1] = l + (tmp[1] - l) * l / (l - min); + tmp[2] = l + (tmp[2] - l) * l / (l - min); + } } if (max > a) { - tmp[0] = l + (tmp[0] - l) * (a - l) / (max - l); - tmp[1] = l + (tmp[1] - l) * (a - l) / (max - l); - tmp[2] = l + (tmp[2] - l) * (a - l) / (max - l); + if (max - l == 0.0) + { + tmp[0] = a; + tmp[1] = a; + tmp[2] = a; + } + else + { + tmp[0] = l + (tmp[0] - l) * (a - l) / (max - l); + tmp[1] = l + (tmp[1] - l) * (a - l) / (max - l); + tmp[2] = l + (tmp[2] - l) * (a - l) / (max - l); + } } dest[0] = tmp[0] * MASK + 0.5; diff --git a/lib/pixman/pixman/pixman-fast-path.h b/lib/pixman/pixman/pixman-fast-path.h index 6fe448c8b..98ef81ea7 100644 --- a/lib/pixman/pixman/pixman-fast-path.h +++ b/lib/pixman/pixman/pixman-fast-path.h @@ -245,10 +245,10 @@ scanline_func_name (dst_type_t *dst, \ } \ } -#define FAST_NEAREST_MAINLOOP(scale_func_name, scanline_func, src_type_t, dst_type_t, \ - repeat_mode) \ +#define FAST_NEAREST_MAINLOOP_INT(scale_func_name, scanline_func, src_type_t, dst_type_t, \ + repeat_mode) \ static void \ -fast_composite_scaled_nearest_ ## scale_func_name (pixman_implementation_t *imp, \ +fast_composite_scaled_nearest ## scale_func_name (pixman_implementation_t *imp, \ pixman_op_t op, \ pixman_image_t * src_image, \ pixman_image_t * mask_image, \ @@ -374,12 +374,18 @@ fast_composite_scaled_nearest_ ## scale_func_name (pixman_implementation_t *imp, } \ } +/* A workaround for old sun studio, see: https://bugs.freedesktop.org/show_bug.cgi?id=32764 */ +#define FAST_NEAREST_MAINLOOP(scale_func_name, scanline_func, src_type_t, dst_type_t, \ + repeat_mode) \ + FAST_NEAREST_MAINLOOP_INT(_ ## scale_func_name, scanline_func, src_type_t, dst_type_t, \ + repeat_mode) \ + #define FAST_NEAREST(scale_func_name, SRC_FORMAT, DST_FORMAT, \ src_type_t, dst_type_t, OP, repeat_mode) \ FAST_NEAREST_SCANLINE(scaled_nearest_scanline_ ## scale_func_name ## _ ## OP, \ SRC_FORMAT, DST_FORMAT, src_type_t, dst_type_t, \ OP, repeat_mode) \ - FAST_NEAREST_MAINLOOP(scale_func_name##_##OP, \ + FAST_NEAREST_MAINLOOP_INT(_ ## scale_func_name ## _ ## OP, \ scaled_nearest_scanline_ ## scale_func_name ## _ ## OP, \ src_type_t, dst_type_t, repeat_mode) \ \ diff --git a/lib/pixman/pixman/pixman-general.c b/lib/pixman/pixman/pixman-general.c index 4d234a06f..8130f166e 100644 --- a/lib/pixman/pixman/pixman-general.c +++ b/lib/pixman/pixman/pixman-general.c @@ -56,8 +56,8 @@ general_composite_rect (pixman_implementation_t *imp, int32_t width, int32_t height) { - uint8_t stack_scanline_buffer[SCANLINE_BUFFER_LENGTH * 3]; - uint8_t *scanline_buffer = stack_scanline_buffer; + uint64_t stack_scanline_buffer[(SCANLINE_BUFFER_LENGTH * 3 + 7) / 8]; + uint8_t *scanline_buffer = (uint8_t *) stack_scanline_buffer; uint8_t *src_buffer, *mask_buffer, *dest_buffer; fetch_scanline_t fetch_src = NULL, fetch_mask = NULL, fetch_dest = NULL; pixman_combine_32_func_t compose; @@ -255,7 +255,7 @@ general_composite_rect (pixman_implementation_t *imp, } } - if (scanline_buffer != stack_scanline_buffer) + if (scanline_buffer != (uint8_t *) stack_scanline_buffer) free (scanline_buffer); } diff --git a/lib/pixman/pixman/pixman-image.c b/lib/pixman/pixman/pixman-image.c index fabcd6334..c64647193 100644 --- a/lib/pixman/pixman/pixman-image.c +++ b/lib/pixman/pixman/pixman-image.c @@ -430,10 +430,24 @@ compute_image_info (pixman_image_t *image) flags &= ~FAST_PATH_NARROW_FORMAT; break; - case LINEAR: case RADIAL: code = PIXMAN_unknown; + /* + * As explained in pixman-radial-gradient.c, every point of + * the plane has a valid associated radius (and thus will be + * colored) if and only if a is negative (i.e. one of the two + * circles contains the other one). + */ + + if (image->radial.a >= 0) + break; + + /* Fall through */ + + case LINEAR: + code = PIXMAN_unknown; + if (image->common.repeat != PIXMAN_REPEAT_NONE) { int i; diff --git a/lib/pixman/pixman/pixman-mmx.c b/lib/pixman/pixman/pixman-mmx.c index e936c4cc7..34637a4fe 100644 --- a/lib/pixman/pixman/pixman-mmx.c +++ b/lib/pixman/pixman/pixman-mmx.c @@ -1921,8 +1921,8 @@ pixman_fill_mmx (uint32_t *bits, "movq %7, %4\n" "movq %7, %5\n" "movq %7, %6\n" - : "=y" (v1), "=y" (v2), "=y" (v3), - "=y" (v4), "=y" (v5), "=y" (v6), "=y" (v7) + : "=&y" (v1), "=&y" (v2), "=&y" (v3), + "=&y" (v4), "=&y" (v5), "=&y" (v6), "=y" (v7) : "y" (vfill)); #endif diff --git a/lib/pixman/pixman/pixman-radial-gradient.c b/lib/pixman/pixman/pixman-radial-gradient.c index f0dcc9623..fa5725840 100644 --- a/lib/pixman/pixman/pixman-radial-gradient.c +++ b/lib/pixman/pixman/pixman-radial-gradient.c @@ -96,8 +96,24 @@ radial_compute_color (double a, if (a == 0) { - return _pixman_gradient_walker_pixel (walker, - pixman_fixed_1 / 2 * c / b); + double t; + + if (b == 0) + return 0; + + t = pixman_fixed_1 / 2 * c / b; + if (repeat == PIXMAN_REPEAT_NONE) + { + if (0 <= t && t <= pixman_fixed_1) + return _pixman_gradient_walker_pixel (walker, t); + } + else + { + if (t * dr > mindr) + return _pixman_gradient_walker_pixel (walker, t); + } + + return 0; } det = fdot (b, a, 0, b, -c, 0);