summaryrefslogtreecommitdiff
path: root/Build/source/libs/pixman
diff options
context:
space:
mode:
authorAkira Kakuto <kakuto@fuk.kindai.ac.jp>2018-11-22 07:19:28 +0000
committerAkira Kakuto <kakuto@fuk.kindai.ac.jp>2018-11-22 07:19:28 +0000
commitf233c2a76a882286f796395f3c004c75badccaed (patch)
tree0d6d5c6cb72506223757e14dddbc4a9b46ec5df7 /Build/source/libs/pixman
parent17de941a77395dfa14d6b3aba8f4aee4f607bc6c (diff)
pixman-0.36.0
git-svn-id: svn://tug.org/texlive/trunk@49220 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/pixman')
-rw-r--r--Build/source/libs/pixman/ChangeLog5
-rw-r--r--Build/source/libs/pixman/README4
-rw-r--r--Build/source/libs/pixman/TLpatches/ChangeLog5
-rw-r--r--Build/source/libs/pixman/TLpatches/TL-Changes3
-rw-r--r--Build/source/libs/pixman/TLpatches/patch-01-hide-symbols6
-rwxr-xr-xBuild/source/libs/pixman/configure22
-rw-r--r--Build/source/libs/pixman/pixman-src/Makefile.am2
-rw-r--r--Build/source/libs/pixman/pixman-src/Makefile.win32.common13
-rw-r--r--Build/source/libs/pixman/pixman-src/config.h.in3
-rw-r--r--Build/source/libs/pixman/pixman-src/configure.ac15
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman-access.c128
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman-bits-image.c3
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman-fast-path.c4
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman-filter.c244
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman-image.c70
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman-private.h3
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman-solid-fill.c8
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman-vmx.c2
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman.c5
-rw-r--r--Build/source/libs/pixman/pixman-src/pixman/pixman.h35
-rw-r--r--Build/source/libs/pixman/version.ac2
21 files changed, 453 insertions, 129 deletions
diff --git a/Build/source/libs/pixman/ChangeLog b/Build/source/libs/pixman/ChangeLog
index d29f7df8eb9..8591e66b8e7 100644
--- a/Build/source/libs/pixman/ChangeLog
+++ b/Build/source/libs/pixman/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-22 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ Import pixman-0.36.0.
+ * version.ac: Adapted.
+
2016-02-15 Karl Berry <karl@tug.org>
* pixman-PATCHES: rename from pixman-src-PATCHES.
diff --git a/Build/source/libs/pixman/README b/Build/source/libs/pixman/README
index 7fb53afe211..ddf7aa4def7 100644
--- a/Build/source/libs/pixman/README
+++ b/Build/source/libs/pixman/README
@@ -1,4 +1,4 @@
- Building pixman-0.34.0 as part of the TL tree
+ Building pixman-0.36.0 as part of the TL tree
=============================================
This directory libs/pixman/ uses a proxy Makefile.am to build the pixman
@@ -12,4 +12,4 @@ been translated into equivalent test in libs/pixman/configure.ac.
2012-11-10 Taco Hoekwater <taco@metatex.org>
2012-11-15 Peter Breitenlohner <peb@mppmu.mpg.de>
-2016-02-04 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+2018-11-22 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
diff --git a/Build/source/libs/pixman/TLpatches/ChangeLog b/Build/source/libs/pixman/TLpatches/ChangeLog
index 39dcd76ca07..74472ab460b 100644
--- a/Build/source/libs/pixman/TLpatches/ChangeLog
+++ b/Build/source/libs/pixman/TLpatches/ChangeLog
@@ -1,3 +1,8 @@
+2018-11-22 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
+
+ Import pixman-0.36.0.
+ * patch-01-hide-symbols: Adapted.
+
2016-02-04 Akira Kakuto <kakuto@fuk.kindai.ac.jp>
Import pixman-0.34.0.
diff --git a/Build/source/libs/pixman/TLpatches/TL-Changes b/Build/source/libs/pixman/TLpatches/TL-Changes
index 7df6c0ac66a..12fa371ae4b 100644
--- a/Build/source/libs/pixman/TLpatches/TL-Changes
+++ b/Build/source/libs/pixman/TLpatches/TL-Changes
@@ -1,4 +1,4 @@
-Changes applied to the pixman-0.34.0/ tree as obtained from:
+Changes applied to the pixman-0.36.0/ tree as obtained from:
http://cairographics.org/releases/
Removed:
@@ -19,4 +19,3 @@ Removed:
Removed unused dirs:
demos
test
-
diff --git a/Build/source/libs/pixman/TLpatches/patch-01-hide-symbols b/Build/source/libs/pixman/TLpatches/patch-01-hide-symbols
index 62cc5f039f7..b583be3474f 100644
--- a/Build/source/libs/pixman/TLpatches/patch-01-hide-symbols
+++ b/Build/source/libs/pixman/TLpatches/patch-01-hide-symbols
@@ -1,6 +1,6 @@
-diff -ur pixman-0.34.0.orig/pixman/pixman-compiler.h pixman-0.34.0/pixman/pixman-compiler.h
---- pixman-0.34.0.orig/pixman/pixman-compiler.h Tue Jun 30 18:48:31 2015
-+++ pixman-0.34.0/pixman/pixman-compiler.h Thu Feb 04 16:56:27 2016
+diff -ur pixman-0.36.0/pixman/pixman-compiler.h pixman-src/pixman/pixman-compiler.h
+--- pixman-0.36.0/pixman/pixman-compiler.h Wed Apr 11 21:07:58 2018
++++ pixman-src/pixman/pixman-compiler.h Thu Nov 22 15:59:02 2018
@@ -91,7 +91,7 @@
/* GCC visibility */
diff --git a/Build/source/libs/pixman/configure b/Build/source/libs/pixman/configure
index 9ccb0eae471..389ac85364d 100755
--- a/Build/source/libs/pixman/configure
+++ b/Build/source/libs/pixman/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for pixman (TeX Live) 0.34.0.
+# Generated by GNU Autoconf 2.69 for pixman (TeX Live) 0.36.0.
#
# Report bugs to <tex-k@tug.org>.
#
@@ -580,8 +580,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='pixman (TeX Live)'
PACKAGE_TARNAME='pixman--tex-live-'
-PACKAGE_VERSION='0.34.0'
-PACKAGE_STRING='pixman (TeX Live) 0.34.0'
+PACKAGE_VERSION='0.36.0'
+PACKAGE_STRING='pixman (TeX Live) 0.36.0'
PACKAGE_BUGREPORT='tex-k@tug.org'
PACKAGE_URL=''
@@ -1281,7 +1281,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 (TeX Live) 0.34.0 to adapt to many kinds of systems.
+\`configure' configures pixman (TeX Live) 0.36.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1348,7 +1348,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of pixman (TeX Live) 0.34.0:";;
+ short | recursive ) echo "Configuration of pixman (TeX Live) 0.36.0:";;
esac
cat <<\_ACEOF
@@ -1445,7 +1445,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-pixman (TeX Live) configure 0.34.0
+pixman (TeX Live) configure 0.36.0
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1952,7 +1952,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 (TeX Live) $as_me 0.34.0, which was
+It was created by pixman (TeX Live) $as_me 0.36.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3875,7 +3875,7 @@ fi
# Define the identity of the package.
PACKAGE='pixman--tex-live-'
- VERSION='0.34.0'
+ VERSION='0.36.0'
cat >>confdefs.h <<_ACEOF
@@ -4077,7 +4077,7 @@ WARNING_CFLAGS=$kpse_cv_warning_cflags
PIXMAN_VERSION_MAJOR=0
-PIXMAN_VERSION_MINOR=34
+PIXMAN_VERSION_MINOR=36
PIXMAN_VERSION_MICRO=0
test_CFLAGS=${CFLAGS+set} # We may override autoconf default CFLAGS.
@@ -6586,7 +6586,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by pixman (TeX Live) $as_me 0.34.0, which was
+This file was extended by pixman (TeX Live) $as_me 0.36.0, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -6652,7 +6652,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-pixman (TeX Live) config.status 0.34.0
+pixman (TeX Live) config.status 0.36.0
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/Build/source/libs/pixman/pixman-src/Makefile.am b/Build/source/libs/pixman/pixman-src/Makefile.am
index 5137c9ea306..593cbcf1e97 100644
--- a/Build/source/libs/pixman/pixman-src/Makefile.am
+++ b/Build/source/libs/pixman/pixman-src/Makefile.am
@@ -124,7 +124,7 @@ release-publish-message: $(HASHFILES) ensure-prev
@echo " (signed by`gpg --list-keys $(GPGKEY) | grep uid | cut -b4- | tr -s " "`)"
@echo ""
@echo "Git:"
- @echo " git://git.freedesktop.org/git/pixman"
+ @echo " https://gitlab.freedesktop.org/pixman/pixman.git"
@echo " tag: $(PACKAGE)-$(VERSION)"
@echo ""
@echo "Log:"
diff --git a/Build/source/libs/pixman/pixman-src/Makefile.win32.common b/Build/source/libs/pixman/pixman-src/Makefile.win32.common
index 777f94ce2c2..756fc94a6ee 100644
--- a/Build/source/libs/pixman/pixman-src/Makefile.win32.common
+++ b/Build/source/libs/pixman/pixman-src/Makefile.win32.common
@@ -5,6 +5,10 @@ LD = link
AR = lib
PERL = perl
+ifneq ($(shell echo ""),)
+RM = del
+endif
+
ifeq ($(top_builddir),)
top_builddir = $(top_srcdir)
endif
@@ -45,12 +49,13 @@ endif
endif
endif
+$(CFG_VAR):
+ @mkdir $@
-$(CFG_VAR)/%.obj: %.c $(libpixman_headers)
- @mkdir -p $(CFG_VAR)
+$(CFG_VAR)/%.obj: %.c $(libpixman_headers) | $(CFG_VAR)
@$(CC) -c $(PIXMAN_CFLAGS) -Fo"$@" $<
-clean: inform
- @$(RM) $(CFG_VAR)/*.{exe,ilk,lib,obj,pdb} $(BUILT_SOURCES) || exit 0
+clean: inform $(CFG_VAR)
+ @cd $(CFG_VAR) && echo > silence_error.exe && $(RM) *.exe *.ilk *.lib *.obj *.pdb
.PHONY: inform clean
diff --git a/Build/source/libs/pixman/pixman-src/config.h.in b/Build/source/libs/pixman/pixman-src/config.h.in
index c707dd52c10..284619e2177 100644
--- a/Build/source/libs/pixman/pixman-src/config.h.in
+++ b/Build/source/libs/pixman/pixman-src/config.h.in
@@ -111,6 +111,9 @@
/* Define to the version of this package. */
#undef PACKAGE_VERSION
+/* enable output that can be piped to gnuplot */
+#undef PIXMAN_GNUPLOT
+
/* enable TIMER_BEGIN/TIMER_END macros */
#undef PIXMAN_TIMERS
diff --git a/Build/source/libs/pixman/pixman-src/configure.ac b/Build/source/libs/pixman/pixman-src/configure.ac
index 156edfbf3f9..0d55402f910 100644
--- a/Build/source/libs/pixman/pixman-src/configure.ac
+++ b/Build/source/libs/pixman/pixman-src/configure.ac
@@ -53,7 +53,7 @@ AC_PREREQ([2.57])
#
m4_define([pixman_major], 0)
-m4_define([pixman_minor], 34)
+m4_define([pixman_minor], 36)
m4_define([pixman_micro], 0)
m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro])
@@ -834,6 +834,19 @@ fi
AC_SUBST(PIXMAN_TIMERS)
dnl ===================================
+dnl gnuplot
+
+AC_ARG_ENABLE(gnuplot,
+ [AC_HELP_STRING([--enable-gnuplot],
+ [enable output of filters that can be piped to gnuplot [default=no]])],
+ [enable_gnuplot=$enableval], [enable_gnuplot=no])
+
+if test $enable_gnuplot = yes ; then
+ AC_DEFINE(PIXMAN_GNUPLOT, 1, [enable output that can be piped to gnuplot])
+fi
+AC_SUBST(PIXMAN_GNUPLOT)
+
+dnl ===================================
dnl GTK+
AC_ARG_ENABLE(gtk,
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman-access.c b/Build/source/libs/pixman/pixman-src/pixman/pixman-access.c
index 4f0642d7778..8dfd35f4506 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman-access.c
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman-access.c
@@ -642,6 +642,48 @@ fetch_scanline_a2r10g10b10_float (bits_image_t * image,
}
/* Expects a float buffer */
+#ifndef PIXMAN_FB_ACCESSORS
+static void
+fetch_scanline_rgbf_float (bits_image_t *image,
+ int x,
+ int y,
+ int width,
+ uint32_t * b,
+ const uint32_t *mask)
+{
+ const float *bits = (float *)image->bits + y * image->rowstride;
+ const float *pixel = bits + x * 3;
+ argb_t *buffer = (argb_t *)b;
+
+ for (; width--; buffer++) {
+ buffer->r = *pixel++;
+ buffer->g = *pixel++;
+ buffer->b = *pixel++;
+ buffer->a = 1.f;
+ }
+}
+
+static void
+fetch_scanline_rgbaf_float (bits_image_t *image,
+ int x,
+ int y,
+ int width,
+ uint32_t * b,
+ const uint32_t *mask)
+{
+ const float *bits = (float *)image->bits + y * image->rowstride;
+ const float *pixel = bits + x * 4;
+ argb_t *buffer = (argb_t *)b;
+
+ for (; width--; buffer++) {
+ buffer->r = *pixel++;
+ buffer->g = *pixel++;
+ buffer->b = *pixel++;
+ buffer->a = *pixel++;
+ }
+}
+#endif
+
static void
fetch_scanline_x2r10g10b10_float (bits_image_t *image,
int x,
@@ -805,6 +847,40 @@ fetch_scanline_yv12 (bits_image_t *image,
/**************************** Pixel wise fetching *****************************/
+#ifndef PIXMAN_FB_ACCESSORS
+static argb_t
+fetch_pixel_rgbf_float (bits_image_t *image,
+ int offset,
+ int line)
+{
+ float *bits = (float *)image->bits + line * image->rowstride;
+ argb_t argb;
+
+ argb.r = bits[offset * 3];
+ argb.g = bits[offset * 3 + 1];
+ argb.b = bits[offset * 3 + 2];
+ argb.a = 1.f;
+
+ return argb;
+}
+
+static argb_t
+fetch_pixel_rgbaf_float (bits_image_t *image,
+ int offset,
+ int line)
+{
+ float *bits = (float *)image->bits + line * image->rowstride;
+ argb_t argb;
+
+ argb.r = bits[offset * 4];
+ argb.g = bits[offset * 4 + 1];
+ argb.b = bits[offset * 4 + 2];
+ argb.a = bits[offset * 4 + 3];
+
+ return argb;
+}
+#endif
+
static argb_t
fetch_pixel_x2r10g10b10_float (bits_image_t *image,
int offset,
@@ -962,6 +1038,45 @@ fetch_pixel_yv12 (bits_image_t *image,
/*********************************** Store ************************************/
+#ifndef PIXMAN_FB_ACCESSORS
+static void
+store_scanline_rgbaf_float (bits_image_t * image,
+ int x,
+ int y,
+ int width,
+ const uint32_t *v)
+{
+ float *bits = (float *)image->bits + image->rowstride * y + 4 * x;
+ const argb_t *values = (argb_t *)v;
+
+ for (; width; width--, values++)
+ {
+ *bits++ = values->r;
+ *bits++ = values->g;
+ *bits++ = values->b;
+ *bits++ = values->a;
+ }
+}
+
+static void
+store_scanline_rgbf_float (bits_image_t * image,
+ int x,
+ int y,
+ int width,
+ const uint32_t *v)
+{
+ float *bits = (float *)image->bits + image->rowstride * y + 3 * x;
+ const argb_t *values = (argb_t *)v;
+
+ for (; width; width--, values++)
+ {
+ *bits++ = values->r;
+ *bits++ = values->g;
+ *bits++ = values->b;
+ }
+}
+#endif
+
static void
store_scanline_a2r10g10b10_float (bits_image_t * image,
int x,
@@ -1351,7 +1466,18 @@ static const format_info_t accessors[] =
FORMAT_INFO (g1),
/* Wide formats */
-
+#ifndef PIXMAN_FB_ACCESSORS
+ { PIXMAN_rgba_float,
+ NULL, fetch_scanline_rgbaf_float,
+ fetch_pixel_generic_lossy_32, fetch_pixel_rgbaf_float,
+ NULL, store_scanline_rgbaf_float },
+
+ { PIXMAN_rgb_float,
+ NULL, fetch_scanline_rgbf_float,
+ fetch_pixel_generic_lossy_32, fetch_pixel_rgbf_float,
+ NULL, store_scanline_rgbf_float },
+#endif
+
{ PIXMAN_a2r10g10b10,
NULL, fetch_scanline_a2r10g10b10_float,
fetch_pixel_generic_lossy_32, fetch_pixel_a2r10g10b10_float,
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman-bits-image.c b/Build/source/libs/pixman/pixman-src/pixman/pixman-bits-image.c
index dcdcc69946d..9fb91ff5831 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman-bits-image.c
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman-bits-image.c
@@ -948,6 +948,9 @@ _pixman_bits_image_init (pixman_image_t * image,
{
uint32_t *free_me = NULL;
+ if (PIXMAN_FORMAT_BPP (format) == 128)
+ return_val_if_fail(!(rowstride % 4), FALSE);
+
if (!bits && width && height)
{
int rowstride_bytes;
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman-fast-path.c b/Build/source/libs/pixman/pixman-src/pixman/pixman-fast-path.c
index 53d4a1f9047..b4daa2657d1 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman-fast-path.c
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman-fast-path.c
@@ -3258,9 +3258,9 @@ static const pixman_iter_info_t fast_iters[] =
},
#define AFFINE_FAST_PATHS(name, format, repeat) \
- SEPARABLE_CONVOLUTION_AFFINE_FAST_PATH(name, format, repeat) \
+ NEAREST_AFFINE_FAST_PATH(name, format, repeat) \
BILINEAR_AFFINE_FAST_PATH(name, format, repeat) \
- NEAREST_AFFINE_FAST_PATH(name, format, repeat)
+ SEPARABLE_CONVOLUTION_AFFINE_FAST_PATH(name, format, repeat)
AFFINE_FAST_PATHS (pad_a8r8g8b8, a8r8g8b8, PAD)
AFFINE_FAST_PATHS (none_a8r8g8b8, a8r8g8b8, NONE)
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman-filter.c b/Build/source/libs/pixman/pixman-src/pixman/pixman-filter.c
index b2bf53fed14..5f3b752f9b5 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman-filter.c
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman-filter.c
@@ -109,14 +109,16 @@ general_cubic (double x, double B, double C)
if (ax < 1)
{
- return ((12 - 9 * B - 6 * C) * ax * ax * ax +
- (-18 + 12 * B + 6 * C) * ax * ax + (6 - 2 * B)) / 6;
+ return (((12 - 9 * B - 6 * C) * ax +
+ (-18 + 12 * B + 6 * C)) * ax * ax +
+ (6 - 2 * B)) / 6;
}
- else if (ax >= 1 && ax < 2)
+ else if (ax < 2)
{
- return ((-B - 6 * C) * ax * ax * ax +
- (6 * B + 30 * C) * ax * ax + (-12 * B - 48 * C) *
- ax + (8 * B + 24 * C)) / 6;
+ return ((((-B - 6 * C) * ax +
+ (6 * B + 30 * C)) * ax +
+ (-12 * B - 48 * C)) * ax +
+ (8 * B + 24 * C)) / 6;
}
else
{
@@ -141,7 +143,7 @@ static const filter_info_t filters[] =
{ PIXMAN_KERNEL_BOX, box_kernel, 1.0 },
{ PIXMAN_KERNEL_LINEAR, linear_kernel, 2.0 },
{ PIXMAN_KERNEL_CUBIC, cubic_kernel, 4.0 },
- { PIXMAN_KERNEL_GAUSSIAN, gaussian_kernel, 6 * SIGMA },
+ { PIXMAN_KERNEL_GAUSSIAN, gaussian_kernel, 5.0 },
{ PIXMAN_KERNEL_LANCZOS2, lanczos2_kernel, 4.0 },
{ PIXMAN_KERNEL_LANCZOS3, lanczos3_kernel, 6.0 },
{ PIXMAN_KERNEL_LANCZOS3_STRETCHED, nice_kernel, 8.0 },
@@ -160,18 +162,21 @@ integral (pixman_kernel_t kernel1, double x1,
pixman_kernel_t kernel2, double scale, double x2,
double width)
{
- /* If the integration interval crosses zero, break it into
- * two separate integrals. This ensures that filters such
- * as LINEAR that are not differentiable at 0 will still
- * integrate properly.
+ if (kernel1 == PIXMAN_KERNEL_BOX && kernel2 == PIXMAN_KERNEL_BOX)
+ {
+ return width;
+ }
+ /* The LINEAR filter is not differentiable at 0, so if the
+ * integration interval crosses zero, break it into two
+ * separate integrals.
*/
- if (x1 < 0 && x1 + width > 0)
+ else if (kernel1 == PIXMAN_KERNEL_LINEAR && x1 < 0 && x1 + width > 0)
{
return
integral (kernel1, x1, kernel2, scale, x2, - x1) +
integral (kernel1, 0, kernel2, scale, x2 - x1, width + x1);
}
- else if (x2 < 0 && x2 + width > 0)
+ else if (kernel2 == PIXMAN_KERNEL_LINEAR && x2 < 0 && x2 + width > 0)
{
return
integral (kernel1, x1, kernel2, scale, x2, - x2) +
@@ -189,13 +194,19 @@ integral (pixman_kernel_t kernel1, double x1,
}
else
{
- /* Integration via Simpson's rule */
-#define N_SEGMENTS 128
+ /* Integration via Simpson's rule
+ * See http://www.intmath.com/integration/6-simpsons-rule.php
+ * 12 segments (6 cubic approximations) seems to produce best
+ * result for lanczos3.linear, which was the combination that
+ * showed the most errors. This makes sense as the lanczos3
+ * filter is 6 wide.
+ */
+#define N_SEGMENTS 12
#define SAMPLE(a1, a2) \
(filters[kernel1].func ((a1)) * filters[kernel2].func ((a2) * scale))
double s = 0.0;
- double h = width / (double)N_SEGMENTS;
+ double h = width / N_SEGMENTS;
int i;
s = SAMPLE (x1, x2);
@@ -204,11 +215,14 @@ integral (pixman_kernel_t kernel1, double x1,
{
double a1 = x1 + h * i;
double a2 = x2 + h * i;
+ s += 4 * SAMPLE (a1, a2);
+ }
+ for (i = 2; i < N_SEGMENTS; i += 2)
+ {
+ double a1 = x1 + h * i;
+ double a2 = x2 + h * i;
s += 2 * SAMPLE (a1, a2);
-
- if (i >= 2 && i < N_SEGMENTS - 1)
- s += 4 * SAMPLE (a1, a2);
}
s += SAMPLE (x1 + width, x2 + width);
@@ -217,25 +231,17 @@ integral (pixman_kernel_t kernel1, double x1,
}
}
-static pixman_fixed_t *
-create_1d_filter (int *width,
+static void
+create_1d_filter (int width,
pixman_kernel_t reconstruct,
pixman_kernel_t sample,
double scale,
- int n_phases)
+ int n_phases,
+ pixman_fixed_t *p)
{
- pixman_fixed_t *params, *p;
double step;
- double size;
int i;
- size = scale * filters[sample].width + filters[reconstruct].width;
- *width = ceil (size);
-
- p = params = malloc (*width * n_phases * sizeof (pixman_fixed_t));
- if (!params)
- return NULL;
-
step = 1.0 / n_phases;
for (i = 0; i < n_phases; ++i)
@@ -243,15 +249,15 @@ create_1d_filter (int *width,
double frac = step / 2.0 + i * step;
pixman_fixed_t new_total;
int x, x1, x2;
- double total;
+ double total, e;
/* Sample convolution of reconstruction and sampling
* filter. See rounding.txt regarding the rounding
* and sample positions.
*/
- x1 = ceil (frac - *width / 2.0 - 0.5);
- x2 = x1 + *width;
+ x1 = ceil (frac - width / 2.0 - 0.5);
+ x2 = x1 + width;
total = 0;
for (x = x1; x < x2; ++x)
@@ -274,29 +280,154 @@ create_1d_filter (int *width,
ihigh - ilow);
}
- total += c;
- *p++ = (pixman_fixed_t)(c * 65536.0 + 0.5);
+ *p = (pixman_fixed_t)floor (c * 65536.0 + 0.5);
+ total += *p;
+ p++;
}
- /* Normalize */
- p -= *width;
- total = 1 / total;
+ /* Normalize, with error diffusion */
+ p -= width;
+ total = 65536.0 / total;
new_total = 0;
+ e = 0.0;
for (x = x1; x < x2; ++x)
{
- pixman_fixed_t t = (*p) * total + 0.5;
+ double v = (*p) * total + e;
+ pixman_fixed_t t = floor (v + 0.5);
+ e = v - t;
new_total += t;
*p++ = t;
}
- if (new_total != pixman_fixed_1)
- *(p - *width / 2) += (pixman_fixed_1 - new_total);
+ /* pixman_fixed_e's worth of error may remain; put it
+ * at the first sample, since that is the only one that
+ * hasn't had any error diffused into it.
+ */
+ *(p - width) += pixman_fixed_1 - new_total;
}
+}
- return params;
+
+static int
+filter_width (pixman_kernel_t reconstruct, pixman_kernel_t sample, double size)
+{
+ return ceil (filters[reconstruct].width + size * filters[sample].width);
+}
+
+#ifdef PIXMAN_GNUPLOT
+
+/* If enable-gnuplot is configured, then you can pipe the output of a
+ * pixman-using program to gnuplot and get a continuously-updated plot
+ * of the horizontal filter. This works well with demos/scale to test
+ * the filter generation.
+ *
+ * The plot is all the different subposition filters shuffled
+ * together. This is misleading in a few cases:
+ *
+ * IMPULSE.BOX - goes up and down as the subfilters have different
+ * numbers of non-zero samples
+ * IMPULSE.TRIANGLE - somewhat crooked for the same reason
+ * 1-wide filters - looks triangular, but a 1-wide box would be more
+ * accurate
+ */
+static void
+gnuplot_filter (int width, int n_phases, const pixman_fixed_t* p)
+{
+ double step;
+ int i, j;
+ int first;
+
+ step = 1.0 / n_phases;
+
+ printf ("set style line 1 lc rgb '#0060ad' lt 1 lw 0.5 pt 7 pi 1 ps 0.5\n");
+ printf ("plot [x=%g:%g] '-' with linespoints ls 1\n", -width*0.5, width*0.5);
+ /* Print a point at the origin so that y==0 line is included: */
+ printf ("0 0\n\n");
+
+ /* The position of the first sample of the phase corresponding to
+ * frac is given by:
+ *
+ * ceil (frac - width / 2.0 - 0.5) + 0.5 - frac
+ *
+ * We have to find the frac that minimizes this expression.
+ *
+ * For odd widths, we have
+ *
+ * ceil (frac - width / 2.0 - 0.5) + 0.5 - frac
+ * = ceil (frac) + K - frac
+ * = 1 + K - frac
+ *
+ * for some K, so this is minimized when frac is maximized and
+ * strictly growing with frac. So for odd widths, we can simply
+ * start at the last phase and go backwards.
+ *
+ * For even widths, we have
+ *
+ * ceil (frac - width / 2.0 - 0.5) + 0.5 - frac
+ * = ceil (frac - 0.5) + K - frac
+ *
+ * The graph for this function (ignoring K) looks like this:
+ *
+ * 0.5
+ * | |\
+ * | | \
+ * | | \
+ * 0 | | \
+ * |\ |
+ * | \ |
+ * | \ |
+ * -0.5 | \|
+ * ---------------------------------
+ * 0 0.5 1
+ *
+ * So in this case we need to start with the phase whose frac is
+ * less than, but as close as possible to 0.5, then go backwards
+ * until we hit the first phase, then wrap around to the last
+ * phase and continue backwards.
+ *
+ * Which phase is as close as possible 0.5? The locations of the
+ * sampling point corresponding to the kth phase is given by
+ * 1/(2 * n_phases) + k / n_phases:
+ *
+ * 1/(2 * n_phases) + k / n_phases = 0.5
+ *
+ * from which it follows that
+ *
+ * k = (n_phases - 1) / 2
+ *
+ * rounded down is the phase in question.
+ */
+ if (width & 1)
+ first = n_phases - 1;
+ else
+ first = (n_phases - 1) / 2;
+
+ for (j = 0; j < width; ++j)
+ {
+ for (i = 0; i < n_phases; ++i)
+ {
+ int phase = first - i;
+ double frac, pos;
+
+ if (phase < 0)
+ phase = n_phases + phase;
+
+ frac = step / 2.0 + phase * step;
+ pos = ceil (frac - width / 2.0 - 0.5) + 0.5 - frac + j;
+
+ printf ("%g %g\n",
+ pos,
+ pixman_fixed_to_double (*(p + phase * width + j)));
+ }
+ }
+
+ printf ("e\n");
+ fflush (stdout);
}
+#endif
+
/* Create the parameter list for a SEPARABLE_CONVOLUTION filter
* with the given kernels and scale parameters
*/
@@ -313,38 +444,35 @@ pixman_filter_create_separable_convolution (int *n_values,
{
double sx = fabs (pixman_fixed_to_double (scale_x));
double sy = fabs (pixman_fixed_to_double (scale_y));
- pixman_fixed_t *horz = NULL, *vert = NULL, *params = NULL;
+ pixman_fixed_t *params;
int subsample_x, subsample_y;
int width, height;
+ width = filter_width (reconstruct_x, sample_x, sx);
subsample_x = (1 << subsample_bits_x);
- subsample_y = (1 << subsample_bits_y);
- horz = create_1d_filter (&width, reconstruct_x, sample_x, sx, subsample_x);
- vert = create_1d_filter (&height, reconstruct_y, sample_y, sy, subsample_y);
+ height = filter_width (reconstruct_y, sample_y, sy);
+ subsample_y = (1 << subsample_bits_y);
- if (!horz || !vert)
- goto out;
-
*n_values = 4 + width * subsample_x + height * subsample_y;
params = malloc (*n_values * sizeof (pixman_fixed_t));
if (!params)
- goto out;
+ return NULL;
params[0] = pixman_int_to_fixed (width);
params[1] = pixman_int_to_fixed (height);
params[2] = pixman_int_to_fixed (subsample_bits_x);
params[3] = pixman_int_to_fixed (subsample_bits_y);
- memcpy (params + 4, horz,
- width * subsample_x * sizeof (pixman_fixed_t));
- memcpy (params + 4 + width * subsample_x, vert,
- height * subsample_y * sizeof (pixman_fixed_t));
+ create_1d_filter (width, reconstruct_x, sample_x, sx, subsample_x,
+ params + 4);
+ create_1d_filter (height, reconstruct_y, sample_y, sy, subsample_y,
+ params + 4 + width * subsample_x);
-out:
- free (horz);
- free (vert);
+#ifdef PIXMAN_GNUPLOT
+ gnuplot_filter(width, subsample_x, params + 4);
+#endif
return params;
}
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman-image.c b/Build/source/libs/pixman/pixman-src/pixman/pixman-image.c
index 1ff1a497404..7a851e22199 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman-image.c
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman-image.c
@@ -335,37 +335,47 @@ compute_image_info (pixman_image_t *image)
{
flags |= FAST_PATH_NEAREST_FILTER;
}
- else if (
- /* affine and integer translation components in matrix ... */
- ((flags & FAST_PATH_AFFINE_TRANSFORM) &&
- !pixman_fixed_frac (image->common.transform->matrix[0][2] |
- image->common.transform->matrix[1][2])) &&
- (
- /* ... combined with a simple rotation */
- (flags & (FAST_PATH_ROTATE_90_TRANSFORM |
- FAST_PATH_ROTATE_180_TRANSFORM |
- FAST_PATH_ROTATE_270_TRANSFORM)) ||
- /* ... or combined with a simple non-rotated translation */
- (image->common.transform->matrix[0][0] == pixman_fixed_1 &&
- image->common.transform->matrix[1][1] == pixman_fixed_1 &&
- image->common.transform->matrix[0][1] == 0 &&
- image->common.transform->matrix[1][0] == 0)
- )
- )
+ else if (flags & FAST_PATH_AFFINE_TRANSFORM)
{
- /* FIXME: there are some affine-test failures, showing that
- * handling of BILINEAR and NEAREST filter is not quite
- * equivalent when getting close to 32K for the translation
- * components of the matrix. That's likely some bug, but for
- * now just skip BILINEAR->NEAREST optimization in this case.
+ /* Suppose the transform is
+ *
+ * [ t00, t01, t02 ]
+ * [ t10, t11, t12 ]
+ * [ 0, 0, 1 ]
+ *
+ * and the destination coordinates are (n + 0.5, m + 0.5). Then
+ * the transformed x coordinate is:
+ *
+ * tx = t00 * (n + 0.5) + t01 * (m + 0.5) + t02
+ * = t00 * n + t01 * m + t02 + (t00 + t01) * 0.5
+ *
+ * which implies that if t00, t01 and t02 are all integers
+ * and (t00 + t01) is odd, then tx will be an integer plus 0.5,
+ * which means a BILINEAR filter will reduce to NEAREST. The same
+ * applies in the y direction
*/
- pixman_fixed_t magic_limit = pixman_int_to_fixed (30000);
- if (image->common.transform->matrix[0][2] <= magic_limit &&
- image->common.transform->matrix[1][2] <= magic_limit &&
- image->common.transform->matrix[0][2] >= -magic_limit &&
- image->common.transform->matrix[1][2] >= -magic_limit)
+ pixman_fixed_t (*t)[3] = image->common.transform->matrix;
+
+ if ((pixman_fixed_frac (
+ t[0][0] | t[0][1] | t[0][2] |
+ t[1][0] | t[1][1] | t[1][2]) == 0) &&
+ (pixman_fixed_to_int (
+ (t[0][0] + t[0][1]) & (t[1][0] + t[1][1])) % 2) == 1)
{
- flags |= FAST_PATH_NEAREST_FILTER;
+ /* FIXME: there are some affine-test failures, showing that
+ * handling of BILINEAR and NEAREST filter is not quite
+ * equivalent when getting close to 32K for the translation
+ * components of the matrix. That's likely some bug, but for
+ * now just skip BILINEAR->NEAREST optimization in this case.
+ */
+ pixman_fixed_t magic_limit = pixman_int_to_fixed (30000);
+ if (image->common.transform->matrix[0][2] <= magic_limit &&
+ image->common.transform->matrix[1][2] <= magic_limit &&
+ image->common.transform->matrix[0][2] >= -magic_limit &&
+ image->common.transform->matrix[1][2] >= -magic_limit)
+ {
+ flags |= FAST_PATH_NEAREST_FILTER;
+ }
}
}
break;
@@ -832,6 +842,10 @@ pixman_image_set_accessors (pixman_image_t * image,
if (image->type == BITS)
{
+ /* Accessors only work for <= 32 bpp. */
+ if (PIXMAN_FORMAT_BPP(image->bits.format) > 32)
+ return_if_fail (!read_func && !write_func);
+
image->bits.read_func = read_func;
image->bits.write_func = write_func;
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman-private.h b/Build/source/libs/pixman/pixman-src/pixman/pixman-private.h
index 73108a01d32..73a54146ddb 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman-private.h
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman-private.h
@@ -1,5 +1,3 @@
-#include <float.h>
-
#ifndef PIXMAN_PRIVATE_H
#define PIXMAN_PRIVATE_H
@@ -30,6 +28,7 @@
#include <stdio.h>
#include <string.h>
#include <stddef.h>
+#include <float.h>
#include "pixman-compiler.h"
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman-solid-fill.c b/Build/source/libs/pixman/pixman-src/pixman/pixman-solid-fill.c
index 5f9fef63064..4694ebc7004 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman-solid-fill.c
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman-solid-fill.c
@@ -30,10 +30,10 @@ static uint32_t
color_to_uint32 (const pixman_color_t *color)
{
return
- (color->alpha >> 8 << 24) |
- (color->red >> 8 << 16) |
- (color->green & 0xff00) |
- (color->blue >> 8);
+ ((unsigned int) color->alpha >> 8 << 24) |
+ ((unsigned int) color->red >> 8 << 16) |
+ ((unsigned int) color->green & 0xff00) |
+ ((unsigned int) color->blue >> 8);
}
static argb_t
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman-vmx.c b/Build/source/libs/pixman/pixman-src/pixman/pixman-vmx.c
index 41efdcfa1de..52de37e69ef 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman-vmx.c
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman-vmx.c
@@ -227,7 +227,7 @@ do \
#define COMPUTE_SHIFT_MASKC(dest, source, mask)
# define LOAD_VECTOR(source) \
- v ## source = *((typeof(v ## source)*)source);
+ v ## source = (typeof(v ## source))vec_xl(0, source);
# define LOAD_VECTORS(dest, source) \
LOAD_VECTOR(source); \
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman.c b/Build/source/libs/pixman/pixman-src/pixman/pixman.c
index f932eac3c1b..c09b5280831 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman.c
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman.c
@@ -777,6 +777,11 @@ color_to_pixel (const pixman_color_t *color,
{
uint32_t c = color_to_uint32 (color);
+ if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_RGBA_FLOAT)
+ {
+ return FALSE;
+ }
+
if (!(format == PIXMAN_a8r8g8b8 ||
format == PIXMAN_x8r8g8b8 ||
format == PIXMAN_a8b8g8r8 ||
diff --git a/Build/source/libs/pixman/pixman-src/pixman/pixman.h b/Build/source/libs/pixman/pixman-src/pixman/pixman.h
index 509ba5e534a..d644589d614 100644
--- a/Build/source/libs/pixman/pixman-src/pixman/pixman.h
+++ b/Build/source/libs/pixman/pixman-src/pixman/pixman.h
@@ -654,12 +654,24 @@ struct pixman_indexed
((g) << 4) | \
((b)))
-#define PIXMAN_FORMAT_BPP(f) (((f) >> 24) )
-#define PIXMAN_FORMAT_TYPE(f) (((f) >> 16) & 0xff)
-#define PIXMAN_FORMAT_A(f) (((f) >> 12) & 0x0f)
-#define PIXMAN_FORMAT_R(f) (((f) >> 8) & 0x0f)
-#define PIXMAN_FORMAT_G(f) (((f) >> 4) & 0x0f)
-#define PIXMAN_FORMAT_B(f) (((f) ) & 0x0f)
+#define PIXMAN_FORMAT_BYTE(bpp,type,a,r,g,b) \
+ (((bpp >> 3) << 24) | \
+ (3 << 22) | ((type) << 16) | \
+ ((a >> 3) << 12) | \
+ ((r >> 3) << 8) | \
+ ((g >> 3) << 4) | \
+ ((b >> 3)))
+
+#define PIXMAN_FORMAT_RESHIFT(val, ofs, num) \
+ (((val >> (ofs)) & ((1 << (num)) - 1)) << ((val >> 22) & 3))
+
+#define PIXMAN_FORMAT_BPP(f) PIXMAN_FORMAT_RESHIFT(f, 24, 8)
+#define PIXMAN_FORMAT_SHIFT(f) ((uint32_t)((f >> 22) & 3))
+#define PIXMAN_FORMAT_TYPE(f) (((f) >> 16) & 0x3f)
+#define PIXMAN_FORMAT_A(f) PIXMAN_FORMAT_RESHIFT(f, 12, 4)
+#define PIXMAN_FORMAT_R(f) PIXMAN_FORMAT_RESHIFT(f, 8, 4)
+#define PIXMAN_FORMAT_G(f) PIXMAN_FORMAT_RESHIFT(f, 4, 4)
+#define PIXMAN_FORMAT_B(f) PIXMAN_FORMAT_RESHIFT(f, 0, 4)
#define PIXMAN_FORMAT_RGB(f) (((f) ) & 0xfff)
#define PIXMAN_FORMAT_VIS(f) (((f) ) & 0xffff)
#define PIXMAN_FORMAT_DEPTH(f) (PIXMAN_FORMAT_A(f) + \
@@ -678,15 +690,22 @@ struct pixman_indexed
#define PIXMAN_TYPE_BGRA 8
#define PIXMAN_TYPE_RGBA 9
#define PIXMAN_TYPE_ARGB_SRGB 10
+#define PIXMAN_TYPE_RGBA_FLOAT 11
#define PIXMAN_FORMAT_COLOR(f) \
(PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ARGB || \
PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ABGR || \
PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_BGRA || \
- PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_RGBA)
+ PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_RGBA || \
+ PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_RGBA_FLOAT)
-/* 32bpp formats */
typedef enum {
+/* 128bpp formats */
+ PIXMAN_rgba_float = PIXMAN_FORMAT_BYTE(128,PIXMAN_TYPE_RGBA_FLOAT,32,32,32,32),
+/* 96bpp formats */
+ PIXMAN_rgb_float = PIXMAN_FORMAT_BYTE(96,PIXMAN_TYPE_RGBA_FLOAT,0,32,32,32),
+
+/* 32bpp formats */
PIXMAN_a8r8g8b8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,8,8,8,8),
PIXMAN_x8r8g8b8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,8,8,8),
PIXMAN_a8b8g8r8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,8,8,8,8),
diff --git a/Build/source/libs/pixman/version.ac b/Build/source/libs/pixman/version.ac
index 149bb50d120..1802e20da3c 100644
--- a/Build/source/libs/pixman/version.ac
+++ b/Build/source/libs/pixman/version.ac
@@ -8,4 +8,4 @@ dnl
dnl --------------------------------------------------------
dnl
dnl m4-include this file to define the current pixman version
-m4_define([pixman_version], [0.34.0])
+m4_define([pixman_version], [0.36.0])