From 0a07f1c2859415406cb940cc9440bfdf0d995c27 Mon Sep 17 00:00:00 2001 From: Luigi Scarso <luigi.scarso@gmail.com> Date: Fri, 5 Feb 2016 13:40:43 +0000 Subject: [PATCH] sync with experimental --- manual/luatex-nodes.tex | 5 +- manual/luatex.pdf | Bin 1022021 -> 1021735 bytes source/build-aux/texinfo.tex | 134 +- source/libs/README | 6 +- source/libs/libpng/ChangeLog | 5 + source/libs/libpng/Makefile.am | 5 +- source/libs/libpng/Makefile.in | 4 +- source/libs/pixman/ChangeLog | 6 + source/libs/pixman/Makefile.in | 4 +- source/libs/pixman/README | 7 +- source/libs/pixman/configure | 32 +- source/libs/pixman/configure.ac | 6 +- .../pixman-0.32.8/pixman/pixman-combine32.c | 2581 ----------------- .../ChangeLog | 5 + .../TL-Changes | 3 +- .../patch-01-hide-symbols | 6 +- .../{pixman-0.32.8 => pixman-src}/AUTHORS | 0 .../{pixman-0.32.8 => pixman-src}/COPYING | 0 .../{pixman-0.32.8 => pixman-src}/ChangeLog | 0 .../{pixman-0.32.8 => pixman-src}/INSTALL | 0 .../{pixman-0.32.8 => pixman-src}/Makefile.am | 0 .../Makefile.win32 | 0 .../Makefile.win32.common | 0 .../pixman/{pixman-0.32.8 => pixman-src}/NEWS | 0 .../{pixman-0.32.8 => pixman-src}/README | 0 .../{pixman-0.32.8 => pixman-src}/config.h.in | 6 +- .../configure.ac | 42 +- .../pixman-1-uninstalled.pc.in | 0 .../pixman-1.pc.in | 0 .../pixman/Makefile.am | 2 + .../pixman/Makefile.sources | 0 .../pixman/Makefile.win32 | 0 .../pixman/loongson-mmintrin.h | 0 .../pixman/pixman-access-accessors.c | 0 .../pixman/pixman-access.c | 0 .../pixman/pixman-accessor.h | 0 .../pixman/pixman-src/pixman/pixman-arm-asm.h | 37 + .../pixman/pixman-arm-common.h | 11 +- .../pixman/pixman-arm-neon-asm-bilinear.S | 12 +- .../pixman/pixman-arm-neon-asm.S | 12 +- .../pixman/pixman-arm-neon-asm.h | 20 +- .../pixman/pixman-arm-neon.c | 24 +- .../pixman/pixman-arm-simd-asm-scaled.S | 11 +- .../pixman/pixman-arm-simd-asm.S | 566 ++++ .../pixman/pixman-arm-simd-asm.h | 116 +- .../pixman/pixman-arm-simd.c | 50 +- .../pixman/pixman-arm.c | 0 .../pixman/pixman-bits-image.c | 0 .../pixman/pixman-combine-float.c | 338 ++- .../pixman-src/pixman/pixman-combine32.c | 1189 ++++++++ .../pixman/pixman-combine32.h | 0 .../pixman/pixman-compiler.h | 0 .../pixman/pixman-conical-gradient.c | 0 .../pixman/pixman-edge-accessors.c | 0 .../pixman/pixman-edge-imp.h | 0 .../pixman/pixman-edge.c | 0 .../pixman/pixman-fast-path.c | 2 + .../pixman/pixman-filter.c | 0 .../pixman/pixman-general.c | 31 +- .../pixman/pixman-glyph.c | 0 .../pixman/pixman-gradient-walker.c | 2 +- .../pixman/pixman-image.c | 0 .../pixman/pixman-implementation.c | 16 + .../pixman/pixman-inlines.h | 3 +- .../pixman/pixman-linear-gradient.c | 0 .../pixman/pixman-matrix.c | 0 .../pixman/pixman-mips-dspr2-asm.S | 2 +- .../pixman/pixman-mips-dspr2-asm.h | 4 +- .../pixman/pixman-mips-dspr2.c | 10 +- .../pixman/pixman-mips-dspr2.h | 8 +- .../pixman/pixman-mips-memcpy-asm.S | 0 .../pixman/pixman-mips.c | 0 .../pixman/pixman-mmx.c | 126 +- .../pixman/pixman-noop.c | 0 .../pixman/pixman-ppc.c | 0 .../pixman/pixman-private.h | 6 +- .../pixman/pixman-radial-gradient.c | 0 .../pixman/pixman-region.c | 0 .../pixman/pixman-region16.c | 0 .../pixman/pixman-region32.c | 0 .../pixman/pixman-solid-fill.c | 0 .../pixman/pixman-sse2.c | 24 +- .../pixman/pixman-ssse3.c | 0 .../pixman/pixman-timer.c | 0 .../pixman/pixman-trap.c | 0 .../pixman/pixman-utils.c | 0 .../pixman/pixman-version.h.in | 0 .../pixman/pixman-vmx.c | 1229 +++++++- .../pixman/pixman-x86.c | 0 .../pixman/pixman.c | 35 +- .../pixman/pixman.h | 0 .../pixman/solaris-hwcap.mapfile | 0 source/libs/pixman/version.ac | 2 +- source/texk/README | 6 +- source/texk/kpathsea/ChangeLog | 5 + source/texk/kpathsea/mingw32.c | 6 + source/texk/kpathsea/mingw32.h | 3 +- source/texk/kpathsea/win32lib.c | 5 + source/texk/kpathsea/win32lib.h | 1 + source/texk/web2c/cwebdir/README | 12 +- source/texk/web2c/cwebdir/cwebmac.tex | 15 +- source/texk/web2c/lib/ChangeLog | 4 + source/texk/web2c/lib/texmfmp.c | 14 +- source/texk/web2c/luatexdir/lang/texlang.w | 6 +- source/texk/web2c/luatexdir/lua/lpdflib.c | 12 +- source/texk/web2c/luatexdir/luatex.c | 2 +- source/texk/web2c/luatexdir/pdf/pdfgen.w | 51 +- source/texk/web2c/luatexdir/pdf/pdfpage.w | 16 +- source/texk/web2c/luatexdir/pdf/pdfrule.w | 4 +- source/texk/web2c/luatexdir/pdf/pdftypes.h | 18 +- source/texk/web2c/luatexdir/tex/commands.h | 3 - source/texk/web2c/luatexdir/tex/commands.w | 2 +- source/texk/web2c/luatexdir/tex/linebreak.w | 7 +- source/texk/web2c/luatexdir/tex/maincontrol.w | 11 +- source/texk/web2c/luatexdir/tex/mlist.w | 2 +- .../texk/web2c/luatexdir/tex/postlinebreak.w | 6 +- source/texk/web2c/luatexdir/tex/printing.w | 10 +- source/texk/web2c/luatexdir/tex/texnodes.h | 9 +- source/texk/web2c/luatexdir/tex/texnodes.w | 4 +- source/texk/web2c/luatexdir/tex/textoken.w | 34 +- 120 files changed, 3891 insertions(+), 3122 deletions(-) delete mode 100755 source/libs/pixman/pixman-0.32.8/pixman/pixman-combine32.c rename source/libs/pixman/{pixman-0.32.8-PATCHES => pixman-src-PATCHES}/ChangeLog (87%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8-PATCHES => pixman-src-PATCHES}/TL-Changes (77%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8-PATCHES => pixman-src-PATCHES}/patch-01-hide-symbols (55%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/AUTHORS (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/COPYING (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/ChangeLog (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/INSTALL (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/Makefile.am (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/Makefile.win32 (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/Makefile.win32.common (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/NEWS (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/README (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/config.h.in (96%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/configure.ac (97%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman-1-uninstalled.pc.in (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman-1.pc.in (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/Makefile.am (98%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/Makefile.sources (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/Makefile.win32 (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/loongson-mmintrin.h (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-access-accessors.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-access.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-accessor.h (100%) mode change 100755 => 100644 create mode 100644 source/libs/pixman/pixman-src/pixman/pixman-arm-asm.h rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm-common.h (97%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm-neon-asm-bilinear.S (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm-neon-asm.S (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm-neon-asm.h (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm-neon.c (96%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm-simd-asm-scaled.S (95%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm-simd-asm.S (53%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm-simd-asm.h (90%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm-simd.c (79%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-arm.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-bits-image.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-combine-float.c (80%) mode change 100755 => 100644 create mode 100644 source/libs/pixman/pixman-src/pixman/pixman-combine32.c rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-combine32.h (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-compiler.h (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-conical-gradient.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-edge-accessors.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-edge-imp.h (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-edge.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-fast-path.c (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-filter.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-general.c (91%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-glyph.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-gradient-walker.c (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-image.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-implementation.c (96%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-inlines.h (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-linear-gradient.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-matrix.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-mips-dspr2-asm.S (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-mips-dspr2-asm.h (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-mips-dspr2.c (98%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-mips-dspr2.h (98%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-mips-memcpy-asm.S (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-mips.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-mmx.c (96%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-noop.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-ppc.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-private.h (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-radial-gradient.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-region.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-region16.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-region32.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-solid-fill.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-sse2.c (99%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-ssse3.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-timer.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-trap.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-utils.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-version.h.in (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-vmx.c (61%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman-x86.c (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman.c (97%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/pixman.h (100%) mode change 100755 => 100644 rename source/libs/pixman/{pixman-0.32.8 => pixman-src}/pixman/solaris-hwcap.mapfile (100%) mode change 100755 => 100644 diff --git a/manual/luatex-nodes.tex b/manual/luatex-nodes.tex index ad0a74b30..8ffa9507b 100644 --- a/manual/luatex-nodes.tex +++ b/manual/luatex-nodes.tex @@ -384,8 +384,9 @@ Id: \showid{kern} \starttabulate[|lT|l|p|] \NC \ssbf field \NC \bf type \NC \bf explanation \NC \NR \NC subtype \NC number \NC \type {0} = from font, - \type {1} = from \type {\kern} or \type {\/}, - \type {2} = from \type {\accent} \NC \NR + \type {1} = from \type {\kern}, + \type {2} = from \type {\accent}, + \type {3} = from \type {\/} \NC \NR \NC attr \NC \syntax{<node>} \NC \NC \NR \NC kern \NC number \NC \NC \NR \stoptabulate diff --git a/manual/luatex.pdf b/manual/luatex.pdf index 7a28cb730606ef5fc396299d5a666b1dd6b6e250..ce176f03154b6ba6af4ccaa60a3c5d7259856eaa 100644 GIT binary patch delta 86995 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 delta 87222 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 E0JseN9smFU diff --git a/source/build-aux/texinfo.tex b/source/build-aux/texinfo.tex index 936c32dc5..58021b2c1 100644 --- a/source/build-aux/texinfo.tex +++ b/source/build-aux/texinfo.tex @@ -3,7 +3,7 @@ % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2016-01-11.19} +\def\texinfoversion{2016-02-02.07} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, @@ -4737,11 +4737,10 @@ end \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % - \def\lbracechar{{\indexlbrace}}% - \def\rbracechar{{\indexrbrace}}% - \let\{=\lbracechar - \let\}=\rbracechar - % + \uccode`\1=`\{ \uppercase{\def\{{1}}% + \uccode`\1=`\} \uppercase{\def\}{1}}% + \let\lbracechar\{% + \let\rbracechar\}% % % Non-English letters. \def\AA{AA}% @@ -4901,9 +4900,15 @@ end \indexdummies % Must do this here, since \bf, etc expand at this stage \useindexbackslash % \indexbackslash isn't defined now so it will be output % as is; and it will print as backslash. + % The braces around \indexbrace are recognized by texindex. + % % Get the string to sort by, by processing the index entry with all % font commands turned off. {\indexnofonts + \def\lbracechar{{\indexlbrace}}% + \def\rbracechar{{\indexrbrace}}% + \let\{=\lbracechar + \let\}=\rbracechar \indexnonalnumdisappear \xdef\indexsortkey{}% \let\sortas=\indexwritesortas @@ -8526,10 +8531,6 @@ end }% \setcolor{\linkcolor}% \fi - % - % Float references are printed completely differently: "Figure 1.2" - % instead of "[somenode], p.3". We distinguish them by the - % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. @@ -8538,6 +8539,10 @@ end \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". \iffloat distinguishes them by + % \Xthisreftitle being set to a magic string. \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". @@ -8596,12 +8601,9 @@ end % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% - \ifx,\tokenafterxref - \else\ifx.\tokenafterxref - \else\ifx;\tokenafterxref - \else\ifx)\tokenafterxref - \else,% add a , if xref not followed by punctuation - \fi\fi\fi\fi + \if\noexpand\tokenafterxref\space + ,% add a , if xref not followed by punctuation + \fi \fi\fi \fi \endlink @@ -9948,7 +9950,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} - + % \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B1}{\ensuremath\pm} \DeclareUnicodeCharacter{00B2}{$^2$} @@ -9965,7 +9967,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{00BD}{$1\over2$} \DeclareUnicodeCharacter{00BE}{$3\over4$} \DeclareUnicodeCharacter{00BF}{\questiondown} - + % \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} @@ -9982,7 +9984,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} - + % \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} @@ -9999,7 +10001,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} - + % \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} @@ -10016,7 +10018,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} - + % \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} @@ -10033,7 +10035,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} - + % \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} @@ -10050,7 +10052,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{010F}{d'} - + % \DeclareUnicodeCharacter{0110}{\DH} \DeclareUnicodeCharacter{0111}{\dh} \DeclareUnicodeCharacter{0112}{\=E} @@ -10067,7 +10069,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} - + % \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0122}{\cedilla{G}} @@ -10084,7 +10086,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{012E}{\ogonek{I}} \DeclareUnicodeCharacter{012F}{\ogonek{i}} - + % \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} @@ -10101,7 +10103,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{013D}{L'}% should kern \DeclareUnicodeCharacter{013E}{l'}% should kern \DeclareUnicodeCharacter{013F}{L\U{00B7}} - + % \DeclareUnicodeCharacter{0140}{l\U{00B7}} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} @@ -10118,7 +10120,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} - + % \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} @@ -10135,7 +10137,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} - + % \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{T}} @@ -10152,7 +10154,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} - + % \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0172}{\ogonek{U}} @@ -10169,7 +10171,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}} - + % \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} @@ -10182,20 +10184,20 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} - + % \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} - + % \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} - + % \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} @@ -10208,23 +10210,23 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} - + % \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} - + % \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} - + % \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} - + % \DeclareUnicodeCharacter{02DB}{\ogonek{ }} - + % % Greek letters upper case \DeclareUnicodeCharacter{0391}{{\it A}} \DeclareUnicodeCharacter{0392}{{\it B}} @@ -10251,7 +10253,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{03A7}{{\it X}} \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}} \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}} - + % % Vowels with accents \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}} \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}} @@ -10259,10 +10261,10 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}} \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}} \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}} - + % % Standalone accent \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}} - + % % Greek letters lower case \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha} \DeclareUnicodeCharacter{03B2}{\ensuremath\beta} @@ -10289,19 +10291,19 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{03C7}{\ensuremath\chi} \DeclareUnicodeCharacter{03C8}{\ensuremath\psi} \DeclareUnicodeCharacter{03C9}{\ensuremath\omega} - + % % More Greek vowels with accents \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}} \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}} \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}} \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}} \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}} - + % % Variant Greek letters \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta} \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi} \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho} - + % \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} @@ -10314,10 +10316,10 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} - + % \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} - + % \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} @@ -10326,7 +10328,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} - + % \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} @@ -10339,7 +10341,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} - + % \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} @@ -10350,7 +10352,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} - + % \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} @@ -10361,7 +10363,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} - + % \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} @@ -10372,12 +10374,12 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} - + % \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} - + % \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} @@ -10394,7 +10396,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} - + % \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} @@ -10405,30 +10407,30 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} - + % \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} - + % \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} - + % \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} - + % \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} - + % \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} - + % \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} - + % % Punctuation \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} @@ -10445,12 +10447,12 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} - + % \DeclareUnicodeCharacter{20AC}{\euro} - + % \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} - + % % Mathematical symbols \DeclareUnicodeCharacter{2200}{\ensuremath\forall} \DeclareUnicodeCharacter{2203}{\ensuremath\exists} @@ -10466,7 +10468,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{2265}{\ensuremath\geq} \DeclareUnicodeCharacter{2282}{\ensuremath\subset} \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq} - + % \DeclareUnicodeCharacter{2016}{\ensuremath\Vert} \DeclareUnicodeCharacter{2032}{\ensuremath\prime} \DeclareUnicodeCharacter{210F}{\ensuremath\hbar} @@ -10566,7 +10568,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor} \DeclareUnicodeCharacter{2322}{\ensuremath\frown} \DeclareUnicodeCharacter{2323}{\ensuremath\smile} - + % \DeclareUnicodeCharacter{25A1}{\ensuremath\Box} \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle} \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright} @@ -10598,7 +10600,7 @@ callback.register("process_output_buffer", convert_line_out) \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg} \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq} \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq} - + % \global\mathchardef\checkmark="1370 % actually the square root sign \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark} }% end of \utfeightchardefs diff --git a/source/libs/README b/source/libs/README index f44914f56..bf39eca37 100644 --- a/source/libs/README +++ b/source/libs/README @@ -1,4 +1,4 @@ -$Id: README 39398 2016-01-15 23:53:35Z kakuto $ +$Id: README 39575 2016-02-04 08:42:42Z kakuto $ Public domain. Originally created by Karl Berry, 2005. Libraries we compile for TeX Live. @@ -21,7 +21,7 @@ gd 2.1.1 - checked 14jan15 gmp 6.1.0 - checked 28dec15 http://ftp.gnu.org/gnu/gmp/ -graphite2 1.3.3 - checked 27sep15 +graphite2 1.3.5 - checked 20jan16 http://sourceforge.net/projects/silgraphite/files/graphite2/ harfbuzz 1.1.3 - checked 12jan16 @@ -46,7 +46,7 @@ luajit 2.1.0-beta1 - checked 7sep15 mpfr 3.1.3 - checked 20jun15 http://ftp.gnu.org/gnu/mpfr/ -pixman 0.32.8 - checked 27sep15 +pixman 0.34.0 - checked 04feb16 http://cairographics.org/releases/ poppler 0.40.0 - checked 14jan16 diff --git a/source/libs/libpng/ChangeLog b/source/libs/libpng/ChangeLog index 466208698..a2d86e82d 100644 --- a/source/libs/libpng/ChangeLog +++ b/source/libs/libpng/ChangeLog @@ -1,3 +1,8 @@ +2016-01-20 Karl Berry <karl@tug.org> + + * Makefile.am (AM_CPPFLAGS): add LIBPNG_USER_CPPFLAGS for Mojca. + http://tug.org/pipermail/tlbuild/2016q1/003327.html + 2016-01-15 Akira Kakuto <kakuto@fuk.kindai.ac.jp> Import libpng-1.6.21. diff --git a/source/libs/libpng/Makefile.am b/source/libs/libpng/Makefile.am index 6bb6c1726..805a6977d 100644 --- a/source/libs/libpng/Makefile.am +++ b/source/libs/libpng/Makefile.am @@ -1,6 +1,6 @@ ## Proxy Makefile.am to build libpng for TeX Live. ## -## Copyright (C) 2009-2015 Peter Breitenlohner <tex-live@tug.org> +## Copyright (C) 2009-2016 Peter Breitenlohner <tex-live@tug.org> ## ## This file is free software; the copyright holder ## gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,8 @@ NEVER_NAMES += $(NEVER_NAMES_SUB) SUBDIRS = . include -AM_CPPFLAGS = -I$(top_srcdir)/$(LIBPNG_TREE) $(ZLIB_INCLUDES) $(LIBPNG_DEFINES) +AM_CPPFLAGS = -I$(top_srcdir)/$(LIBPNG_TREE) $(ZLIB_INCLUDES) \ + $(LIBPNG_DEFINES) $(LIBPNG_USER_CPPFLAGS) AM_CFLAGS = $(VISIBILITY_CFLAGS) $(WARNING_CFLAGS) noinst_LIBRARIES=libpng.a diff --git a/source/libs/libpng/Makefile.in b/source/libs/libpng/Makefile.in index cc01ba72a..7d66dedf2 100644 --- a/source/libs/libpng/Makefile.in +++ b/source/libs/libpng/Makefile.in @@ -569,7 +569,9 @@ NEVER_NAMES = -name .svn $(NEVER_NAMES_SUB) NEVER_NAMES_SUB = -o -name .deps -o -name .dirstamp -o -name '*.$(OBJEXT)' NEVER_NAMES_LT = -o -name .libs -o -name '*.lo' SUBDIRS = . include -AM_CPPFLAGS = -I$(top_srcdir)/$(LIBPNG_TREE) $(ZLIB_INCLUDES) $(LIBPNG_DEFINES) +AM_CPPFLAGS = -I$(top_srcdir)/$(LIBPNG_TREE) $(ZLIB_INCLUDES) \ + $(LIBPNG_DEFINES) $(LIBPNG_USER_CPPFLAGS) + AM_CFLAGS = $(VISIBILITY_CFLAGS) $(WARNING_CFLAGS) noinst_LIBRARIES = libpng.a nodist_libpng_a_SOURCES = \ diff --git a/source/libs/pixman/ChangeLog b/source/libs/pixman/ChangeLog index c4c881f57..40bddee16 100644 --- a/source/libs/pixman/ChangeLog +++ b/source/libs/pixman/ChangeLog @@ -1,3 +1,9 @@ +2016-02-04 Akira Kakuto <kakuto@fuk.kindai.ac.jp> + + Import pixman-0.34.0. + * version.ac: Adapted. + * configure.ac: New source tree convension. + 2015-09-26 Peter Breitenlohner <peb@mppmu.mpg.de> Import pixman-0.32.8. diff --git a/source/libs/pixman/Makefile.in b/source/libs/pixman/Makefile.in index b1ba8a5df..b0a5a6564 100644 --- a/source/libs/pixman/Makefile.in +++ b/source/libs/pixman/Makefile.in @@ -440,7 +440,7 @@ am__DIST_COMMON = $(srcdir)/../../am/dist_hook.am \ $(top_srcdir)/../../build-aux/install-sh \ $(top_srcdir)/../../build-aux/missing \ $(top_srcdir)/../../build-aux/test-driver \ - $(top_srcdir)/pixman-0.32.8/pixman/pixman-version.h.in \ + $(top_srcdir)/pixman-src/pixman/pixman-version.h.in \ ../../build-aux/compile ../../build-aux/config.guess \ ../../build-aux/config.sub ../../build-aux/depcomp \ ../../build-aux/install-sh ../../build-aux/ltmain.sh \ @@ -702,7 +702,7 @@ $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) distclean-hdr: -rm -f config.h stamp-h1 -pixman-version.h: $(top_builddir)/config.status $(top_srcdir)/pixman-0.32.8/pixman/pixman-version.h.in +pixman-version.h: $(top_builddir)/config.status $(top_srcdir)/pixman-src/pixman/pixman-version.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ clean-noinstLIBRARIES: diff --git a/source/libs/pixman/README b/source/libs/pixman/README index 99988a75e..7fb53afe2 100644 --- a/source/libs/pixman/README +++ b/source/libs/pixman/README @@ -1,14 +1,15 @@ - Building pixman-0.28.0 as part of the TL tree + Building pixman-0.34.0 as part of the TL tree ============================================= This directory libs/pixman/ uses a proxy Makefile.am to build the pixman library 'libpixman' from the unmodified source tree in -libs/pixman/pixman-x.y.z/, bypassing the original build system. +libs/pixman/pixman-src/, bypassing the original build system. -As far as applicable, the tests in libs/pixman/pixman-x.y.z/configure have +As far as applicable, the tests in libs/pixman/pixman-src/configure have 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> diff --git a/source/libs/pixman/configure b/source/libs/pixman/configure index 57e14f3dc..92f9ad086 100755 --- a/source/libs/pixman/configure +++ b/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.32.8. +# Generated by GNU Autoconf 2.69 for pixman (TeX Live) 0.34.0. # # Report bugs to <tex-k@tug.org>. # @@ -580,12 +580,12 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='pixman (TeX Live)' PACKAGE_TARNAME='pixman--tex-live-' -PACKAGE_VERSION='0.32.8' -PACKAGE_STRING='pixman (TeX Live) 0.32.8' +PACKAGE_VERSION='0.34.0' +PACKAGE_STRING='pixman (TeX Live) 0.34.0' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' -ac_unique_file="pixman-0.32.8/pixman/pixman.h" +ac_unique_file="pixman-src/pixman/pixman.h" # Factoring default headers for most tests. ac_includes_default="\ #include <stdio.h> @@ -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.32.8 to adapt to many kinds of systems. +\`configure' configures pixman (TeX Live) 0.34.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.32.8:";; + short | recursive ) echo "Configuration of pixman (TeX Live) 0.34.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.32.8 +pixman (TeX Live) configure 0.34.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.32.8, which was +It was created by pixman (TeX Live) $as_me 0.34.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.32.8' + VERSION='0.34.0' cat >>confdefs.h <<_ACEOF @@ -4077,8 +4077,8 @@ WARNING_CFLAGS=$kpse_cv_warning_cflags PIXMAN_VERSION_MAJOR=0 -PIXMAN_VERSION_MINOR=32 -PIXMAN_VERSION_MICRO=8 +PIXMAN_VERSION_MINOR=34 +PIXMAN_VERSION_MICRO=0 test_CFLAGS=${CFLAGS+set} # We may override autoconf default CFLAGS. @@ -6032,14 +6032,14 @@ rm -f core conftest.err conftest.$ac_objext \ $as_echo "$_yesno" >&6; } -PIXMAN_TREE=pixman-0.32.8 +PIXMAN_TREE=pixman-src if test -f $srcdir/$PIXMAN_TREE/pixman/pixman-version.h; then as_fn_error $? "Sorry, you must remove the file $PIXMAN_TREE/pixman/pixman-version.h" "$LINENO" 5 fi -ac_config_files="$ac_config_files Makefile include/Makefile pixman-version.h:pixman-0.32.8/pixman/pixman-version.h.in" +ac_config_files="$ac_config_files Makefile include/Makefile pixman-version.h:pixman-src/pixman/pixman-version.h.in" cat >confcache <<\_ACEOF @@ -6585,7 +6585,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.32.8, which was +This file was extended by pixman (TeX Live) $as_me 0.34.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -6651,7 +6651,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.32.8 +pixman (TeX Live) config.status 0.34.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -6784,7 +6784,7 @@ do "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; - "pixman-version.h") CONFIG_FILES="$CONFIG_FILES pixman-version.h:pixman-0.32.8/pixman/pixman-version.h.in" ;; + "pixman-version.h") CONFIG_FILES="$CONFIG_FILES pixman-version.h:pixman-src/pixman/pixman-version.h.in" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac diff --git a/source/libs/pixman/configure.ac b/source/libs/pixman/configure.ac index 7291f5045..5100a54a8 100644 --- a/source/libs/pixman/configure.ac +++ b/source/libs/pixman/configure.ac @@ -9,7 +9,7 @@ dnl m4_include([version.ac])[] dnl define pixman_version AC_INIT([pixman (TeX Live)], pixman_version, [tex-k@tug.org]) AC_PREREQ([2.65]) -AC_CONFIG_SRCDIR([pixman-]pixman_version[/pixman/pixman.h]) +AC_CONFIG_SRCDIR([pixman-src/pixman/pixman.h]) AC_CONFIG_AUX_DIR([../../build-aux]) AC_CONFIG_MACRO_DIR([../../m4]) @@ -151,7 +151,7 @@ fi PIXMAN_CHECK_CFLAG([-Wall]) PIXMAN_CHECK_CFLAG([-fno-strict-aliasing]) -AC_SUBST([PIXMAN_TREE], [pixman-]pixman_version) +AC_SUBST([PIXMAN_TREE], [pixman-src]) if test -f $srcdir/$PIXMAN_TREE/pixman/pixman-version.h; then AC_MSG_ERROR([Sorry, you must remove the file $PIXMAN_TREE/pixman/pixman-version.h]) @@ -159,6 +159,6 @@ fi AC_CONFIG_FILES([Makefile include/Makefile - pixman-version.h:pixman-]pixman_version[/pixman/pixman-version.h.in]) + pixman-version.h:pixman-src/pixman/pixman-version.h.in]) AC_OUTPUT diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-combine32.c b/source/libs/pixman/pixman-0.32.8/pixman/pixman-combine32.c deleted file mode 100755 index 450114a52..000000000 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-combine32.c +++ /dev/null @@ -1,2581 +0,0 @@ -/* - * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. - * 2005 Lars Knoll & Zack Rusin, Trolltech - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Keith Packard not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <math.h> -#include <string.h> - -#include "pixman-private.h" -#include "pixman-combine32.h" - -/* component alpha helper functions */ - -static void -combine_mask_ca (uint32_t *src, uint32_t *mask) -{ - uint32_t a = *mask; - - uint32_t x; - uint16_t xa; - - if (!a) - { - *(src) = 0; - return; - } - - x = *(src); - if (a == ~0) - { - x = x >> A_SHIFT; - x |= x << G_SHIFT; - x |= x << R_SHIFT; - *(mask) = x; - return; - } - - xa = x >> A_SHIFT; - UN8x4_MUL_UN8x4 (x, a); - *(src) = x; - - UN8x4_MUL_UN8 (a, xa); - *(mask) = a; -} - -static void -combine_mask_value_ca (uint32_t *src, const uint32_t *mask) -{ - uint32_t a = *mask; - uint32_t x; - - if (!a) - { - *(src) = 0; - return; - } - - if (a == ~0) - return; - - x = *(src); - UN8x4_MUL_UN8x4 (x, a); - *(src) = x; -} - -static void -combine_mask_alpha_ca (const uint32_t *src, uint32_t *mask) -{ - uint32_t a = *(mask); - uint32_t x; - - if (!a) - return; - - x = *(src) >> A_SHIFT; - if (x == MASK) - return; - - if (a == ~0) - { - x |= x << G_SHIFT; - x |= x << R_SHIFT; - *(mask) = x; - return; - } - - UN8x4_MUL_UN8 (a, x); - *(mask) = a; -} - -/* - * There are two ways of handling alpha -- either as a single unified value or - * a separate value for each component, hence each macro must have two - * versions. The unified alpha version has a 'u' at the end of the name, - * the component version has a 'ca'. Similarly, functions which deal with - * this difference will have two versions using the same convention. - */ - -static force_inline uint32_t -combine_mask (const uint32_t *src, const uint32_t *mask, int i) -{ - uint32_t s, m; - - if (mask) - { - m = *(mask + i) >> A_SHIFT; - - if (!m) - return 0; - } - - s = *(src + i); - - if (mask) - UN8x4_MUL_UN8 (s, m); - - return s; -} - -static void -combine_clear (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - memset (dest, 0, width * sizeof (uint32_t)); -} - -static void -combine_dst (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - return; -} - -static void -combine_src_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - if (!mask) - { - memcpy (dest, src, width * sizeof (uint32_t)); - } - else - { - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - - *(dest + i) = s; - } - } -} - -static void -combine_over_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - if (!mask) - { - for (i = 0; i < width; ++i) - { - uint32_t s = *(src + i); - uint32_t a = ALPHA_8 (s); - if (a == 0xFF) - { - *(dest + i) = s; - } - else if (s) - { - uint32_t d = *(dest + i); - uint32_t ia = a ^ 0xFF; - UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s); - *(dest + i) = d; - } - } - } - else - { - for (i = 0; i < width; ++i) - { - uint32_t m = ALPHA_8 (*(mask + i)); - if (m == 0xFF) - { - uint32_t s = *(src + i); - uint32_t a = ALPHA_8 (s); - if (a == 0xFF) - { - *(dest + i) = s; - } - else if (s) - { - uint32_t d = *(dest + i); - uint32_t ia = a ^ 0xFF; - UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s); - *(dest + i) = d; - } - } - else if (m) - { - uint32_t s = *(src + i); - if (s) - { - uint32_t d = *(dest + i); - UN8x4_MUL_UN8 (s, m); - UN8x4_MUL_UN8_ADD_UN8x4 (d, ALPHA_8 (~s), s); - *(dest + i) = d; - } - } - } - } -} - -static void -combine_over_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t ia = ALPHA_8 (~*(dest + i)); - UN8x4_MUL_UN8_ADD_UN8x4 (s, ia, d); - *(dest + i) = s; - } -} - -static void -combine_in_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t a = ALPHA_8 (*(dest + i)); - UN8x4_MUL_UN8 (s, a); - *(dest + i) = s; - } -} - -static void -combine_in_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t a = ALPHA_8 (s); - UN8x4_MUL_UN8 (d, a); - *(dest + i) = d; - } -} - -static void -combine_out_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t a = ALPHA_8 (~*(dest + i)); - UN8x4_MUL_UN8 (s, a); - *(dest + i) = s; - } -} - -static void -combine_out_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t a = ALPHA_8 (~s); - UN8x4_MUL_UN8 (d, a); - *(dest + i) = d; - } -} - -static void -combine_atop_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t dest_a = ALPHA_8 (d); - uint32_t src_ia = ALPHA_8 (~s); - - UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_a, d, src_ia); - *(dest + i) = s; - } -} - -static void -combine_atop_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t src_a = ALPHA_8 (s); - uint32_t dest_ia = ALPHA_8 (~d); - - UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_a); - *(dest + i) = s; - } -} - -static void -combine_xor_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t src_ia = ALPHA_8 (~s); - uint32_t dest_ia = ALPHA_8 (~d); - - UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_ia); - *(dest + i) = s; - } -} - -static void -combine_add_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - UN8x4_ADD_UN8x4 (d, s); - *(dest + i) = d; - } -} - -static void -combine_saturate_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint16_t sa, da; - - sa = s >> A_SHIFT; - da = ~d >> A_SHIFT; - if (sa > da) - { - sa = DIV_UN8 (da, sa); - UN8x4_MUL_UN8 (s, sa); - } - ; - UN8x4_ADD_UN8x4 (d, s); - *(dest + i) = d; - } -} - - -/* - * PDF blend modes: - * - * The following blend modes have been taken from the PDF ISO 32000 - * specification, which at this point in time is available from - * - * http://www.adobe.com/devnet/pdf/pdf_reference.html - * - * The specific documents of interest are the PDF spec itself: - * - * http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf - * - * chapters 11.3.5 and 11.3.6 and a later supplement for Adobe Acrobat - * 9.1 and Reader 9.1: - * - * http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000_1.pdf - * - * that clarifies the specifications for blend modes ColorDodge and - * ColorBurn. - * - * The formula for computing the final pixel color given in 11.3.6 is: - * - * αr × Cr = (1 – αs) × αb × Cb + (1 – αb) × αs × Cs + αb × αs × B(Cb, Cs) - * - * with B() is the blend function. When B(Cb, Cs) = Cs, this formula - * reduces to the regular OVER operator. - * - * Cs and Cb are not premultiplied, so in our implementation we instead - * use: - * - * cr = (1 – αs) × cb + (1 – αb) × cs + αb × αs × B (cb/αb, cs/αs) - * - * where cr, cs, and cb are premultiplied colors, and where the - * - * αb × αs × B(cb/αb, cs/αs) - * - * part is first arithmetically simplified under the assumption that αb - * and αs are not 0, and then updated to produce a meaningful result when - * they are. - * - * For all the blend mode operators, the alpha channel is given by - * - * αr = αs + αb + αb × αs - */ - -/* - * Multiply - * - * ad * as * B(d / ad, s / as) - * = ad * as * d/ad * s/as - * = d * s - * - */ -static void -combine_multiply_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t ss = s; - uint32_t src_ia = ALPHA_8 (~s); - uint32_t dest_ia = ALPHA_8 (~d); - - UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (ss, dest_ia, d, src_ia); - UN8x4_MUL_UN8x4 (d, s); - UN8x4_ADD_UN8x4 (d, ss); - - *(dest + i) = d; - } -} - -static void -combine_multiply_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t m = *(mask + i); - uint32_t s = *(src + i); - uint32_t d = *(dest + i); - uint32_t r = d; - uint32_t dest_ia = ALPHA_8 (~d); - - combine_mask_ca (&s, &m); - - UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (r, ~m, s, dest_ia); - UN8x4_MUL_UN8x4 (d, s); - UN8x4_ADD_UN8x4 (r, d); - - *(dest + i) = r; - } -} - -#define PDF_SEPARABLE_BLEND_MODE(name) \ - static void \ - combine_ ## name ## _u (pixman_implementation_t *imp, \ - pixman_op_t op, \ - uint32_t * dest, \ - const uint32_t * src, \ - const uint32_t * mask, \ - int width) \ - { \ - int i; \ - for (i = 0; i < width; ++i) \ - { \ - uint32_t s = combine_mask (src, mask, i); \ - uint32_t d = *(dest + i); \ - uint8_t sa = ALPHA_8 (s); \ - uint8_t isa = ~sa; \ - uint8_t da = ALPHA_8 (d); \ - uint8_t ida = ~da; \ - uint32_t result; \ - \ - result = d; \ - UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (result, isa, s, ida); \ - \ - *(dest + i) = result + \ - (DIV_ONE_UN8 (sa * (uint32_t)da) << A_SHIFT) + \ - (blend_ ## name (RED_8 (d), da, RED_8 (s), sa) << R_SHIFT) + \ - (blend_ ## name (GREEN_8 (d), da, GREEN_8 (s), sa) << G_SHIFT) + \ - (blend_ ## name (BLUE_8 (d), da, BLUE_8 (s), sa)); \ - } \ - } \ - \ - static void \ - combine_ ## name ## _ca (pixman_implementation_t *imp, \ - pixman_op_t op, \ - uint32_t * dest, \ - const uint32_t * src, \ - const uint32_t * mask, \ - int width) \ - { \ - int i; \ - for (i = 0; i < width; ++i) \ - { \ - uint32_t m = *(mask + i); \ - uint32_t s = *(src + i); \ - uint32_t d = *(dest + i); \ - uint8_t da = ALPHA_8 (d); \ - uint8_t ida = ~da; \ - uint32_t result; \ - \ - combine_mask_ca (&s, &m); \ - \ - result = d; \ - UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (result, ~m, s, ida); \ - \ - result += \ - (DIV_ONE_UN8 (ALPHA_8 (m) * (uint32_t)da) << A_SHIFT) + \ - (blend_ ## name (RED_8 (d), da, RED_8 (s), RED_8 (m)) << R_SHIFT) + \ - (blend_ ## name (GREEN_8 (d), da, GREEN_8 (s), GREEN_8 (m)) << G_SHIFT) + \ - (blend_ ## name (BLUE_8 (d), da, BLUE_8 (s), BLUE_8 (m))); \ - \ - *(dest + i) = result; \ - } \ - } - -/* - * Screen - * - * ad * as * B(d/ad, s/as) - * = ad * as * (d/ad + s/as - s/as * d/ad) - * = ad * s + as * d - s * d - */ -static inline uint32_t -blend_screen (uint32_t d, uint32_t ad, uint32_t s, uint32_t as) -{ - return DIV_ONE_UN8 (s * ad + d * as - s * d); -} - -PDF_SEPARABLE_BLEND_MODE (screen) - -/* - * Overlay - * - * ad * as * B(d/ad, s/as) - * = ad * as * Hardlight (s, d) - * = if (d / ad < 0.5) - * as * ad * Multiply (s/as, 2 * d/ad) - * else - * as * ad * Screen (s/as, 2 * d / ad - 1) - * = if (d < 0.5 * ad) - * as * ad * s/as * 2 * d /ad - * else - * as * ad * (s/as + 2 * d / ad - 1 - s / as * (2 * d / ad - 1)) - * = if (2 * d < ad) - * 2 * s * d - * else - * ad * s + 2 * as * d - as * ad - ad * s * (2 * d / ad - 1) - * = if (2 * d < ad) - * 2 * s * d - * else - * as * ad - 2 * (ad - d) * (as - s) - */ -static inline uint32_t -blend_overlay (uint32_t d, uint32_t ad, uint32_t s, uint32_t as) -{ - uint32_t r; - - if (2 * d < ad) - r = 2 * s * d; - else - r = as * ad - 2 * (ad - d) * (as - s); - - return DIV_ONE_UN8 (r); -} - -PDF_SEPARABLE_BLEND_MODE (overlay) - -/* - * Darken - * - * ad * as * B(d/ad, s/as) - * = ad * as * MIN(d/ad, s/as) - * = MIN (as * d, ad * s) - */ -static inline uint32_t -blend_darken (uint32_t d, uint32_t ad, uint32_t s, uint32_t as) -{ - s = ad * s; - d = as * d; - - return DIV_ONE_UN8 (s > d ? d : s); -} - -PDF_SEPARABLE_BLEND_MODE (darken) - -/* - * Lighten - * - * ad * as * B(d/ad, s/as) - * = ad * as * MAX(d/ad, s/as) - * = MAX (as * d, ad * s) - */ -static inline uint32_t -blend_lighten (uint32_t d, uint32_t ad, uint32_t s, uint32_t as) -{ - s = ad * s; - d = as * d; - - return DIV_ONE_UN8 (s > d ? s : d); -} - -PDF_SEPARABLE_BLEND_MODE (lighten) - -/* - * Color dodge - * - * ad * as * B(d/ad, s/as) - * = if d/ad = 0 - * ad * as * 0 - * else if (d/ad >= (1 - s/as) - * ad * as * 1 - * else - * ad * as * ((d/ad) / (1 - s/as)) - * = if d = 0 - * 0 - * elif as * d >= ad * (as - s) - * ad * as - * else - * as * (as * d / (as - s)) - * - */ -static inline uint32_t -blend_color_dodge (uint32_t d, uint32_t ad, uint32_t s, uint32_t as) -{ - if (d == 0) - return 0; - else if (as * d >= ad * (as - s)) - return DIV_ONE_UN8 (as * ad); - else if (as - s == 0) - return DIV_ONE_UN8 (as * ad); - else - return DIV_ONE_UN8 (as * ((d * as) / ((as - s)))); -} - -PDF_SEPARABLE_BLEND_MODE (color_dodge) - -/* - * Color burn - * - * We modify the first clause "if d = 1" to "if d >= 1" since with - * premultiplied colors d > 1 can actually happen. - * - * ad * as * B(d/ad, s/as) - * = if d/ad >= 1 - * ad * as * 1 - * elif (1 - d/ad) >= s/as - * ad * as * 0 - * else - * ad * as * (1 - ((1 - d/ad) / (s/as))) - * = if d >= ad - * ad * as - * elif as * ad - as * d >= ad * s - * 0 - * else - * ad * as - as * as * (ad - d) / s - */ -static inline uint32_t -blend_color_burn (uint32_t d, uint32_t ad, uint32_t s, uint32_t as) -{ - if (d >= ad) - return DIV_ONE_UN8 (ad * as); - else if (as * ad - as * d >= ad * s) - return 0; - else if (s == 0) - return 0; - else - return DIV_ONE_UN8 (ad * as - (as * as * (ad - d)) / s); -} - -PDF_SEPARABLE_BLEND_MODE (color_burn) - -/* - * Hard light - * - * ad * as * B(d/ad, s/as) - * = if (s/as <= 0.5) - * ad * as * Multiply (d/ad, 2 * s/as) - * else - * ad * as * Screen (d/ad, 2 * s/as - 1) - * = if 2 * s <= as - * ad * as * d/ad * 2 * s / as - * else - * ad * as * (d/ad + (2 * s/as - 1) + d/ad * (2 * s/as - 1)) - * = if 2 * s <= as - * 2 * s * d - * else - * as * ad - 2 * (ad - d) * (as - s) - */ -static inline uint32_t -blend_hard_light (uint32_t d, uint32_t ad, uint32_t s, uint32_t as) -{ - if (2 * s < as) - return DIV_ONE_UN8 (2 * s * d); - else - return DIV_ONE_UN8 (as * ad - 2 * (ad - d) * (as - s)); -} - -PDF_SEPARABLE_BLEND_MODE (hard_light) - -/* - * Soft light - * - * ad * as * B(d/ad, s/as) - * = if (s/as <= 0.5) - * ad * as * (d/ad - (1 - 2 * s/as) * d/ad * (1 - d/ad)) - * else if (d/ad <= 0.25) - * ad * as * (d/ad + (2 * s/as - 1) * ((((16 * d/ad - 12) * d/ad + 4) * d/ad) - d/ad)) - * else - * ad * as * (d/ad + (2 * s/as - 1) * sqrt (d/ad)) - * = if (2 * s <= as) - * d * as - d * (ad - d) * (as - 2 * s) / ad; - * else if (4 * d <= ad) - * (2 * s - as) * d * ((16 * d / ad - 12) * d / ad + 3); - * else - * d * as + (sqrt (d * ad) - d) * (2 * s - as); - */ -static inline uint32_t -blend_soft_light (uint32_t d_org, - uint32_t ad_org, - uint32_t s_org, - uint32_t as_org) -{ - double d = d_org * (1.0 / MASK); - double ad = ad_org * (1.0 / MASK); - double s = s_org * (1.0 / MASK); - double as = as_org * (1.0 / MASK); - double r; - - if (2 * s < as) - { - if (ad == 0) - r = d * as; - else - r = d * as - d * (ad - d) * (as - 2 * s) / ad; - } - else if (ad == 0) - { - r = 0; - } - else if (4 * d <= ad) - { - r = d * as + - (2 * s - as) * d * ((16 * d / ad - 12) * d / ad + 3); - } - else - { - r = d * as + (sqrt (d * ad) - d) * (2 * s - as); - } - return r * MASK + 0.5; -} - -PDF_SEPARABLE_BLEND_MODE (soft_light) - -/* - * Difference - * - * ad * as * B(s/as, d/ad) - * = ad * as * abs (s/as - d/ad) - * = if (s/as <= d/ad) - * ad * as * (d/ad - s/as) - * else - * ad * as * (s/as - d/ad) - * = if (ad * s <= as * d) - * as * d - ad * s - * else - * ad * s - as * d - */ -static inline uint32_t -blend_difference (uint32_t d, uint32_t ad, uint32_t s, uint32_t as) -{ - uint32_t das = d * as; - uint32_t sad = s * ad; - - if (sad < das) - return DIV_ONE_UN8 (das - sad); - else - return DIV_ONE_UN8 (sad - das); -} - -PDF_SEPARABLE_BLEND_MODE (difference) - -/* - * Exclusion - * - * ad * as * B(s/as, d/ad) - * = ad * as * (d/ad + s/as - 2 * d/ad * s/as) - * = as * d + ad * s - 2 * s * d - */ - -/* This can be made faster by writing it directly and not using - * PDF_SEPARABLE_BLEND_MODE, but that's a performance optimization */ - -static inline uint32_t -blend_exclusion (uint32_t d, uint32_t ad, uint32_t s, uint32_t as) -{ - return DIV_ONE_UN8 (s * ad + d * as - 2 * d * s); -} - -PDF_SEPARABLE_BLEND_MODE (exclusion) - -#undef PDF_SEPARABLE_BLEND_MODE - -/* - * PDF nonseperable blend modes are implemented using the following functions - * to operate in Hsl space, with Cmax, Cmid, Cmin referring to the max, mid - * and min value of the red, green and blue components. - * - * LUM (C) = 0.3 × Cred + 0.59 × Cgreen + 0.11 × Cblue - * - * clip_color (C): - * l = LUM (C) - * min = Cmin - * max = Cmax - * if n < 0.0 - * C = l + (((C – l) × l) ⁄ (l – min)) - * if x > 1.0 - * C = l + (((C – l) × (1 – l) ) ⁄ (max – l)) - * return C - * - * set_lum (C, l): - * d = l – LUM (C) - * C += d - * return clip_color (C) - * - * SAT (C) = CH_MAX (C) - CH_MIN (C) - * - * set_sat (C, s): - * if Cmax > Cmin - * Cmid = ( ( ( Cmid – Cmin ) × s ) ⁄ ( Cmax – Cmin ) ) - * Cmax = s - * else - * Cmid = Cmax = 0.0 - * Cmin = 0.0 - * return C - */ - -/* For premultiplied colors, we need to know what happens when C is - * multiplied by a real number. LUM and SAT are linear: - * - * LUM (r × C) = r × LUM (C) SAT (r * C) = r * SAT (C) - * - * If we extend clip_color with an extra argument a and change - * - * if x >= 1.0 - * - * into - * - * if x >= a - * - * then clip_color is also linear: - * - * r * clip_color (C, a) = clip_color (r * C, r * a); - * - * for positive r. - * - * Similarly, we can extend set_lum with an extra argument that is just passed - * on to clip_color: - * - * r * set_lum (C, l, a) - * - * = r × clip_color (C + l - LUM (C), a) - * - * = clip_color (r * C + r × l - r * LUM (C), r * a) - * - * = set_lum (r * C, r * l, r * a) - * - * Finally, set_sat: - * - * r * set_sat (C, s) = set_sat (x * C, r * s) - * - * The above holds for all non-zero x, because the x'es in the fraction for - * C_mid cancel out. Specifically, it holds for x = r: - * - * r * set_sat (C, s) = set_sat (r * C, r * s) - * - */ - -#define CH_MIN(c) (c[0] < c[1] ? (c[0] < c[2] ? c[0] : c[2]) : (c[1] < c[2] ? c[1] : c[2])) -#define CH_MAX(c) (c[0] > c[1] ? (c[0] > c[2] ? c[0] : c[2]) : (c[1] > c[2] ? c[1] : c[2])) -#define LUM(c) ((c[0] * 30 + c[1] * 59 + c[2] * 11) / 100) -#define SAT(c) (CH_MAX (c) - CH_MIN (c)) - -#define PDF_NON_SEPARABLE_BLEND_MODE(name) \ - static void \ - combine_ ## name ## _u (pixman_implementation_t *imp, \ - pixman_op_t op, \ - uint32_t * dest, \ - const uint32_t * src, \ - const uint32_t * mask, \ - int width) \ - { \ - int i; \ - for (i = 0; i < width; ++i) \ - { \ - uint32_t s = combine_mask (src, mask, i); \ - uint32_t d = *(dest + i); \ - uint8_t sa = ALPHA_8 (s); \ - uint8_t isa = ~sa; \ - uint8_t da = ALPHA_8 (d); \ - uint8_t ida = ~da; \ - uint32_t result; \ - uint32_t sc[3], dc[3], c[3]; \ - \ - result = d; \ - UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (result, isa, s, ida); \ - dc[0] = RED_8 (d); \ - sc[0] = RED_8 (s); \ - dc[1] = GREEN_8 (d); \ - sc[1] = GREEN_8 (s); \ - dc[2] = BLUE_8 (d); \ - sc[2] = BLUE_8 (s); \ - blend_ ## name (c, dc, da, sc, sa); \ - \ - *(dest + i) = result + \ - (DIV_ONE_UN8 (sa * (uint32_t)da) << A_SHIFT) + \ - (DIV_ONE_UN8 (c[0]) << R_SHIFT) + \ - (DIV_ONE_UN8 (c[1]) << G_SHIFT) + \ - (DIV_ONE_UN8 (c[2])); \ - } \ - } - -static void -set_lum (uint32_t dest[3], uint32_t src[3], uint32_t sa, uint32_t lum) -{ - double a, l, min, max; - double tmp[3]; - - a = sa * (1.0 / MASK); - - l = lum * (1.0 / MASK); - tmp[0] = src[0] * (1.0 / MASK); - tmp[1] = src[1] * (1.0 / MASK); - tmp[2] = src[2] * (1.0 / MASK); - - l = l - LUM (tmp); - tmp[0] += l; - tmp[1] += l; - tmp[2] += l; - - /* clip_color */ - l = LUM (tmp); - min = CH_MIN (tmp); - max = CH_MAX (tmp); - - if (min < 0) - { - 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) - { - 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; - dest[1] = tmp[1] * MASK + 0.5; - dest[2] = tmp[2] * MASK + 0.5; -} - -static void -set_sat (uint32_t dest[3], uint32_t src[3], uint32_t sat) -{ - int id[3]; - uint32_t min, max; - - if (src[0] > src[1]) - { - if (src[0] > src[2]) - { - id[0] = 0; - if (src[1] > src[2]) - { - id[1] = 1; - id[2] = 2; - } - else - { - id[1] = 2; - id[2] = 1; - } - } - else - { - id[0] = 2; - id[1] = 0; - id[2] = 1; - } - } - else - { - if (src[0] > src[2]) - { - id[0] = 1; - id[1] = 0; - id[2] = 2; - } - else - { - id[2] = 0; - if (src[1] > src[2]) - { - id[0] = 1; - id[1] = 2; - } - else - { - id[0] = 2; - id[1] = 1; - } - } - } - - max = dest[id[0]]; - min = dest[id[2]]; - if (max > min) - { - dest[id[1]] = (dest[id[1]] - min) * sat / (max - min); - dest[id[0]] = sat; - dest[id[2]] = 0; - } - else - { - dest[0] = dest[1] = dest[2] = 0; - } -} - -/* Hue: - * - * as * ad * B(s/as, d/as) - * = as * ad * set_lum (set_sat (s/as, SAT (d/ad)), LUM (d/ad), 1) - * = set_lum (set_sat (ad * s, as * SAT (d)), as * LUM (d), as * ad) - * - */ -static inline void -blend_hsl_hue (uint32_t r[3], - uint32_t d[3], - uint32_t ad, - uint32_t s[3], - uint32_t as) -{ - r[0] = s[0] * ad; - r[1] = s[1] * ad; - r[2] = s[2] * ad; - set_sat (r, r, SAT (d) * as); - set_lum (r, r, as * ad, LUM (d) * as); -} - -PDF_NON_SEPARABLE_BLEND_MODE (hsl_hue) - -/* - * Saturation - * - * as * ad * B(s/as, d/ad) - * = as * ad * set_lum (set_sat (d/ad, SAT (s/as)), LUM (d/ad), 1) - * = set_lum (as * ad * set_sat (d/ad, SAT (s/as)), - * as * LUM (d), as * ad) - * = set_lum (set_sat (as * d, ad * SAT (s), as * LUM (d), as * ad)) - */ -static inline void -blend_hsl_saturation (uint32_t r[3], - uint32_t d[3], - uint32_t ad, - uint32_t s[3], - uint32_t as) -{ - r[0] = d[0] * as; - r[1] = d[1] * as; - r[2] = d[2] * as; - set_sat (r, r, SAT (s) * ad); - set_lum (r, r, as * ad, LUM (d) * as); -} - -PDF_NON_SEPARABLE_BLEND_MODE (hsl_saturation) - -/* - * Color - * - * as * ad * B(s/as, d/as) - * = as * ad * set_lum (s/as, LUM (d/ad), 1) - * = set_lum (s * ad, as * LUM (d), as * ad) - */ -static inline void -blend_hsl_color (uint32_t r[3], - uint32_t d[3], - uint32_t ad, - uint32_t s[3], - uint32_t as) -{ - r[0] = s[0] * ad; - r[1] = s[1] * ad; - r[2] = s[2] * ad; - set_lum (r, r, as * ad, LUM (d) * as); -} - -PDF_NON_SEPARABLE_BLEND_MODE (hsl_color) - -/* - * Luminosity - * - * as * ad * B(s/as, d/ad) - * = as * ad * set_lum (d/ad, LUM (s/as), 1) - * = set_lum (as * d, ad * LUM (s), as * ad) - */ -static inline void -blend_hsl_luminosity (uint32_t r[3], - uint32_t d[3], - uint32_t ad, - uint32_t s[3], - uint32_t as) -{ - r[0] = d[0] * as; - r[1] = d[1] * as; - r[2] = d[2] * as; - set_lum (r, r, as * ad, LUM (s) * ad); -} - -PDF_NON_SEPARABLE_BLEND_MODE (hsl_luminosity) - -#undef SAT -#undef LUM -#undef CH_MAX -#undef CH_MIN -#undef PDF_NON_SEPARABLE_BLEND_MODE - -/* All of the disjoint/conjoint composing functions - * - * The four entries in the first column indicate what source contributions - * come from each of the four areas of the picture -- areas covered by neither - * A nor B, areas covered only by A, areas covered only by B and finally - * areas covered by both A and B. - * - * Disjoint Conjoint - * Fa Fb Fa Fb - * (0,0,0,0) 0 0 0 0 - * (0,A,0,A) 1 0 1 0 - * (0,0,B,B) 0 1 0 1 - * (0,A,B,A) 1 min((1-a)/b,1) 1 max(1-a/b,0) - * (0,A,B,B) min((1-b)/a,1) 1 max(1-b/a,0) 1 - * (0,0,0,A) max(1-(1-b)/a,0) 0 min(1,b/a) 0 - * (0,0,0,B) 0 max(1-(1-a)/b,0) 0 min(a/b,1) - * (0,A,0,0) min(1,(1-b)/a) 0 max(1-b/a,0) 0 - * (0,0,B,0) 0 min(1,(1-a)/b) 0 max(1-a/b,0) - * (0,0,B,A) max(1-(1-b)/a,0) min(1,(1-a)/b) min(1,b/a) max(1-a/b,0) - * (0,A,0,B) min(1,(1-b)/a) max(1-(1-a)/b,0) max(1-b/a,0) min(1,a/b) - * (0,A,B,0) min(1,(1-b)/a) min(1,(1-a)/b) max(1-b/a,0) max(1-a/b,0) - * - * See http://marc.info/?l=xfree-render&m=99792000027857&w=2 for more - * information about these operators. - */ - -#define COMBINE_A_OUT 1 -#define COMBINE_A_IN 2 -#define COMBINE_B_OUT 4 -#define COMBINE_B_IN 8 - -#define COMBINE_CLEAR 0 -#define COMBINE_A (COMBINE_A_OUT | COMBINE_A_IN) -#define COMBINE_B (COMBINE_B_OUT | COMBINE_B_IN) -#define COMBINE_A_OVER (COMBINE_A_OUT | COMBINE_B_OUT | COMBINE_A_IN) -#define COMBINE_B_OVER (COMBINE_A_OUT | COMBINE_B_OUT | COMBINE_B_IN) -#define COMBINE_A_ATOP (COMBINE_B_OUT | COMBINE_A_IN) -#define COMBINE_B_ATOP (COMBINE_A_OUT | COMBINE_B_IN) -#define COMBINE_XOR (COMBINE_A_OUT | COMBINE_B_OUT) - -/* portion covered by a but not b */ -static uint8_t -combine_disjoint_out_part (uint8_t a, uint8_t b) -{ - /* min (1, (1-b) / a) */ - - b = ~b; /* 1 - b */ - if (b >= a) /* 1 - b >= a -> (1-b)/a >= 1 */ - return MASK; /* 1 */ - return DIV_UN8 (b, a); /* (1-b) / a */ -} - -/* portion covered by both a and b */ -static uint8_t -combine_disjoint_in_part (uint8_t a, uint8_t b) -{ - /* max (1-(1-b)/a,0) */ - /* = - min ((1-b)/a - 1, 0) */ - /* = 1 - min (1, (1-b)/a) */ - - b = ~b; /* 1 - b */ - if (b >= a) /* 1 - b >= a -> (1-b)/a >= 1 */ - return 0; /* 1 - 1 */ - return ~DIV_UN8(b, a); /* 1 - (1-b) / a */ -} - -/* portion covered by a but not b */ -static uint8_t -combine_conjoint_out_part (uint8_t a, uint8_t b) -{ - /* max (1-b/a,0) */ - /* = 1-min(b/a,1) */ - - /* min (1, (1-b) / a) */ - - if (b >= a) /* b >= a -> b/a >= 1 */ - return 0x00; /* 0 */ - return ~DIV_UN8(b, a); /* 1 - b/a */ -} - -/* portion covered by both a and b */ -static uint8_t -combine_conjoint_in_part (uint8_t a, uint8_t b) -{ - /* min (1,b/a) */ - - if (b >= a) /* b >= a -> b/a >= 1 */ - return MASK; /* 1 */ - return DIV_UN8 (b, a); /* b/a */ -} - -#define GET_COMP(v, i) ((uint16_t) (uint8_t) ((v) >> i)) - -#define ADD(x, y, i, t) \ - ((t) = GET_COMP (x, i) + GET_COMP (y, i), \ - (uint32_t) ((uint8_t) ((t) | (0 - ((t) >> G_SHIFT)))) << (i)) - -#define GENERIC(x, y, i, ax, ay, t, u, v) \ - ((t) = (MUL_UN8 (GET_COMP (y, i), ay, (u)) + \ - MUL_UN8 (GET_COMP (x, i), ax, (v))), \ - (uint32_t) ((uint8_t) ((t) | \ - (0 - ((t) >> G_SHIFT)))) << (i)) - -static void -combine_disjoint_general_u (uint32_t * dest, - const uint32_t *src, - const uint32_t *mask, - int width, - uint8_t combine) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t m, n, o, p; - uint16_t Fa, Fb, t, u, v; - uint8_t sa = s >> A_SHIFT; - uint8_t da = d >> A_SHIFT; - - switch (combine & COMBINE_A) - { - default: - Fa = 0; - break; - - case COMBINE_A_OUT: - Fa = combine_disjoint_out_part (sa, da); - break; - - case COMBINE_A_IN: - Fa = combine_disjoint_in_part (sa, da); - break; - - case COMBINE_A: - Fa = MASK; - break; - } - - switch (combine & COMBINE_B) - { - default: - Fb = 0; - break; - - case COMBINE_B_OUT: - Fb = combine_disjoint_out_part (da, sa); - break; - - case COMBINE_B_IN: - Fb = combine_disjoint_in_part (da, sa); - break; - - case COMBINE_B: - Fb = MASK; - break; - } - m = GENERIC (s, d, 0, Fa, Fb, t, u, v); - n = GENERIC (s, d, G_SHIFT, Fa, Fb, t, u, v); - o = GENERIC (s, d, R_SHIFT, Fa, Fb, t, u, v); - p = GENERIC (s, d, A_SHIFT, Fa, Fb, t, u, v); - s = m | n | o | p; - *(dest + i) = s; - } -} - -static void -combine_disjoint_over_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint16_t a = s >> A_SHIFT; - - if (s != 0x00) - { - uint32_t d = *(dest + i); - a = combine_disjoint_out_part (d >> A_SHIFT, a); - UN8x4_MUL_UN8_ADD_UN8x4 (d, a, s); - - *(dest + i) = d; - } - } -} - -static void -combine_disjoint_in_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_u (dest, src, mask, width, COMBINE_A_IN); -} - -static void -combine_disjoint_in_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_u (dest, src, mask, width, COMBINE_B_IN); -} - -static void -combine_disjoint_out_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_u (dest, src, mask, width, COMBINE_A_OUT); -} - -static void -combine_disjoint_out_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_u (dest, src, mask, width, COMBINE_B_OUT); -} - -static void -combine_disjoint_atop_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_u (dest, src, mask, width, COMBINE_A_ATOP); -} - -static void -combine_disjoint_atop_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_u (dest, src, mask, width, COMBINE_B_ATOP); -} - -static void -combine_disjoint_xor_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_u (dest, src, mask, width, COMBINE_XOR); -} - -static void -combine_conjoint_general_u (uint32_t * dest, - const uint32_t *src, - const uint32_t *mask, - int width, - uint8_t combine) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t m, n, o, p; - uint16_t Fa, Fb, t, u, v; - uint8_t sa = s >> A_SHIFT; - uint8_t da = d >> A_SHIFT; - - switch (combine & COMBINE_A) - { - default: - Fa = 0; - break; - - case COMBINE_A_OUT: - Fa = combine_conjoint_out_part (sa, da); - break; - - case COMBINE_A_IN: - Fa = combine_conjoint_in_part (sa, da); - break; - - case COMBINE_A: - Fa = MASK; - break; - } - - switch (combine & COMBINE_B) - { - default: - Fb = 0; - break; - - case COMBINE_B_OUT: - Fb = combine_conjoint_out_part (da, sa); - break; - - case COMBINE_B_IN: - Fb = combine_conjoint_in_part (da, sa); - break; - - case COMBINE_B: - Fb = MASK; - break; - } - - m = GENERIC (s, d, 0, Fa, Fb, t, u, v); - n = GENERIC (s, d, G_SHIFT, Fa, Fb, t, u, v); - o = GENERIC (s, d, R_SHIFT, Fa, Fb, t, u, v); - p = GENERIC (s, d, A_SHIFT, Fa, Fb, t, u, v); - - s = m | n | o | p; - - *(dest + i) = s; - } -} - -static void -combine_conjoint_over_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_u (dest, src, mask, width, COMBINE_A_OVER); -} - -static void -combine_conjoint_over_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_u (dest, src, mask, width, COMBINE_B_OVER); -} - -static void -combine_conjoint_in_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_u (dest, src, mask, width, COMBINE_A_IN); -} - -static void -combine_conjoint_in_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_u (dest, src, mask, width, COMBINE_B_IN); -} - -static void -combine_conjoint_out_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_u (dest, src, mask, width, COMBINE_A_OUT); -} - -static void -combine_conjoint_out_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_u (dest, src, mask, width, COMBINE_B_OUT); -} - -static void -combine_conjoint_atop_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_u (dest, src, mask, width, COMBINE_A_ATOP); -} - -static void -combine_conjoint_atop_reverse_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_u (dest, src, mask, width, COMBINE_B_ATOP); -} - -static void -combine_conjoint_xor_u (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_u (dest, src, mask, width, COMBINE_XOR); -} - - -/* Component alpha combiners */ - -static void -combine_clear_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - memset (dest, 0, width * sizeof(uint32_t)); -} - -static void -combine_src_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = *(src + i); - uint32_t m = *(mask + i); - - combine_mask_value_ca (&s, &m); - - *(dest + i) = s; - } -} - -static void -combine_over_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = *(src + i); - uint32_t m = *(mask + i); - uint32_t a; - - combine_mask_ca (&s, &m); - - a = ~m; - if (a) - { - uint32_t d = *(dest + i); - UN8x4_MUL_UN8x4_ADD_UN8x4 (d, a, s); - s = d; - } - - *(dest + i) = s; - } -} - -static void -combine_over_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t d = *(dest + i); - uint32_t a = ~d >> A_SHIFT; - - if (a) - { - uint32_t s = *(src + i); - uint32_t m = *(mask + i); - - UN8x4_MUL_UN8x4 (s, m); - UN8x4_MUL_UN8_ADD_UN8x4 (s, a, d); - - *(dest + i) = s; - } - } -} - -static void -combine_in_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t d = *(dest + i); - uint16_t a = d >> A_SHIFT; - uint32_t s = 0; - - if (a) - { - uint32_t m = *(mask + i); - - s = *(src + i); - combine_mask_value_ca (&s, &m); - - if (a != MASK) - UN8x4_MUL_UN8 (s, a); - } - - *(dest + i) = s; - } -} - -static void -combine_in_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = *(src + i); - uint32_t m = *(mask + i); - uint32_t a; - - combine_mask_alpha_ca (&s, &m); - - a = m; - if (a != ~0) - { - uint32_t d = 0; - - if (a) - { - d = *(dest + i); - UN8x4_MUL_UN8x4 (d, a); - } - - *(dest + i) = d; - } - } -} - -static void -combine_out_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t d = *(dest + i); - uint16_t a = ~d >> A_SHIFT; - uint32_t s = 0; - - if (a) - { - uint32_t m = *(mask + i); - - s = *(src + i); - combine_mask_value_ca (&s, &m); - - if (a != MASK) - UN8x4_MUL_UN8 (s, a); - } - - *(dest + i) = s; - } -} - -static void -combine_out_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = *(src + i); - uint32_t m = *(mask + i); - uint32_t a; - - combine_mask_alpha_ca (&s, &m); - - a = ~m; - if (a != ~0) - { - uint32_t d = 0; - - if (a) - { - d = *(dest + i); - UN8x4_MUL_UN8x4 (d, a); - } - - *(dest + i) = d; - } - } -} - -static void -combine_atop_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t d = *(dest + i); - uint32_t s = *(src + i); - uint32_t m = *(mask + i); - uint32_t ad; - uint16_t as = d >> A_SHIFT; - - combine_mask_ca (&s, &m); - - ad = ~m; - - UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ad, s, as); - - *(dest + i) = d; - } -} - -static void -combine_atop_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t d = *(dest + i); - uint32_t s = *(src + i); - uint32_t m = *(mask + i); - uint32_t ad; - uint16_t as = ~d >> A_SHIFT; - - combine_mask_ca (&s, &m); - - ad = m; - - UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ad, s, as); - - *(dest + i) = d; - } -} - -static void -combine_xor_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t d = *(dest + i); - uint32_t s = *(src + i); - uint32_t m = *(mask + i); - uint32_t ad; - uint16_t as = ~d >> A_SHIFT; - - combine_mask_ca (&s, &m); - - ad = ~m; - - UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ad, s, as); - - *(dest + i) = d; - } -} - -static void -combine_add_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s = *(src + i); - uint32_t m = *(mask + i); - uint32_t d = *(dest + i); - - combine_mask_value_ca (&s, &m); - - UN8x4_ADD_UN8x4 (d, s); - - *(dest + i) = d; - } -} - -static void -combine_saturate_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s, d; - uint16_t sa, sr, sg, sb, da; - uint16_t t, u, v; - uint32_t m, n, o, p; - - d = *(dest + i); - s = *(src + i); - m = *(mask + i); - - combine_mask_ca (&s, &m); - - sa = (m >> A_SHIFT); - sr = (m >> R_SHIFT) & MASK; - sg = (m >> G_SHIFT) & MASK; - sb = m & MASK; - da = ~d >> A_SHIFT; - - if (sb <= da) - m = ADD (s, d, 0, t); - else - m = GENERIC (s, d, 0, (da << G_SHIFT) / sb, MASK, t, u, v); - - if (sg <= da) - n = ADD (s, d, G_SHIFT, t); - else - n = GENERIC (s, d, G_SHIFT, (da << G_SHIFT) / sg, MASK, t, u, v); - - if (sr <= da) - o = ADD (s, d, R_SHIFT, t); - else - o = GENERIC (s, d, R_SHIFT, (da << G_SHIFT) / sr, MASK, t, u, v); - - if (sa <= da) - p = ADD (s, d, A_SHIFT, t); - else - p = GENERIC (s, d, A_SHIFT, (da << G_SHIFT) / sa, MASK, t, u, v); - - *(dest + i) = m | n | o | p; - } -} - -static void -combine_disjoint_general_ca (uint32_t * dest, - const uint32_t *src, - const uint32_t *mask, - int width, - uint8_t combine) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s, d; - uint32_t m, n, o, p; - uint32_t Fa, Fb; - uint16_t t, u, v; - uint32_t sa; - uint8_t da; - - s = *(src + i); - m = *(mask + i); - d = *(dest + i); - da = d >> A_SHIFT; - - combine_mask_ca (&s, &m); - - sa = m; - - switch (combine & COMBINE_A) - { - default: - Fa = 0; - break; - - case COMBINE_A_OUT: - m = (uint32_t)combine_disjoint_out_part ((uint8_t) (sa >> 0), da); - n = (uint32_t)combine_disjoint_out_part ((uint8_t) (sa >> G_SHIFT), da) << G_SHIFT; - o = (uint32_t)combine_disjoint_out_part ((uint8_t) (sa >> R_SHIFT), da) << R_SHIFT; - p = (uint32_t)combine_disjoint_out_part ((uint8_t) (sa >> A_SHIFT), da) << A_SHIFT; - Fa = m | n | o | p; - break; - - case COMBINE_A_IN: - m = (uint32_t)combine_disjoint_in_part ((uint8_t) (sa >> 0), da); - n = (uint32_t)combine_disjoint_in_part ((uint8_t) (sa >> G_SHIFT), da) << G_SHIFT; - o = (uint32_t)combine_disjoint_in_part ((uint8_t) (sa >> R_SHIFT), da) << R_SHIFT; - p = (uint32_t)combine_disjoint_in_part ((uint8_t) (sa >> A_SHIFT), da) << A_SHIFT; - Fa = m | n | o | p; - break; - - case COMBINE_A: - Fa = ~0; - break; - } - - switch (combine & COMBINE_B) - { - default: - Fb = 0; - break; - - case COMBINE_B_OUT: - m = (uint32_t)combine_disjoint_out_part (da, (uint8_t) (sa >> 0)); - n = (uint32_t)combine_disjoint_out_part (da, (uint8_t) (sa >> G_SHIFT)) << G_SHIFT; - o = (uint32_t)combine_disjoint_out_part (da, (uint8_t) (sa >> R_SHIFT)) << R_SHIFT; - p = (uint32_t)combine_disjoint_out_part (da, (uint8_t) (sa >> A_SHIFT)) << A_SHIFT; - Fb = m | n | o | p; - break; - - case COMBINE_B_IN: - m = (uint32_t)combine_disjoint_in_part (da, (uint8_t) (sa >> 0)); - n = (uint32_t)combine_disjoint_in_part (da, (uint8_t) (sa >> G_SHIFT)) << G_SHIFT; - o = (uint32_t)combine_disjoint_in_part (da, (uint8_t) (sa >> R_SHIFT)) << R_SHIFT; - p = (uint32_t)combine_disjoint_in_part (da, (uint8_t) (sa >> A_SHIFT)) << A_SHIFT; - Fb = m | n | o | p; - break; - - case COMBINE_B: - Fb = ~0; - break; - } - m = GENERIC (s, d, 0, GET_COMP (Fa, 0), GET_COMP (Fb, 0), t, u, v); - n = GENERIC (s, d, G_SHIFT, GET_COMP (Fa, G_SHIFT), GET_COMP (Fb, G_SHIFT), t, u, v); - o = GENERIC (s, d, R_SHIFT, GET_COMP (Fa, R_SHIFT), GET_COMP (Fb, R_SHIFT), t, u, v); - p = GENERIC (s, d, A_SHIFT, GET_COMP (Fa, A_SHIFT), GET_COMP (Fb, A_SHIFT), t, u, v); - - s = m | n | o | p; - - *(dest + i) = s; - } -} - -static void -combine_disjoint_over_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_ca (dest, src, mask, width, COMBINE_A_OVER); -} - -static void -combine_disjoint_in_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_ca (dest, src, mask, width, COMBINE_A_IN); -} - -static void -combine_disjoint_in_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_ca (dest, src, mask, width, COMBINE_B_IN); -} - -static void -combine_disjoint_out_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_ca (dest, src, mask, width, COMBINE_A_OUT); -} - -static void -combine_disjoint_out_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_ca (dest, src, mask, width, COMBINE_B_OUT); -} - -static void -combine_disjoint_atop_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_ca (dest, src, mask, width, COMBINE_A_ATOP); -} - -static void -combine_disjoint_atop_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_ca (dest, src, mask, width, COMBINE_B_ATOP); -} - -static void -combine_disjoint_xor_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_disjoint_general_ca (dest, src, mask, width, COMBINE_XOR); -} - -static void -combine_conjoint_general_ca (uint32_t * dest, - const uint32_t *src, - const uint32_t *mask, - int width, - uint8_t combine) -{ - int i; - - for (i = 0; i < width; ++i) - { - uint32_t s, d; - uint32_t m, n, o, p; - uint32_t Fa, Fb; - uint16_t t, u, v; - uint32_t sa; - uint8_t da; - - s = *(src + i); - m = *(mask + i); - d = *(dest + i); - da = d >> A_SHIFT; - - combine_mask_ca (&s, &m); - - sa = m; - - switch (combine & COMBINE_A) - { - default: - Fa = 0; - break; - - case COMBINE_A_OUT: - m = (uint32_t)combine_conjoint_out_part ((uint8_t) (sa >> 0), da); - n = (uint32_t)combine_conjoint_out_part ((uint8_t) (sa >> G_SHIFT), da) << G_SHIFT; - o = (uint32_t)combine_conjoint_out_part ((uint8_t) (sa >> R_SHIFT), da) << R_SHIFT; - p = (uint32_t)combine_conjoint_out_part ((uint8_t) (sa >> A_SHIFT), da) << A_SHIFT; - Fa = m | n | o | p; - break; - - case COMBINE_A_IN: - m = (uint32_t)combine_conjoint_in_part ((uint8_t) (sa >> 0), da); - n = (uint32_t)combine_conjoint_in_part ((uint8_t) (sa >> G_SHIFT), da) << G_SHIFT; - o = (uint32_t)combine_conjoint_in_part ((uint8_t) (sa >> R_SHIFT), da) << R_SHIFT; - p = (uint32_t)combine_conjoint_in_part ((uint8_t) (sa >> A_SHIFT), da) << A_SHIFT; - Fa = m | n | o | p; - break; - - case COMBINE_A: - Fa = ~0; - break; - } - - switch (combine & COMBINE_B) - { - default: - Fb = 0; - break; - - case COMBINE_B_OUT: - m = (uint32_t)combine_conjoint_out_part (da, (uint8_t) (sa >> 0)); - n = (uint32_t)combine_conjoint_out_part (da, (uint8_t) (sa >> G_SHIFT)) << G_SHIFT; - o = (uint32_t)combine_conjoint_out_part (da, (uint8_t) (sa >> R_SHIFT)) << R_SHIFT; - p = (uint32_t)combine_conjoint_out_part (da, (uint8_t) (sa >> A_SHIFT)) << A_SHIFT; - Fb = m | n | o | p; - break; - - case COMBINE_B_IN: - m = (uint32_t)combine_conjoint_in_part (da, (uint8_t) (sa >> 0)); - n = (uint32_t)combine_conjoint_in_part (da, (uint8_t) (sa >> G_SHIFT)) << G_SHIFT; - o = (uint32_t)combine_conjoint_in_part (da, (uint8_t) (sa >> R_SHIFT)) << R_SHIFT; - p = (uint32_t)combine_conjoint_in_part (da, (uint8_t) (sa >> A_SHIFT)) << A_SHIFT; - Fb = m | n | o | p; - break; - - case COMBINE_B: - Fb = ~0; - break; - } - m = GENERIC (s, d, 0, GET_COMP (Fa, 0), GET_COMP (Fb, 0), t, u, v); - n = GENERIC (s, d, G_SHIFT, GET_COMP (Fa, G_SHIFT), GET_COMP (Fb, G_SHIFT), t, u, v); - o = GENERIC (s, d, R_SHIFT, GET_COMP (Fa, R_SHIFT), GET_COMP (Fb, R_SHIFT), t, u, v); - p = GENERIC (s, d, A_SHIFT, GET_COMP (Fa, A_SHIFT), GET_COMP (Fb, A_SHIFT), t, u, v); - - s = m | n | o | p; - - *(dest + i) = s; - } -} - -static void -combine_conjoint_over_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_ca (dest, src, mask, width, COMBINE_A_OVER); -} - -static void -combine_conjoint_over_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_ca (dest, src, mask, width, COMBINE_B_OVER); -} - -static void -combine_conjoint_in_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_ca (dest, src, mask, width, COMBINE_A_IN); -} - -static void -combine_conjoint_in_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_ca (dest, src, mask, width, COMBINE_B_IN); -} - -static void -combine_conjoint_out_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_ca (dest, src, mask, width, COMBINE_A_OUT); -} - -static void -combine_conjoint_out_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_ca (dest, src, mask, width, COMBINE_B_OUT); -} - -static void -combine_conjoint_atop_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_ca (dest, src, mask, width, COMBINE_A_ATOP); -} - -static void -combine_conjoint_atop_reverse_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_ca (dest, src, mask, width, COMBINE_B_ATOP); -} - -static void -combine_conjoint_xor_ca (pixman_implementation_t *imp, - pixman_op_t op, - uint32_t * dest, - const uint32_t * src, - const uint32_t * mask, - int width) -{ - combine_conjoint_general_ca (dest, src, mask, width, COMBINE_XOR); -} - -void -_pixman_setup_combiner_functions_32 (pixman_implementation_t *imp) -{ - /* Unified alpha */ - imp->combine_32[PIXMAN_OP_CLEAR] = combine_clear; - imp->combine_32[PIXMAN_OP_SRC] = combine_src_u; - imp->combine_32[PIXMAN_OP_DST] = combine_dst; - imp->combine_32[PIXMAN_OP_OVER] = combine_over_u; - imp->combine_32[PIXMAN_OP_OVER_REVERSE] = combine_over_reverse_u; - imp->combine_32[PIXMAN_OP_IN] = combine_in_u; - imp->combine_32[PIXMAN_OP_IN_REVERSE] = combine_in_reverse_u; - imp->combine_32[PIXMAN_OP_OUT] = combine_out_u; - imp->combine_32[PIXMAN_OP_OUT_REVERSE] = combine_out_reverse_u; - imp->combine_32[PIXMAN_OP_ATOP] = combine_atop_u; - imp->combine_32[PIXMAN_OP_ATOP_REVERSE] = combine_atop_reverse_u; - imp->combine_32[PIXMAN_OP_XOR] = combine_xor_u; - imp->combine_32[PIXMAN_OP_ADD] = combine_add_u; - imp->combine_32[PIXMAN_OP_SATURATE] = combine_saturate_u; - - /* Disjoint, unified */ - imp->combine_32[PIXMAN_OP_DISJOINT_CLEAR] = combine_clear; - imp->combine_32[PIXMAN_OP_DISJOINT_SRC] = combine_src_u; - imp->combine_32[PIXMAN_OP_DISJOINT_DST] = combine_dst; - imp->combine_32[PIXMAN_OP_DISJOINT_OVER] = combine_disjoint_over_u; - imp->combine_32[PIXMAN_OP_DISJOINT_OVER_REVERSE] = combine_saturate_u; - imp->combine_32[PIXMAN_OP_DISJOINT_IN] = combine_disjoint_in_u; - imp->combine_32[PIXMAN_OP_DISJOINT_IN_REVERSE] = combine_disjoint_in_reverse_u; - imp->combine_32[PIXMAN_OP_DISJOINT_OUT] = combine_disjoint_out_u; - imp->combine_32[PIXMAN_OP_DISJOINT_OUT_REVERSE] = combine_disjoint_out_reverse_u; - imp->combine_32[PIXMAN_OP_DISJOINT_ATOP] = combine_disjoint_atop_u; - imp->combine_32[PIXMAN_OP_DISJOINT_ATOP_REVERSE] = combine_disjoint_atop_reverse_u; - imp->combine_32[PIXMAN_OP_DISJOINT_XOR] = combine_disjoint_xor_u; - - /* Conjoint, unified */ - imp->combine_32[PIXMAN_OP_CONJOINT_CLEAR] = combine_clear; - imp->combine_32[PIXMAN_OP_CONJOINT_SRC] = combine_src_u; - imp->combine_32[PIXMAN_OP_CONJOINT_DST] = combine_dst; - imp->combine_32[PIXMAN_OP_CONJOINT_OVER] = combine_conjoint_over_u; - imp->combine_32[PIXMAN_OP_CONJOINT_OVER_REVERSE] = combine_conjoint_over_reverse_u; - imp->combine_32[PIXMAN_OP_CONJOINT_IN] = combine_conjoint_in_u; - imp->combine_32[PIXMAN_OP_CONJOINT_IN_REVERSE] = combine_conjoint_in_reverse_u; - imp->combine_32[PIXMAN_OP_CONJOINT_OUT] = combine_conjoint_out_u; - imp->combine_32[PIXMAN_OP_CONJOINT_OUT_REVERSE] = combine_conjoint_out_reverse_u; - imp->combine_32[PIXMAN_OP_CONJOINT_ATOP] = combine_conjoint_atop_u; - imp->combine_32[PIXMAN_OP_CONJOINT_ATOP_REVERSE] = combine_conjoint_atop_reverse_u; - imp->combine_32[PIXMAN_OP_CONJOINT_XOR] = combine_conjoint_xor_u; - - imp->combine_32[PIXMAN_OP_MULTIPLY] = combine_multiply_u; - imp->combine_32[PIXMAN_OP_SCREEN] = combine_screen_u; - imp->combine_32[PIXMAN_OP_OVERLAY] = combine_overlay_u; - imp->combine_32[PIXMAN_OP_DARKEN] = combine_darken_u; - imp->combine_32[PIXMAN_OP_LIGHTEN] = combine_lighten_u; - imp->combine_32[PIXMAN_OP_COLOR_DODGE] = combine_color_dodge_u; - imp->combine_32[PIXMAN_OP_COLOR_BURN] = combine_color_burn_u; - imp->combine_32[PIXMAN_OP_HARD_LIGHT] = combine_hard_light_u; - imp->combine_32[PIXMAN_OP_SOFT_LIGHT] = combine_soft_light_u; - imp->combine_32[PIXMAN_OP_DIFFERENCE] = combine_difference_u; - imp->combine_32[PIXMAN_OP_EXCLUSION] = combine_exclusion_u; - imp->combine_32[PIXMAN_OP_HSL_HUE] = combine_hsl_hue_u; - imp->combine_32[PIXMAN_OP_HSL_SATURATION] = combine_hsl_saturation_u; - imp->combine_32[PIXMAN_OP_HSL_COLOR] = combine_hsl_color_u; - imp->combine_32[PIXMAN_OP_HSL_LUMINOSITY] = combine_hsl_luminosity_u; - - /* Component alpha combiners */ - imp->combine_32_ca[PIXMAN_OP_CLEAR] = combine_clear_ca; - imp->combine_32_ca[PIXMAN_OP_SRC] = combine_src_ca; - /* dest */ - imp->combine_32_ca[PIXMAN_OP_OVER] = combine_over_ca; - imp->combine_32_ca[PIXMAN_OP_OVER_REVERSE] = combine_over_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_IN] = combine_in_ca; - imp->combine_32_ca[PIXMAN_OP_IN_REVERSE] = combine_in_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_OUT] = combine_out_ca; - imp->combine_32_ca[PIXMAN_OP_OUT_REVERSE] = combine_out_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_ATOP] = combine_atop_ca; - imp->combine_32_ca[PIXMAN_OP_ATOP_REVERSE] = combine_atop_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_XOR] = combine_xor_ca; - imp->combine_32_ca[PIXMAN_OP_ADD] = combine_add_ca; - imp->combine_32_ca[PIXMAN_OP_SATURATE] = combine_saturate_ca; - - /* Disjoint CA */ - imp->combine_32_ca[PIXMAN_OP_DISJOINT_CLEAR] = combine_clear_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_SRC] = combine_src_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_DST] = combine_dst; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_OVER] = combine_disjoint_over_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_OVER_REVERSE] = combine_saturate_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_IN] = combine_disjoint_in_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_IN_REVERSE] = combine_disjoint_in_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_OUT] = combine_disjoint_out_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_OUT_REVERSE] = combine_disjoint_out_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_ATOP] = combine_disjoint_atop_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_ATOP_REVERSE] = combine_disjoint_atop_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_DISJOINT_XOR] = combine_disjoint_xor_ca; - - /* Conjoint CA */ - imp->combine_32_ca[PIXMAN_OP_CONJOINT_CLEAR] = combine_clear_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_SRC] = combine_src_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_DST] = combine_dst; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_OVER] = combine_conjoint_over_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_OVER_REVERSE] = combine_conjoint_over_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_IN] = combine_conjoint_in_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_IN_REVERSE] = combine_conjoint_in_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_OUT] = combine_conjoint_out_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_OUT_REVERSE] = combine_conjoint_out_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_ATOP] = combine_conjoint_atop_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_ATOP_REVERSE] = combine_conjoint_atop_reverse_ca; - imp->combine_32_ca[PIXMAN_OP_CONJOINT_XOR] = combine_conjoint_xor_ca; - - imp->combine_32_ca[PIXMAN_OP_MULTIPLY] = combine_multiply_ca; - imp->combine_32_ca[PIXMAN_OP_SCREEN] = combine_screen_ca; - imp->combine_32_ca[PIXMAN_OP_OVERLAY] = combine_overlay_ca; - imp->combine_32_ca[PIXMAN_OP_DARKEN] = combine_darken_ca; - imp->combine_32_ca[PIXMAN_OP_LIGHTEN] = combine_lighten_ca; - imp->combine_32_ca[PIXMAN_OP_COLOR_DODGE] = combine_color_dodge_ca; - imp->combine_32_ca[PIXMAN_OP_COLOR_BURN] = combine_color_burn_ca; - imp->combine_32_ca[PIXMAN_OP_HARD_LIGHT] = combine_hard_light_ca; - imp->combine_32_ca[PIXMAN_OP_SOFT_LIGHT] = combine_soft_light_ca; - imp->combine_32_ca[PIXMAN_OP_DIFFERENCE] = combine_difference_ca; - imp->combine_32_ca[PIXMAN_OP_EXCLUSION] = combine_exclusion_ca; - - /* It is not clear that these make sense, so make them noops for now */ - imp->combine_32_ca[PIXMAN_OP_HSL_HUE] = combine_dst; - imp->combine_32_ca[PIXMAN_OP_HSL_SATURATION] = combine_dst; - imp->combine_32_ca[PIXMAN_OP_HSL_COLOR] = combine_dst; - imp->combine_32_ca[PIXMAN_OP_HSL_LUMINOSITY] = combine_dst; -} diff --git a/source/libs/pixman/pixman-0.32.8-PATCHES/ChangeLog b/source/libs/pixman/pixman-src-PATCHES/ChangeLog old mode 100755 new mode 100644 similarity index 87% rename from source/libs/pixman/pixman-0.32.8-PATCHES/ChangeLog rename to source/libs/pixman/pixman-src-PATCHES/ChangeLog index d77828604..39dcd76ca --- a/source/libs/pixman/pixman-0.32.8-PATCHES/ChangeLog +++ b/source/libs/pixman/pixman-src-PATCHES/ChangeLog @@ -1,3 +1,8 @@ +2016-02-04 Akira Kakuto <kakuto@fuk.kindai.ac.jp> + + Import pixman-0.34.0. + * patch-01-hide-symbols: Adapted. + 2015-09-26 Peter Breitenlohner <peb@mppmu.mpg.de> Import pixman-0.32.8. diff --git a/source/libs/pixman/pixman-0.32.8-PATCHES/TL-Changes b/source/libs/pixman/pixman-src-PATCHES/TL-Changes old mode 100755 new mode 100644 similarity index 77% rename from source/libs/pixman/pixman-0.32.8-PATCHES/TL-Changes rename to source/libs/pixman/pixman-src-PATCHES/TL-Changes index 9207296fc..7df6c0ac6 --- a/source/libs/pixman/pixman-0.32.8-PATCHES/TL-Changes +++ b/source/libs/pixman/pixman-src-PATCHES/TL-Changes @@ -1,4 +1,4 @@ -Changes applied to the pixman-0.32.6/ tree as obtained from: +Changes applied to the pixman-0.34.0/ tree as obtained from: http://cairographics.org/releases/ Removed: @@ -7,6 +7,7 @@ Removed: config.guess config.sub configure + compile depcomp install-sh ltmain.sh diff --git a/source/libs/pixman/pixman-0.32.8-PATCHES/patch-01-hide-symbols b/source/libs/pixman/pixman-src-PATCHES/patch-01-hide-symbols old mode 100755 new mode 100644 similarity index 55% rename from source/libs/pixman/pixman-0.32.8-PATCHES/patch-01-hide-symbols rename to source/libs/pixman/pixman-src-PATCHES/patch-01-hide-symbols index 088231f47..62cc5f039 --- a/source/libs/pixman/pixman-0.32.8-PATCHES/patch-01-hide-symbols +++ b/source/libs/pixman/pixman-src-PATCHES/patch-01-hide-symbols @@ -1,6 +1,6 @@ -diff -ur pixman-0.32.8.orig/pixman/pixman-compiler.h pixman-0.32.8/pixman/pixman-compiler.h ---- pixman-0.32.8.orig/pixman/pixman-compiler.h 2015-06-30 11:48:31.000000000 +0200 -+++ pixman-0.32.8/pixman/pixman-compiler.h 2015-09-26 18:58:53.409947954 +0200 +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 @@ -91,7 +91,7 @@ /* GCC visibility */ diff --git a/source/libs/pixman/pixman-0.32.8/AUTHORS b/source/libs/pixman/pixman-src/AUTHORS old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/AUTHORS rename to source/libs/pixman/pixman-src/AUTHORS diff --git a/source/libs/pixman/pixman-0.32.8/COPYING b/source/libs/pixman/pixman-src/COPYING old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/COPYING rename to source/libs/pixman/pixman-src/COPYING diff --git a/source/libs/pixman/pixman-0.32.8/ChangeLog b/source/libs/pixman/pixman-src/ChangeLog old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/ChangeLog rename to source/libs/pixman/pixman-src/ChangeLog diff --git a/source/libs/pixman/pixman-0.32.8/INSTALL b/source/libs/pixman/pixman-src/INSTALL old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/INSTALL rename to source/libs/pixman/pixman-src/INSTALL diff --git a/source/libs/pixman/pixman-0.32.8/Makefile.am b/source/libs/pixman/pixman-src/Makefile.am old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/Makefile.am rename to source/libs/pixman/pixman-src/Makefile.am diff --git a/source/libs/pixman/pixman-0.32.8/Makefile.win32 b/source/libs/pixman/pixman-src/Makefile.win32 old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/Makefile.win32 rename to source/libs/pixman/pixman-src/Makefile.win32 diff --git a/source/libs/pixman/pixman-0.32.8/Makefile.win32.common b/source/libs/pixman/pixman-src/Makefile.win32.common old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/Makefile.win32.common rename to source/libs/pixman/pixman-src/Makefile.win32.common diff --git a/source/libs/pixman/pixman-0.32.8/NEWS b/source/libs/pixman/pixman-src/NEWS old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/NEWS rename to source/libs/pixman/pixman-src/NEWS diff --git a/source/libs/pixman/pixman-0.32.8/README b/source/libs/pixman/pixman-src/README old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/README rename to source/libs/pixman/pixman-src/README diff --git a/source/libs/pixman/pixman-0.32.8/config.h.in b/source/libs/pixman/pixman-src/config.h.in old mode 100755 new mode 100644 similarity index 96% rename from source/libs/pixman/pixman-0.32.8/config.h.in rename to source/libs/pixman/pixman-src/config.h.in index 17d825034..c707dd52c --- a/source/libs/pixman/pixman-0.32.8/config.h.in +++ b/source/libs/pixman/pixman-src/config.h.in @@ -12,6 +12,9 @@ /* Define to 1 if you have the <dlfcn.h> header file. */ #undef HAVE_DLFCN_H +/* Whether we have FE_DIVBYZERO */ +#undef HAVE_FEDIVBYZERO + /* Whether we have feenableexcept() */ #undef HAVE_FEENABLEEXCEPT @@ -84,8 +87,7 @@ /* Define to 1 if you have the <unistd.h> header file. */ #undef HAVE_UNISTD_H -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ +/* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ diff --git a/source/libs/pixman/pixman-0.32.8/configure.ac b/source/libs/pixman/pixman-src/configure.ac old mode 100755 new mode 100644 similarity index 97% rename from source/libs/pixman/pixman-0.32.8/configure.ac rename to source/libs/pixman/pixman-src/configure.ac index 97494e693..156edfbf3 --- a/source/libs/pixman/pixman-0.32.8/configure.ac +++ b/source/libs/pixman/pixman-src/configure.ac @@ -53,8 +53,8 @@ AC_PREREQ([2.57]) # m4_define([pixman_major], 0) -m4_define([pixman_minor], 32) -m4_define([pixman_micro], 8) +m4_define([pixman_minor], 34) +m4_define([pixman_micro], 0) m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro]) @@ -184,6 +184,7 @@ AC_SUBST(LT_VERSION_INFO) PIXMAN_CHECK_CFLAG([-Wall]) PIXMAN_CHECK_CFLAG([-Wdeclaration-after-statement]) +PIXMAN_CHECK_CFLAG([-Wno-unused-local-typedefs]) PIXMAN_CHECK_CFLAG([-fno-strict-aliasing]) dnl ========================================================================= @@ -346,15 +347,27 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #error "Need GCC >= 3.4 for MMX intrinsics" #endif #include <mmintrin.h> +#include <stdint.h> + +/* Check support for block expressions */ +#define _mm_shuffle_pi16(A, N) \ + ({ \ + __m64 ret; \ + \ + /* Some versions of clang will choke on K */ \ + asm ("pshufw %2, %1, %0\n\t" \ + : "=y" (ret) \ + : "y" (A), "K" ((const int8_t)N) \ + ); \ + \ + ret; \ + }) + int main () { __m64 v = _mm_cvtsi32_si64 (1); __m64 w; - /* Some versions of clang will choke on K */ - asm ("pshufw %2, %1, %0\n\t" - : "=y" (w) - : "y" (v), "K" (5) - ); + w = _mm_shuffle_pi16(v, 5); /* Some versions of clang will choke on this */ asm ("pmulhuw %1, %0\n\t" @@ -416,10 +429,11 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include <mmintrin.h> #include <xmmintrin.h> #include <emmintrin.h> +int param; int main () { - __m128i a = _mm_set1_epi32 (0), b = _mm_set1_epi32 (0), c; + __m128i a = _mm_set1_epi32 (param), b = _mm_set1_epi32 (param + 1), c; c = _mm_xor_si128 (a, b); - return 0; + return _mm_cvtsi128_si32(c); }]])], have_sse2_intrinsics=yes) CFLAGS=$xserver_save_CFLAGS @@ -460,10 +474,11 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include <xmmintrin.h> #include <emmintrin.h> #include <tmmintrin.h> +int param; int main () { - __m128i a = _mm_set1_epi32 (0), b = _mm_set1_epi32 (0), c; + __m128i a = _mm_set1_epi32 (param), b = _mm_set1_epi32 (param + 1), c; c = _mm_maddubs_epi16 (a, b); - return 0; + return _mm_cvtsi128_si32(c); }]])], have_ssse3_intrinsics=yes) CFLAGS=$xserver_save_CFLAGS @@ -890,6 +905,11 @@ if test x$have_feenableexcept = xyes; then AC_DEFINE(HAVE_FEENABLEEXCEPT, 1, [Whether we have feenableexcept()]) fi +AC_CHECK_DECL([FE_DIVBYZERO], + [AC_DEFINE(HAVE_FEDIVBYZERO, 1, [Whether we have FE_DIVBYZERO])], + [], + [[#include <fenv.h>]]) + AC_CHECK_FUNC(gettimeofday, have_gettimeofday=yes, have_gettimeofday=no) AC_CHECK_HEADER(sys/time.h, have_sys_time_h=yes, have_sys_time_h=no) if test x$have_gettimeofday = xyes && test x$have_sys_time_h = xyes; then diff --git a/source/libs/pixman/pixman-0.32.8/pixman-1-uninstalled.pc.in b/source/libs/pixman/pixman-src/pixman-1-uninstalled.pc.in old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman-1-uninstalled.pc.in rename to source/libs/pixman/pixman-src/pixman-1-uninstalled.pc.in diff --git a/source/libs/pixman/pixman-0.32.8/pixman-1.pc.in b/source/libs/pixman/pixman-src/pixman-1.pc.in old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman-1.pc.in rename to source/libs/pixman/pixman-src/pixman-1.pc.in diff --git a/source/libs/pixman/pixman-0.32.8/pixman/Makefile.am b/source/libs/pixman/pixman-src/pixman/Makefile.am old mode 100755 new mode 100644 similarity index 98% rename from source/libs/pixman/pixman-0.32.8/pixman/Makefile.am rename to source/libs/pixman/pixman-src/pixman/Makefile.am index b376d9aeb..581b6f61e --- a/source/libs/pixman/pixman-0.32.8/pixman/Makefile.am +++ b/source/libs/pixman/pixman-src/pixman/Makefile.am @@ -72,6 +72,7 @@ libpixman_arm_simd_la_SOURCES = \ pixman-arm-common.h \ pixman-arm-simd-asm.S \ pixman-arm-simd-asm-scaled.S \ + pixman-arm-asm.h \ pixman-arm-simd-asm.h libpixman_1_la_LIBADD += libpixman-arm-simd.la @@ -86,6 +87,7 @@ libpixman_arm_neon_la_SOURCES = \ pixman-arm-common.h \ pixman-arm-neon-asm.S \ pixman-arm-neon-asm-bilinear.S \ + pixman-arm-asm.h \ pixman-arm-neon-asm.h libpixman_1_la_LIBADD += libpixman-arm-neon.la diff --git a/source/libs/pixman/pixman-0.32.8/pixman/Makefile.sources b/source/libs/pixman/pixman-src/pixman/Makefile.sources old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/Makefile.sources rename to source/libs/pixman/pixman-src/pixman/Makefile.sources diff --git a/source/libs/pixman/pixman-0.32.8/pixman/Makefile.win32 b/source/libs/pixman/pixman-src/pixman/Makefile.win32 old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/Makefile.win32 rename to source/libs/pixman/pixman-src/pixman/Makefile.win32 diff --git a/source/libs/pixman/pixman-0.32.8/pixman/loongson-mmintrin.h b/source/libs/pixman/pixman-src/pixman/loongson-mmintrin.h old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/loongson-mmintrin.h rename to source/libs/pixman/pixman-src/pixman/loongson-mmintrin.h diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-access-accessors.c b/source/libs/pixman/pixman-src/pixman/pixman-access-accessors.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-access-accessors.c rename to source/libs/pixman/pixman-src/pixman/pixman-access-accessors.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-access.c b/source/libs/pixman/pixman-src/pixman/pixman-access.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-access.c rename to source/libs/pixman/pixman-src/pixman/pixman-access.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-accessor.h b/source/libs/pixman/pixman-src/pixman/pixman-accessor.h old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-accessor.h rename to source/libs/pixman/pixman-src/pixman/pixman-accessor.h diff --git a/source/libs/pixman/pixman-src/pixman/pixman-arm-asm.h b/source/libs/pixman/pixman-src/pixman/pixman-arm-asm.h new file mode 100644 index 000000000..ee7854108 --- /dev/null +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-asm.h @@ -0,0 +1,37 @@ +/* + * Copyright © 2008 Mozilla Corporation + * Copyright © 2010 Nokia Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Mozilla Corporation not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Mozilla Corporation makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Author: Jeff Muizelaar (jeff@infidigm.net) + * + */ + +/* Supplementary macro for setting function attributes */ +.macro pixman_asm_function fname + .func fname + .global fname +#ifdef __ELF__ + .hidden fname + .type fname, %function +#endif +fname: +.endm diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-common.h b/source/libs/pixman/pixman-src/pixman/pixman-arm-common.h old mode 100755 new mode 100644 similarity index 97% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-common.h rename to source/libs/pixman/pixman-src/pixman/pixman-arm-common.h index 3a7cb2bef..953768830 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-common.h +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-common.h @@ -266,13 +266,6 @@ FAST_NEAREST_MAINLOOP (cputype##_##name##_normal_##op, \ scaled_nearest_scanline_##cputype##_##name##_##op, \ src_type, dst_type, NORMAL) -/* Provide entries for the fast path table */ -#define PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH(op,s,d,func) \ - SIMPLE_NEAREST_FAST_PATH_COVER (op,s,d,func), \ - SIMPLE_NEAREST_FAST_PATH_NONE (op,s,d,func), \ - SIMPLE_NEAREST_FAST_PATH_PAD (op,s,d,func), \ - SIMPLE_NEAREST_FAST_PATH_NORMAL (op,s,d,func) - #define PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_A8_DST(flags, cputype, name, op, \ src_type, dst_type) \ void \ @@ -318,9 +311,7 @@ FAST_NEAREST_MAINLOOP_COMMON (cputype##_##name##_normal_##op, \ /* Provide entries for the fast path table */ #define PIXMAN_ARM_SIMPLE_NEAREST_A8_MASK_FAST_PATH(op,s,d,func) \ - SIMPLE_NEAREST_A8_MASK_FAST_PATH_COVER (op,s,d,func), \ - SIMPLE_NEAREST_A8_MASK_FAST_PATH_NONE (op,s,d,func), \ - SIMPLE_NEAREST_A8_MASK_FAST_PATH_PAD (op,s,d,func), \ + SIMPLE_NEAREST_A8_MASK_FAST_PATH (op,s,d,func), \ SIMPLE_NEAREST_A8_MASK_FAST_PATH_NORMAL (op,s,d,func) /*****************************************************************************/ diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon-asm-bilinear.S b/source/libs/pixman/pixman-src/pixman/pixman-arm-neon-asm-bilinear.S old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon-asm-bilinear.S rename to source/libs/pixman/pixman-src/pixman/pixman-arm-neon-asm-bilinear.S index e37b5c298..0fd92d61c --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon-asm-bilinear.S +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-neon-asm-bilinear.S @@ -65,23 +65,13 @@ .p2align 2 #include "pixman-private.h" +#include "pixman-arm-asm.h" #include "pixman-arm-neon-asm.h" /* * Bilinear macros from pixman-arm-neon-asm.S */ -/* Supplementary macro for setting function attributes */ -.macro pixman_asm_function fname - .func fname - .global fname -#ifdef __ELF__ - .hidden fname - .type fname, %function -#endif -fname: -.endm - /* * Bilinear scaling support code which tries to provide pixel fetching, color * format conversion, and interpolation as separate macros which can be used diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon-asm.S b/source/libs/pixman/pixman-src/pixman/pixman-arm-neon-asm.S old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon-asm.S rename to source/libs/pixman/pixman-src/pixman/pixman-arm-neon-asm.S index 187197dc3..7e949a38f --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon-asm.S +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-neon-asm.S @@ -50,6 +50,7 @@ .p2align 2 #include "pixman-private.h" +#include "pixman-arm-asm.h" #include "pixman-arm-neon-asm.h" /* Global configuration options and preferences */ @@ -2830,17 +2831,6 @@ generate_composite_function_nearest_scanline \ /******************************************************************************/ -/* Supplementary macro for setting function attributes */ -.macro pixman_asm_function fname - .func fname - .global fname -#ifdef __ELF__ - .hidden fname - .type fname, %function -#endif -fname: -.endm - /* * Bilinear scaling support code which tries to provide pixel fetching, color * format conversion, and interpolation as separate macros which can be used diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon-asm.h b/source/libs/pixman/pixman-src/pixman/pixman-arm-neon-asm.h old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon-asm.h rename to source/libs/pixman/pixman-src/pixman/pixman-arm-neon-asm.h index d0d92d74c..bdcf6a9d4 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon-asm.h +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-neon-asm.h @@ -631,14 +631,8 @@ local skip1 src_basereg_ = 0, \ mask_basereg_ = 24 - .func fname - .global fname - /* For ELF format also set function visibility to hidden */ -#ifdef __ELF__ - .hidden fname - .type fname, %function -#endif -fname: + pixman_asm_function fname + push {r4-r12, lr} /* save all registers */ /* @@ -945,14 +939,8 @@ fname: src_basereg_ = 0, \ mask_basereg_ = 24 - .func fname - .global fname - /* For ELF format also set function visibility to hidden */ -#ifdef __ELF__ - .hidden fname - .type fname, %function -#endif -fname: + pixman_asm_function fname + .set PREFETCH_TYPE_CURRENT, PREFETCH_TYPE_NONE /* * Make some macro arguments globally visible and accessible diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon.c b/source/libs/pixman/pixman-src/pixman/pixman-arm-neon.c old mode 100755 new mode 100644 similarity index 96% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon.c rename to source/libs/pixman/pixman-src/pixman/pixman-arm-neon.c index 60e9c78d2..be761c965 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-neon.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-neon.c @@ -362,21 +362,21 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, a8r8g8b8, neon_composite_out_reverse_8_8888), PIXMAN_STD_FAST_PATH (OUT_REVERSE, a8, null, a8b8g8r8, neon_composite_out_reverse_8_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, neon_8888_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, neon_8888_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, neon_8888_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, neon_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, neon_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, neon_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, neon_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, neon_8888_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, r5g6b5, neon_8888_0565), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, b5g6r5, neon_8888_0565), + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, r5g6b5, neon_8888_0565), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, b5g6r5, neon_8888_0565), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, r5g6b5, neon_8888_0565), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, r5g6b5, neon_8888_0565), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, b5g6r5, neon_8888_0565), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, b5g6r5, neon_8888_0565), + SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, r5g6b5, neon_8888_0565), + SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, r5g6b5, neon_8888_0565), + SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, b5g6r5, neon_8888_0565), + SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, b5g6r5, neon_8888_0565), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, x8b8g8r8, neon_0565_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, x8r8g8b8, neon_0565_8888), + SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, x8b8g8r8, neon_0565_8888), + SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, x8r8g8b8, neon_0565_8888), /* Note: NONE repeat is not supported yet */ SIMPLE_NEAREST_FAST_PATH_COVER (SRC, r5g6b5, a8r8g8b8, neon_0565_8888), SIMPLE_NEAREST_FAST_PATH_COVER (SRC, b5g6r5, a8b8g8r8, neon_0565_8888), diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd-asm-scaled.S b/source/libs/pixman/pixman-src/pixman/pixman-arm-simd-asm-scaled.S old mode 100755 new mode 100644 similarity index 95% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd-asm-scaled.S rename to source/libs/pixman/pixman-src/pixman/pixman-arm-simd-asm-scaled.S index 711099548..e050292e0 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd-asm-scaled.S +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-simd-asm-scaled.S @@ -37,16 +37,7 @@ .altmacro .p2align 2 -/* Supplementary macro for setting function attributes */ -.macro pixman_asm_function fname - .func fname - .global fname -#ifdef __ELF__ - .hidden fname - .type fname, %function -#endif -fname: -.endm +#include "pixman-arm-asm.h" /* * Note: This code is only using armv5te instructions (not even armv6), diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd-asm.S b/source/libs/pixman/pixman-src/pixman/pixman-arm-simd-asm.S old mode 100755 new mode 100644 similarity index 53% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd-asm.S rename to source/libs/pixman/pixman-src/pixman/pixman-arm-simd-asm.S index c20968879..a74a0a8f3 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd-asm.S +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-simd-asm.S @@ -37,6 +37,7 @@ .altmacro .p2align 2 +#include "pixman-arm-asm.h" #include "pixman-arm-simd-asm.h" /* A head macro should do all processing which results in an output of up to @@ -303,6 +304,83 @@ generate_composite_function \ /******************************************************************************/ +.macro src_x888_0565_init + /* Hold loop invariant in MASK */ + ldr MASK, =0x001F001F + line_saved_regs STRIDE_S, ORIG_W +.endm + +.macro src_x888_0565_1pixel s, d + and WK&d, MASK, WK&s, lsr #3 @ 00000000000rrrrr00000000000bbbbb + and STRIDE_S, WK&s, #0xFC00 @ 0000000000000000gggggg0000000000 + orr WK&d, WK&d, WK&d, lsr #5 @ 00000000000-----rrrrr000000bbbbb + orr WK&d, WK&d, STRIDE_S, lsr #5 @ 00000000000-----rrrrrggggggbbbbb + /* Top 16 bits are discarded during the following STRH */ +.endm + +.macro src_x888_0565_2pixels slo, shi, d, tmp + and SCRATCH, WK&shi, #0xFC00 @ 0000000000000000GGGGGG0000000000 + and WK&tmp, MASK, WK&shi, lsr #3 @ 00000000000RRRRR00000000000BBBBB + and WK&shi, MASK, WK&slo, lsr #3 @ 00000000000rrrrr00000000000bbbbb + orr WK&tmp, WK&tmp, WK&tmp, lsr #5 @ 00000000000-----RRRRR000000BBBBB + orr WK&tmp, WK&tmp, SCRATCH, lsr #5 @ 00000000000-----RRRRRGGGGGGBBBBB + and SCRATCH, WK&slo, #0xFC00 @ 0000000000000000gggggg0000000000 + orr WK&shi, WK&shi, WK&shi, lsr #5 @ 00000000000-----rrrrr000000bbbbb + orr WK&shi, WK&shi, SCRATCH, lsr #5 @ 00000000000-----rrrrrggggggbbbbb + pkhbt WK&d, WK&shi, WK&tmp, lsl #16 @ RRRRRGGGGGGBBBBBrrrrrggggggbbbbb +.endm + +.macro src_x888_0565_process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, preload + WK4 .req STRIDE_S + WK5 .req STRIDE_M + WK6 .req WK3 + WK7 .req ORIG_W + .if numbytes == 16 + pixld , 16, 4, SRC, 0 + src_x888_0565_2pixels 4, 5, 0, 0 + pixld , 8, 4, SRC, 0 + src_x888_0565_2pixels 6, 7, 1, 1 + pixld , 8, 6, SRC, 0 + .else + pixld , numbytes*2, 4, SRC, 0 + .endif +.endm + +.macro src_x888_0565_process_tail cond, numbytes, firstreg + .if numbytes == 16 + src_x888_0565_2pixels 4, 5, 2, 2 + src_x888_0565_2pixels 6, 7, 3, 4 + .elseif numbytes == 8 + src_x888_0565_2pixels 4, 5, 1, 1 + src_x888_0565_2pixels 6, 7, 2, 2 + .elseif numbytes == 4 + src_x888_0565_2pixels 4, 5, 1, 1 + .else + src_x888_0565_1pixel 4, 1 + .endif + .if numbytes == 16 + pixst , numbytes, 0, DST + .else + pixst , numbytes, 1, DST + .endif + .unreq WK4 + .unreq WK5 + .unreq WK6 + .unreq WK7 +.endm + +generate_composite_function \ + pixman_composite_src_x888_0565_asm_armv6, 32, 0, 16, \ + FLAG_DST_WRITEONLY | FLAG_BRANCH_OVER | FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH, \ + 3, /* prefetch distance */ \ + src_x888_0565_init, \ + nop_macro, /* newline */ \ + nop_macro, /* cleanup */ \ + src_x888_0565_process_head, \ + src_x888_0565_process_tail + +/******************************************************************************/ + .macro add_8_8_8pixels cond, dst1, dst2 uqadd8&cond WK&dst1, WK&dst1, MASK uqadd8&cond WK&dst2, WK&dst2, STRIDE_M @@ -611,3 +689,491 @@ generate_composite_function \ /******************************************************************************/ +.macro over_reverse_n_8888_init + ldr SRC, [sp, #ARGS_STACK_OFFSET] + ldr MASK, =0x00800080 + /* Split source pixel into RB/AG parts */ + uxtb16 STRIDE_S, SRC + uxtb16 STRIDE_M, SRC, ror #8 + /* Set GE[3:0] to 0101 so SEL instructions do what we want */ + uadd8 SCRATCH, MASK, MASK + line_saved_regs STRIDE_D, ORIG_W +.endm + +.macro over_reverse_n_8888_newline + mov STRIDE_D, #0xFF +.endm + +.macro over_reverse_n_8888_process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, preload + pixld , numbytes, firstreg, DST, 0 +.endm + +.macro over_reverse_n_8888_1pixel d, is_only + teq WK&d, #0 + beq 8f /* replace with source */ + bics ORIG_W, STRIDE_D, WK&d, lsr #24 + .if is_only == 1 + beq 49f /* skip store */ + .else + beq 9f /* write same value back */ + .endif + mla SCRATCH, STRIDE_S, ORIG_W, MASK /* red/blue */ + mla ORIG_W, STRIDE_M, ORIG_W, MASK /* alpha/green */ + uxtab16 SCRATCH, SCRATCH, SCRATCH, ror #8 + uxtab16 ORIG_W, ORIG_W, ORIG_W, ror #8 + mov SCRATCH, SCRATCH, ror #8 + sel ORIG_W, SCRATCH, ORIG_W + uqadd8 WK&d, WK&d, ORIG_W + b 9f +8: mov WK&d, SRC +9: +.endm + +.macro over_reverse_n_8888_tail numbytes, reg1, reg2, reg3, reg4 + .if numbytes == 4 + over_reverse_n_8888_1pixel reg1, 1 + .else + and SCRATCH, WK®1, WK®2 + .if numbytes == 16 + and SCRATCH, SCRATCH, WK®3 + and SCRATCH, SCRATCH, WK®4 + .endif + mvns SCRATCH, SCRATCH, asr #24 + beq 49f /* skip store if all opaque */ + over_reverse_n_8888_1pixel reg1, 0 + over_reverse_n_8888_1pixel reg2, 0 + .if numbytes == 16 + over_reverse_n_8888_1pixel reg3, 0 + over_reverse_n_8888_1pixel reg4, 0 + .endif + .endif + pixst , numbytes, reg1, DST +49: +.endm + +.macro over_reverse_n_8888_process_tail cond, numbytes, firstreg + over_reverse_n_8888_tail numbytes, firstreg, %(firstreg+1), %(firstreg+2), %(firstreg+3) +.endm + +generate_composite_function \ + pixman_composite_over_reverse_n_8888_asm_armv6, 0, 0, 32 \ + FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR | FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH, \ + 3, /* prefetch distance */ \ + over_reverse_n_8888_init, \ + over_reverse_n_8888_newline, \ + nop_macro, /* cleanup */ \ + over_reverse_n_8888_process_head, \ + over_reverse_n_8888_process_tail + +/******************************************************************************/ + +.macro over_white_8888_8888_ca_init + HALF .req SRC + TMP0 .req STRIDE_D + TMP1 .req STRIDE_S + TMP2 .req STRIDE_M + TMP3 .req ORIG_W + WK4 .req SCRATCH + line_saved_regs STRIDE_D, STRIDE_M, ORIG_W + ldr SCRATCH, =0x800080 + mov HALF, #0x80 + /* Set GE[3:0] to 0101 so SEL instructions do what we want */ + uadd8 SCRATCH, SCRATCH, SCRATCH + .set DST_PRELOAD_BIAS, 8 +.endm + +.macro over_white_8888_8888_ca_cleanup + .set DST_PRELOAD_BIAS, 0 + .unreq HALF + .unreq TMP0 + .unreq TMP1 + .unreq TMP2 + .unreq TMP3 + .unreq WK4 +.endm + +.macro over_white_8888_8888_ca_combine m, d + uxtb16 TMP1, TMP0 /* rb_notmask */ + uxtb16 TMP2, d /* rb_dest; 1 stall follows */ + smlatt TMP3, TMP2, TMP1, HALF /* red */ + smlabb TMP2, TMP2, TMP1, HALF /* blue */ + uxtb16 TMP0, TMP0, ror #8 /* ag_notmask */ + uxtb16 TMP1, d, ror #8 /* ag_dest; 1 stall follows */ + smlatt d, TMP1, TMP0, HALF /* alpha */ + smlabb TMP1, TMP1, TMP0, HALF /* green */ + pkhbt TMP0, TMP2, TMP3, lsl #16 /* rb; 1 stall follows */ + pkhbt TMP1, TMP1, d, lsl #16 /* ag */ + uxtab16 TMP0, TMP0, TMP0, ror #8 + uxtab16 TMP1, TMP1, TMP1, ror #8 + mov TMP0, TMP0, ror #8 + sel d, TMP0, TMP1 + uqadd8 d, d, m /* d is a late result */ +.endm + +.macro over_white_8888_8888_ca_1pixel_head + pixld , 4, 1, MASK, 0 + pixld , 4, 3, DST, 0 +.endm + +.macro over_white_8888_8888_ca_1pixel_tail + mvn TMP0, WK1 + teq WK1, WK1, asr #32 + bne 01f + bcc 03f + mov WK3, WK1 + b 02f +01: over_white_8888_8888_ca_combine WK1, WK3 +02: pixst , 4, 3, DST +03: +.endm + +.macro over_white_8888_8888_ca_2pixels_head + pixld , 8, 1, MASK, 0 +.endm + +.macro over_white_8888_8888_ca_2pixels_tail + pixld , 8, 3, DST + mvn TMP0, WK1 + teq WK1, WK1, asr #32 + bne 01f + movcs WK3, WK1 + bcs 02f + teq WK2, #0 + beq 05f + b 02f +01: over_white_8888_8888_ca_combine WK1, WK3 +02: mvn TMP0, WK2 + teq WK2, WK2, asr #32 + bne 03f + movcs WK4, WK2 + b 04f +03: over_white_8888_8888_ca_combine WK2, WK4 +04: pixst , 8, 3, DST +05: +.endm + +.macro over_white_8888_8888_ca_process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, preload + .if numbytes == 4 + over_white_8888_8888_ca_1pixel_head + .else + .if numbytes == 16 + over_white_8888_8888_ca_2pixels_head + over_white_8888_8888_ca_2pixels_tail + .endif + over_white_8888_8888_ca_2pixels_head + .endif +.endm + +.macro over_white_8888_8888_ca_process_tail cond, numbytes, firstreg + .if numbytes == 4 + over_white_8888_8888_ca_1pixel_tail + .else + over_white_8888_8888_ca_2pixels_tail + .endif +.endm + +generate_composite_function \ + pixman_composite_over_white_8888_8888_ca_asm_armv6, 0, 32, 32 \ + FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR | FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH \ + 2, /* prefetch distance */ \ + over_white_8888_8888_ca_init, \ + nop_macro, /* newline */ \ + over_white_8888_8888_ca_cleanup, \ + over_white_8888_8888_ca_process_head, \ + over_white_8888_8888_ca_process_tail + + +.macro over_n_8888_8888_ca_init + /* Set up constants. RB_SRC and AG_SRC are in registers; + * RB_FLDS, A_SRC, and the two HALF values need to go on the + * stack (and the ful SRC value is already there) */ + ldr SCRATCH, [sp, #ARGS_STACK_OFFSET] + mov WK0, #0x00FF0000 + orr WK0, WK0, #0xFF /* RB_FLDS (0x00FF00FF) */ + mov WK1, #0x80 /* HALF default value */ + mov WK2, SCRATCH, lsr #24 /* A_SRC */ + orr WK3, WK1, WK1, lsl #16 /* HALF alternate value (0x00800080) */ + push {WK0-WK3} + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET+16 + uxtb16 SRC, SCRATCH + uxtb16 STRIDE_S, SCRATCH, ror #8 + + /* Set GE[3:0] to 0101 so SEL instructions do what we want */ + uadd8 SCRATCH, WK3, WK3 + + .unreq WK0 + .unreq WK1 + .unreq WK2 + .unreq WK3 + WK0 .req Y + WK1 .req STRIDE_D + RB_SRC .req SRC + AG_SRC .req STRIDE_S + WK2 .req STRIDE_M + RB_FLDS .req r8 /* the reloaded constants have to be at consecutive registers starting at an even one */ + A_SRC .req r8 + HALF .req r9 + WK3 .req r10 + WK4 .req r11 + WK5 .req SCRATCH + WK6 .req ORIG_W + + line_saved_regs Y, STRIDE_D, STRIDE_M, ORIG_W +.endm + +.macro over_n_8888_8888_ca_cleanup + add sp, sp, #16 + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET-16 + + .unreq WK0 + .unreq WK1 + .unreq RB_SRC + .unreq AG_SRC + .unreq WK2 + .unreq RB_FLDS + .unreq A_SRC + .unreq HALF + .unreq WK3 + .unreq WK4 + .unreq WK5 + .unreq WK6 + WK0 .req r8 + WK1 .req r9 + WK2 .req r10 + WK3 .req r11 +.endm + +.macro over_n_8888_8888_ca_1pixel_head + pixld , 4, 6, MASK, 0 + pixld , 4, 0, DST, 0 +.endm + +.macro over_n_8888_8888_ca_1pixel_tail + ldrd A_SRC, HALF, [sp, #LOCALS_STACK_OFFSET+8] + uxtb16 WK1, WK6 /* rb_mask (first step of hard case placed in what would otherwise be a stall) */ + teq WK6, WK6, asr #32 /* Zc if transparent, ZC if opaque */ + bne 20f + bcc 40f + /* Mask is fully opaque (all channels) */ + ldr WK6, [sp, #ARGS_STACK_OFFSET] /* get SRC back */ + eors A_SRC, A_SRC, #0xFF + bne 10f + /* Source is also opaque - same as src_8888_8888 */ + mov WK0, WK6 + b 30f +10: /* Same as over_8888_8888 */ + mul_8888_8 WK0, A_SRC, WK5, HALF + uqadd8 WK0, WK0, WK6 + b 30f +20: /* No simplifications possible - do it the hard way */ + uxtb16 WK2, WK6, ror #8 /* ag_mask */ + mla WK3, WK1, A_SRC, HALF /* rb_mul; 2 cycles */ + mla WK4, WK2, A_SRC, HALF /* ag_mul; 2 cycles */ + ldrd RB_FLDS, HALF, [sp, #LOCALS_STACK_OFFSET] + uxtb16 WK5, WK0 /* rb_dest */ + uxtab16 WK3, WK3, WK3, ror #8 + uxtb16 WK6, WK0, ror #8 /* ag_dest */ + uxtab16 WK4, WK4, WK4, ror #8 + smlatt WK0, RB_SRC, WK1, HALF /* red1 */ + smlabb WK1, RB_SRC, WK1, HALF /* blue1 */ + bic WK3, RB_FLDS, WK3, lsr #8 + bic WK4, RB_FLDS, WK4, lsr #8 + pkhbt WK1, WK1, WK0, lsl #16 /* rb1 */ + smlatt WK0, WK5, WK3, HALF /* red2 */ + smlabb WK3, WK5, WK3, HALF /* blue2 */ + uxtab16 WK1, WK1, WK1, ror #8 + smlatt WK5, AG_SRC, WK2, HALF /* alpha1 */ + pkhbt WK3, WK3, WK0, lsl #16 /* rb2 */ + smlabb WK0, AG_SRC, WK2, HALF /* green1 */ + smlatt WK2, WK6, WK4, HALF /* alpha2 */ + smlabb WK4, WK6, WK4, HALF /* green2 */ + pkhbt WK0, WK0, WK5, lsl #16 /* ag1 */ + uxtab16 WK3, WK3, WK3, ror #8 + pkhbt WK4, WK4, WK2, lsl #16 /* ag2 */ + uxtab16 WK0, WK0, WK0, ror #8 + uxtab16 WK4, WK4, WK4, ror #8 + mov WK1, WK1, ror #8 + mov WK3, WK3, ror #8 + sel WK2, WK1, WK0 /* recombine source*mask */ + sel WK1, WK3, WK4 /* recombine dest*(1-source_alpha*mask) */ + uqadd8 WK0, WK1, WK2 /* followed by 1 stall */ +30: /* The destination buffer is already in the L1 cache, so + * there's little point in amalgamating writes */ + pixst , 4, 0, DST +40: +.endm + +.macro over_n_8888_8888_ca_process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, preload + .rept (numbytes / 4) - 1 + over_n_8888_8888_ca_1pixel_head + over_n_8888_8888_ca_1pixel_tail + .endr + over_n_8888_8888_ca_1pixel_head +.endm + +.macro over_n_8888_8888_ca_process_tail cond, numbytes, firstreg + over_n_8888_8888_ca_1pixel_tail +.endm + +pixman_asm_function pixman_composite_over_n_8888_8888_ca_asm_armv6 + ldr ip, [sp] + cmp ip, #-1 + beq pixman_composite_over_white_8888_8888_ca_asm_armv6 + /* else drop through... */ + .endfunc +generate_composite_function \ + pixman_composite_over_n_8888_8888_ca_asm_armv6_helper, 0, 32, 32 \ + FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR | FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH | FLAG_PROCESS_CORRUPTS_WK0 \ + 2, /* prefetch distance */ \ + over_n_8888_8888_ca_init, \ + nop_macro, /* newline */ \ + over_n_8888_8888_ca_cleanup, \ + over_n_8888_8888_ca_process_head, \ + over_n_8888_8888_ca_process_tail + +/******************************************************************************/ + +.macro in_reverse_8888_8888_init + /* Hold loop invariant in MASK */ + ldr MASK, =0x00800080 + /* Set GE[3:0] to 0101 so SEL instructions do what we want */ + uadd8 SCRATCH, MASK, MASK + /* Offset the source pointer: we only need the alpha bytes */ + add SRC, SRC, #3 + line_saved_regs ORIG_W +.endm + +.macro in_reverse_8888_8888_head numbytes, reg1, reg2, reg3 + ldrb ORIG_W, [SRC], #4 + .if numbytes >= 8 + ldrb WK®1, [SRC], #4 + .if numbytes == 16 + ldrb WK®2, [SRC], #4 + ldrb WK®3, [SRC], #4 + .endif + .endif + add DST, DST, #numbytes +.endm + +.macro in_reverse_8888_8888_process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, preload + in_reverse_8888_8888_head numbytes, firstreg, %(firstreg+1), %(firstreg+2) +.endm + +.macro in_reverse_8888_8888_1pixel s, d, offset, is_only + .if is_only != 1 + movs s, ORIG_W + .if offset != 0 + ldrb ORIG_W, [SRC, #offset] + .endif + beq 01f + teq STRIDE_M, #0xFF + beq 02f + .endif + uxtb16 SCRATCH, d /* rb_dest */ + uxtb16 d, d, ror #8 /* ag_dest */ + mla SCRATCH, SCRATCH, s, MASK + mla d, d, s, MASK + uxtab16 SCRATCH, SCRATCH, SCRATCH, ror #8 + uxtab16 d, d, d, ror #8 + mov SCRATCH, SCRATCH, ror #8 + sel d, SCRATCH, d + b 02f + .if offset == 0 +48: /* Last mov d,#0 of the set - used as part of shortcut for + * source values all 0 */ + .endif +01: mov d, #0 +02: +.endm + +.macro in_reverse_8888_8888_tail numbytes, reg1, reg2, reg3, reg4 + .if numbytes == 4 + teq ORIG_W, ORIG_W, asr #32 + ldrne WK®1, [DST, #-4] + .elseif numbytes == 8 + teq ORIG_W, WK®1 + teqeq ORIG_W, ORIG_W, asr #32 /* all 0 or all -1? */ + ldmnedb DST, {WK®1-WK®2} + .else + teq ORIG_W, WK®1 + teqeq ORIG_W, WK®2 + teqeq ORIG_W, WK®3 + teqeq ORIG_W, ORIG_W, asr #32 /* all 0 or all -1? */ + ldmnedb DST, {WK®1-WK®4} + .endif + cmnne DST, #0 /* clear C if NE */ + bcs 49f /* no writes to dest if source all -1 */ + beq 48f /* set dest to all 0 if source all 0 */ + .if numbytes == 4 + in_reverse_8888_8888_1pixel ORIG_W, WK®1, 0, 1 + str WK®1, [DST, #-4] + .elseif numbytes == 8 + in_reverse_8888_8888_1pixel STRIDE_M, WK®1, -4, 0 + in_reverse_8888_8888_1pixel STRIDE_M, WK®2, 0, 0 + stmdb DST, {WK®1-WK®2} + .else + in_reverse_8888_8888_1pixel STRIDE_M, WK®1, -12, 0 + in_reverse_8888_8888_1pixel STRIDE_M, WK®2, -8, 0 + in_reverse_8888_8888_1pixel STRIDE_M, WK®3, -4, 0 + in_reverse_8888_8888_1pixel STRIDE_M, WK®4, 0, 0 + stmdb DST, {WK®1-WK®4} + .endif +49: +.endm + +.macro in_reverse_8888_8888_process_tail cond, numbytes, firstreg + in_reverse_8888_8888_tail numbytes, firstreg, %(firstreg+1), %(firstreg+2), %(firstreg+3) +.endm + +generate_composite_function \ + pixman_composite_in_reverse_8888_8888_asm_armv6, 32, 0, 32 \ + FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_CORRUPTS_PSR | FLAG_PROCESS_DOES_STORE | FLAG_SPILL_LINE_VARS | FLAG_PROCESS_CORRUPTS_SCRATCH | FLAG_NO_PRELOAD_DST \ + 2, /* prefetch distance */ \ + in_reverse_8888_8888_init, \ + nop_macro, /* newline */ \ + nop_macro, /* cleanup */ \ + in_reverse_8888_8888_process_head, \ + in_reverse_8888_8888_process_tail + +/******************************************************************************/ + +.macro over_n_8888_init + ldr SRC, [sp, #ARGS_STACK_OFFSET] + /* Hold loop invariant in MASK */ + ldr MASK, =0x00800080 + /* Hold multiplier for destination in STRIDE_M */ + mov STRIDE_M, #255 + sub STRIDE_M, STRIDE_M, SRC, lsr #24 + /* Set GE[3:0] to 0101 so SEL instructions do what we want */ + uadd8 SCRATCH, MASK, MASK +.endm + +.macro over_n_8888_process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, preload + pixld , numbytes, firstreg, DST, 0 +.endm + +.macro over_n_8888_1pixel dst + mul_8888_8 WK&dst, STRIDE_M, SCRATCH, MASK + uqadd8 WK&dst, WK&dst, SRC +.endm + +.macro over_n_8888_process_tail cond, numbytes, firstreg + .set PROCESS_REG, firstreg + .rept numbytes / 4 + over_n_8888_1pixel %(PROCESS_REG) + .set PROCESS_REG, PROCESS_REG+1 + .endr + pixst , numbytes, firstreg, DST +.endm + +generate_composite_function \ + pixman_composite_over_n_8888_asm_armv6, 0, 0, 32 \ + FLAG_DST_READWRITE | FLAG_BRANCH_OVER | FLAG_PROCESS_DOES_STORE \ + 2, /* prefetch distance */ \ + over_n_8888_init, \ + nop_macro, /* newline */ \ + nop_macro, /* cleanup */ \ + over_n_8888_process_head, \ + over_n_8888_process_tail + +/******************************************************************************/ diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd-asm.h b/source/libs/pixman/pixman-src/pixman/pixman-arm-simd-asm.h old mode 100755 new mode 100644 similarity index 90% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd-asm.h rename to source/libs/pixman/pixman-src/pixman/pixman-arm-simd-asm.h index 65436062b..da153c3f5 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd-asm.h +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-simd-asm.h @@ -76,6 +76,16 @@ .set FLAG_SPILL_LINE_VARS, 48 .set FLAG_PROCESS_CORRUPTS_SCRATCH, 0 .set FLAG_PROCESS_PRESERVES_SCRATCH, 64 +.set FLAG_PROCESS_PRESERVES_WK0, 0 +.set FLAG_PROCESS_CORRUPTS_WK0, 128 /* if possible, use the specified register(s) instead so WK0 can hold number of leading pixels */ +.set FLAG_PRELOAD_DST, 0 +.set FLAG_NO_PRELOAD_DST, 256 + +/* + * Number of bytes by which to adjust preload offset of destination + * buffer (allows preload instruction to be moved before the load(s)) + */ +.set DST_PRELOAD_BIAS, 0 /* * Offset into stack where mask and source pointer/stride can be accessed. @@ -86,6 +96,11 @@ .set ARGS_STACK_OFFSET, (9*4) #endif +/* + * Offset into stack where space allocated during init macro can be accessed. + */ +.set LOCALS_STACK_OFFSET, 0 + /* * Constants for selecting preferable prefetch type. */ @@ -196,8 +211,8 @@ PF add, SCRATCH, base, WK0, lsl #bpp_shift-dst_bpp_shift PF and, SCRATCH, SCRATCH, #31 PF rsb, SCRATCH, SCRATCH, WK0, lsl #bpp_shift-dst_bpp_shift - PF sub, SCRATCH, SCRATCH, #1 /* so now ranges are -16..-1 / 0..31 / 32..63 */ - PF movs, SCRATCH, SCRATCH, #32-6 /* so this sets NC / nc / Nc */ + PF sub, SCRATCH, SCRATCH, #1 /* so now ranges are -16..-1 / 0..31 / 32..63 */ + PF movs, SCRATCH, SCRATCH, lsl #32-6 /* so this sets NC / nc / Nc */ PF bcs, 61f PF bpl, 60f PF pld, [ptr, #32*(prefetch_distance+2)] @@ -359,23 +374,41 @@ .macro test_bits_1_0_ptr + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + movs SCRATCH, X, lsl #32-1 /* C,N = bits 1,0 of DST */ + .else movs SCRATCH, WK0, lsl #32-1 /* C,N = bits 1,0 of DST */ + .endif .endm .macro test_bits_3_2_ptr + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + movs SCRATCH, X, lsl #32-3 /* C,N = bits 3, 2 of DST */ + .else movs SCRATCH, WK0, lsl #32-3 /* C,N = bits 3, 2 of DST */ + .endif .endm .macro leading_15bytes process_head, process_tail /* On entry, WK0 bits 0-3 = number of bytes until destination is 16-byte aligned */ + .set DECREMENT_X, 1 + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + .set DECREMENT_X, 0 + sub X, X, WK0, lsr #dst_bpp_shift + str X, [sp, #LINE_SAVED_REG_COUNT*4] + mov X, WK0 + .endif /* Use unaligned loads in all cases for simplicity */ .if dst_w_bpp == 8 - conditional_process2 test_bits_1_0_ptr, mi, cs, process_head, process_tail, 1, 2, 1, 2, 1, 1, 1 + conditional_process2 test_bits_1_0_ptr, mi, cs, process_head, process_tail, 1, 2, 1, 2, 1, 1, DECREMENT_X .elseif dst_w_bpp == 16 test_bits_1_0_ptr - conditional_process1 cs, process_head, process_tail, 2, 2, 1, 1, 1 + conditional_process1 cs, process_head, process_tail, 2, 2, 1, 1, DECREMENT_X + .endif + conditional_process2 test_bits_3_2_ptr, mi, cs, process_head, process_tail, 4, 8, 1, 2, 1, 1, DECREMENT_X + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + ldr X, [sp, #LINE_SAVED_REG_COUNT*4] .endif - conditional_process2 test_bits_3_2_ptr, mi, cs, process_head, process_tail, 4, 8, 1, 2, 1, 1, 1 .endm .macro test_bits_3_2_pix @@ -414,7 +447,7 @@ preload_middle src_bpp, SRC, 0 preload_middle mask_bpp, MASK, 0 .endif - .if (dst_r_bpp > 0) && ((SUBBLOCK % 2) == 0) + .if (dst_r_bpp > 0) && ((SUBBLOCK % 2) == 0) && (((flags) & FLAG_NO_PRELOAD_DST) == 0) /* Because we know that writes are 16-byte aligned, it's relatively easy to ensure that * destination prefetches are 32-byte aligned. It's also the easiest channel to offset * preloads for, to achieve staggered prefetches for multiple channels, because there are @@ -437,11 +470,11 @@ .if dst_r_bpp > 0 tst DST, #16 bne 111f - process_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, 16 + process_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, 16 + DST_PRELOAD_BIAS b 112f 111: .endif - process_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, 0 + process_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, 0 + DST_PRELOAD_BIAS 112: /* Just before the final (prefetch_distance+1) 32-byte blocks, deal with final preloads */ .if (src_bpp*pix_per_block > 256) || (mask_bpp*pix_per_block > 256) || (dst_r_bpp*pix_per_block > 256) @@ -449,7 +482,9 @@ .endif preload_trailing src_bpp, src_bpp_shift, SRC preload_trailing mask_bpp, mask_bpp_shift, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_trailing dst_r_bpp, dst_bpp_shift, DST + .endif add X, X, #(prefetch_distance+2)*pix_per_block - 128/dst_w_bpp /* The remainder of the line is handled identically to the medium case */ medium_case_inner_loop_and_trailing_pixels process_head, process_tail,, exit_label, unaligned_src, unaligned_mask @@ -561,13 +596,7 @@ process_tail, \ process_inner_loop - .func fname - .global fname - /* For ELF format also set function visibility to hidden */ -#ifdef __ELF__ - .hidden fname - .type fname, %function -#endif + pixman_asm_function fname /* * Make some macro arguments globally visible and accessible @@ -679,7 +708,6 @@ SCRATCH .req r12 ORIG_W .req r14 /* width (pixels) */ -fname: push {r4-r11, lr} /* save all registers */ subs Y, Y, #1 @@ -705,6 +733,13 @@ fname: #endif init + + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + /* Reserve a word in which to store X during leading pixels */ + sub sp, sp, #4 + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET+4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET+4 + .endif lsl STRIDE_D, #dst_bpp_shift /* stride in bytes */ sub STRIDE_D, STRIDE_D, X, lsl #dst_bpp_shift @@ -734,42 +769,49 @@ fname: .if (flags) & FLAG_SPILL_LINE_VARS_WIDE /* This is stmdb sp!,{} */ .word 0xE92D0000 | LINE_SAVED_REGS + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4 .endif 151: /* New line */ newline preload_leading_step1 src_bpp, WK1, SRC preload_leading_step1 mask_bpp, WK2, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_leading_step1 dst_r_bpp, WK3, DST + .endif - tst DST, #15 + ands WK0, DST, #15 beq 154f - rsb WK0, DST, #0 /* bits 0-3 = number of leading bytes until destination aligned */ - .if (src_bpp != 0 && src_bpp != 2*dst_w_bpp) || (mask_bpp != 0 && mask_bpp != 2*dst_w_bpp) - PF and, WK0, WK0, #15 - .endif + rsb WK0, WK0, #16 /* number of leading bytes until destination aligned */ preload_leading_step2 src_bpp, src_bpp_shift, WK1, SRC preload_leading_step2 mask_bpp, mask_bpp_shift, WK2, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_leading_step2 dst_r_bpp, dst_bpp_shift, WK3, DST + .endif leading_15bytes process_head, process_tail 154: /* Destination now 16-byte aligned; we have at least one prefetch on each channel as well as at least one 16-byte output block */ - .if (src_bpp > 0) && (mask_bpp == 0) && ((flags) & FLAG_PROCESS_PRESERVES_SCRATCH) + .if (src_bpp > 0) && (mask_bpp == 0) && ((flags) & FLAG_PROCESS_PRESERVES_SCRATCH) and SCRATCH, SRC, #31 rsb SCRATCH, SCRATCH, #32*prefetch_distance - .elseif (src_bpp == 0) && (mask_bpp > 0) && ((flags) & FLAG_PROCESS_PRESERVES_SCRATCH) + .elseif (src_bpp == 0) && (mask_bpp > 0) && ((flags) & FLAG_PROCESS_PRESERVES_SCRATCH) and SCRATCH, MASK, #31 rsb SCRATCH, SCRATCH, #32*prefetch_distance - .endif - .ifc "process_inner_loop","" + .endif + .ifc "process_inner_loop","" switch_on_alignment wide_case_inner_loop_and_trailing_pixels, process_head, process_tail, wide_case_inner_loop, 157f - .else + .else switch_on_alignment wide_case_inner_loop_and_trailing_pixels, process_head, process_tail, process_inner_loop, 157f - .endif + .endif 157: /* Check for another line */ end_of_line 1, %((flags) & FLAG_SPILL_LINE_VARS_WIDE), 151b + .if (flags) & FLAG_SPILL_LINE_VARS_WIDE + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4 + .endif .endif .ltorg @@ -779,17 +821,21 @@ fname: .if (flags) & FLAG_SPILL_LINE_VARS_NON_WIDE /* This is stmdb sp!,{} */ .word 0xE92D0000 | LINE_SAVED_REGS + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET + LINE_SAVED_REG_COUNT*4 .endif 161: /* New line */ newline preload_line 0, src_bpp, src_bpp_shift, SRC /* in: X, corrupts: WK0-WK1 */ preload_line 0, mask_bpp, mask_bpp_shift, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_line 0, dst_r_bpp, dst_bpp_shift, DST + .endif sub X, X, #128/dst_w_bpp /* simplifies inner loop termination */ - tst DST, #15 + ands WK0, DST, #15 beq 164f - rsb WK0, DST, #0 /* bits 0-3 = number of leading bytes until destination aligned */ + rsb WK0, WK0, #16 /* number of leading bytes until destination aligned */ leading_15bytes process_head, process_tail @@ -813,7 +859,9 @@ fname: newline preload_line 1, src_bpp, src_bpp_shift, SRC /* in: X, corrupts: WK0-WK1 */ preload_line 1, mask_bpp, mask_bpp_shift, MASK + .if ((flags) & FLAG_NO_PRELOAD_DST) == 0 preload_line 1, dst_r_bpp, dst_bpp_shift, DST + .endif .if dst_w_bpp == 8 tst DST, #3 @@ -844,12 +892,22 @@ fname: 177: /* Check for another line */ end_of_line %(dst_w_bpp < 32), %((flags) & FLAG_SPILL_LINE_VARS_NON_WIDE), 171b, last_one + .if (flags) & FLAG_SPILL_LINE_VARS_NON_WIDE + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET - LINE_SAVED_REG_COUNT*4 + .endif 197: .if (flags) & FLAG_SPILL_LINE_VARS add sp, sp, #LINE_SAVED_REG_COUNT*4 .endif 198: + .if (flags) & FLAG_PROCESS_CORRUPTS_WK0 + .set ARGS_STACK_OFFSET, ARGS_STACK_OFFSET-4 + .set LOCALS_STACK_OFFSET, LOCALS_STACK_OFFSET-4 + add sp, sp, #4 + .endif + cleanup #ifdef DEBUG_PARAMS diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd.c b/source/libs/pixman/pixman-src/pixman/pixman-arm-simd.c old mode 100755 new mode 100644 similarity index 79% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd.c rename to source/libs/pixman/pixman-src/pixman/pixman-arm-simd.c index af062e19d..f0d14540b --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm-simd.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-arm-simd.c @@ -41,11 +41,20 @@ PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_8_8, uint8_t, 1, uint8_t, 1) PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_0565_8888, uint16_t, 1, uint32_t, 1) +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, src_x888_0565, + uint32_t, 1, uint16_t, 1) PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, add_8_8, uint8_t, 1, uint8_t, 1) PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, over_8888_8888, uint32_t, 1, uint32_t, 1) +PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, in_reverse_8888_8888, + uint32_t, 1, uint32_t, 1) + +PIXMAN_ARM_BIND_FAST_PATH_N_DST (SKIP_ZERO_SRC, armv6, over_n_8888, + uint32_t, 1) +PIXMAN_ARM_BIND_FAST_PATH_N_DST (0, armv6, over_reverse_n_8888, + uint32_t, 1) PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, armv6, over_8888_n_8888, uint32_t, 1, uint32_t, 1) @@ -53,6 +62,9 @@ PIXMAN_ARM_BIND_FAST_PATH_SRC_N_DST (SKIP_ZERO_MASK, armv6, over_8888_n_8888, PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, armv6, over_n_8_8888, uint8_t, 1, uint32_t, 1) +PIXMAN_ARM_BIND_FAST_PATH_N_MASK_DST (SKIP_ZERO_SRC, armv6, over_n_8888_8888_ca, + uint32_t, 1, uint32_t, 1) + PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 0565_0565, SRC, uint16_t, uint16_t) PIXMAN_ARM_BIND_SCALED_NEAREST_SRC_DST (armv6, 8888_8888, SRC, @@ -216,6 +228,11 @@ static const pixman_fast_path_t arm_simd_fast_paths[] = PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, a8b8g8r8, armv6_composite_src_0565_8888), PIXMAN_STD_FAST_PATH (SRC, b5g6r5, null, x8b8g8r8, armv6_composite_src_0565_8888), + PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, r5g6b5, armv6_composite_src_x888_0565), + PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, r5g6b5, armv6_composite_src_x888_0565), + PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, b5g6r5, armv6_composite_src_x888_0565), + PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, b5g6r5, armv6_composite_src_x888_0565), + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, armv6_composite_over_8888_8888), PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, armv6_composite_over_8888_8888), PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, armv6_composite_over_8888_8888), @@ -225,6 +242,13 @@ static const pixman_fast_path_t arm_simd_fast_paths[] = PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, a8b8g8r8, armv6_composite_over_8888_n_8888), PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, solid, x8b8g8r8, armv6_composite_over_8888_n_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, null, a8r8g8b8, armv6_composite_over_n_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, null, x8r8g8b8, armv6_composite_over_n_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, null, a8b8g8r8, armv6_composite_over_n_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, null, x8b8g8r8, armv6_composite_over_n_8888), + PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8r8g8b8, armv6_composite_over_reverse_n_8888), + PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8b8g8r8, armv6_composite_over_reverse_n_8888), + PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, armv6_composite_add_8_8), PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, armv6_composite_over_n_8_8888), @@ -232,15 +256,25 @@ static const pixman_fast_path_t arm_simd_fast_paths[] = PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, armv6_composite_over_n_8_8888), PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, armv6_composite_over_n_8_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, r5g6b5, armv6_0565_0565), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, b5g6r5, armv6_0565_0565), + PIXMAN_STD_FAST_PATH (IN_REVERSE, a8r8g8b8, null, a8r8g8b8, armv6_composite_in_reverse_8888_8888), + PIXMAN_STD_FAST_PATH (IN_REVERSE, a8r8g8b8, null, x8r8g8b8, armv6_composite_in_reverse_8888_8888), + PIXMAN_STD_FAST_PATH (IN_REVERSE, a8b8g8r8, null, a8b8g8r8, armv6_composite_in_reverse_8888_8888), + PIXMAN_STD_FAST_PATH (IN_REVERSE, a8b8g8r8, null, x8b8g8r8, armv6_composite_in_reverse_8888_8888), + + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, armv6_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, armv6_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, armv6_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, armv6_composite_over_n_8888_8888_ca), + + SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, r5g6b5, armv6_0565_0565), + SIMPLE_NEAREST_FAST_PATH (SRC, b5g6r5, b5g6r5, armv6_0565_0565), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, armv6_8888_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, armv6_8888_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, armv6_8888_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, a8b8g8r8, armv6_8888_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, x8b8g8r8, armv6_8888_8888), - PIXMAN_ARM_SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, x8b8g8r8, armv6_8888_8888), + SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, armv6_8888_8888), + SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, armv6_8888_8888), + SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, armv6_8888_8888), + SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, a8b8g8r8, armv6_8888_8888), + SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, x8b8g8r8, armv6_8888_8888), + SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, x8b8g8r8, armv6_8888_8888), { PIXMAN_OP_NONE }, }; diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-arm.c b/source/libs/pixman/pixman-src/pixman/pixman-arm.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-arm.c rename to source/libs/pixman/pixman-src/pixman/pixman-arm.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-bits-image.c b/source/libs/pixman/pixman-src/pixman/pixman-bits-image.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-bits-image.c rename to source/libs/pixman/pixman-src/pixman/pixman-bits-image.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-combine-float.c b/source/libs/pixman/pixman-src/pixman/pixman-combine-float.c old mode 100755 new mode 100644 similarity index 80% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-combine-float.c rename to source/libs/pixman/pixman-src/pixman/pixman-combine-float.c index 5ea739f76..f5145bc9d --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-combine-float.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-combine-float.c @@ -319,23 +319,44 @@ MAKE_PD_COMBINERS (conjoint_xor, ONE_MINUS_DA_OVER_SA, ONE_MINUS_SA_OVER_DA) * * The following blend modes have been taken from the PDF ISO 32000 * specification, which at this point in time is available from - * http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf - * The relevant chapters are 11.3.5 and 11.3.6. + * + * http://www.adobe.com/devnet/pdf/pdf_reference.html + * + * The specific documents of interest are the PDF spec itself: + * + * http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf + * + * chapters 11.3.5 and 11.3.6 and a later supplement for Adobe Acrobat + * 9.1 and Reader 9.1: + * + * http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000_1.pdf + * + * that clarifies the specifications for blend modes ColorDodge and + * ColorBurn. + * * The formula for computing the final pixel color given in 11.3.6 is: - * αr × Cr = (1 – αs) × αb × Cb + (1 – αb) × αs × Cs + αb × αs × B(Cb, Cs) - * with B() being the blend function. - * Note that OVER is a special case of this operation, using B(Cb, Cs) = Cs - * - * These blend modes should match the SVG filter draft specification, as - * it has been designed to mirror ISO 32000. Note that at the current point - * no released draft exists that shows this, as the formulas have not been - * updated yet after the release of ISO 32000. - * - * The default implementation here uses the PDF_SEPARABLE_BLEND_MODE and - * PDF_NON_SEPARABLE_BLEND_MODE macros, which take the blend function as an - * argument. Note that this implementation operates on premultiplied colors, - * while the PDF specification does not. Therefore the code uses the formula - * ar.Cra = (1 – as) . Dca + (1 – ad) . Sca + B(Dca, ad, Sca, as) + * + * αr × Cr = (1 – αs) × αb × Cb + (1 – αb) × αs × Cs + αb × αs × B(Cb, Cs) + * + * with B() is the blend function. When B(Cb, Cs) = Cs, this formula + * reduces to the regular OVER operator. + * + * Cs and Cb are not premultiplied, so in our implementation we instead + * use: + * + * cr = (1 – αs) × cb + (1 – αb) × cs + αb × αs × B (cb/αb, cs/αs) + * + * where cr, cs, and cb are premultiplied colors, and where the + * + * αb × αs × B(cb/αb, cs/αs) + * + * part is first arithmetically simplified under the assumption that αb + * and αs are not 0, and then updated to produce a meaningful result when + * they are. + * + * For all the blend mode operators, the alpha channel is given by + * + * αr = αs + αb + αb × αs */ #define MAKE_SEPARABLE_PDF_COMBINERS(name) \ @@ -355,18 +376,55 @@ MAKE_PD_COMBINERS (conjoint_xor, ONE_MINUS_DA_OVER_SA, ONE_MINUS_SA_OVER_DA) \ MAKE_COMBINERS (name, combine_ ## name ## _a, combine_ ## name ## _c) +/* + * Multiply + * + * ad * as * B(d / ad, s / as) + * = ad * as * d/ad * s/as + * = d * s + * + */ static force_inline float blend_multiply (float sa, float s, float da, float d) { return d * s; } +/* + * Screen + * + * ad * as * B(d/ad, s/as) + * = ad * as * (d/ad + s/as - s/as * d/ad) + * = ad * s + as * d - s * d + */ static force_inline float blend_screen (float sa, float s, float da, float d) { return d * sa + s * da - s * d; } +/* + * Overlay + * + * ad * as * B(d/ad, s/as) + * = ad * as * Hardlight (s, d) + * = if (d / ad < 0.5) + * as * ad * Multiply (s/as, 2 * d/ad) + * else + * as * ad * Screen (s/as, 2 * d / ad - 1) + * = if (d < 0.5 * ad) + * as * ad * s/as * 2 * d /ad + * else + * as * ad * (s/as + 2 * d / ad - 1 - s / as * (2 * d / ad - 1)) + * = if (2 * d < ad) + * 2 * s * d + * else + * ad * s + 2 * as * d - as * ad - ad * s * (2 * d / ad - 1) + * = if (2 * d < ad) + * 2 * s * d + * else + * as * ad - 2 * (ad - d) * (as - s) + */ static force_inline float blend_overlay (float sa, float s, float da, float d) { @@ -376,6 +434,13 @@ blend_overlay (float sa, float s, float da, float d) return sa * da - 2 * (da - d) * (sa - s); } +/* + * Darken + * + * ad * as * B(d/ad, s/as) + * = ad * as * MIN(d/ad, s/as) + * = MIN (as * d, ad * s) + */ static force_inline float blend_darken (float sa, float s, float da, float d) { @@ -388,6 +453,13 @@ blend_darken (float sa, float s, float da, float d) return s; } +/* + * Lighten + * + * ad * as * B(d/ad, s/as) + * = ad * as * MAX(d/ad, s/as) + * = MAX (as * d, ad * s) + */ static force_inline float blend_lighten (float sa, float s, float da, float d) { @@ -400,6 +472,24 @@ blend_lighten (float sa, float s, float da, float d) return d; } +/* + * Color dodge + * + * ad * as * B(d/ad, s/as) + * = if d/ad = 0 + * ad * as * 0 + * else if (d/ad >= (1 - s/as) + * ad * as * 1 + * else + * ad * as * ((d/ad) / (1 - s/as)) + * = if d = 0 + * 0 + * elif as * d >= ad * (as - s) + * ad * as + * else + * as * (as * d / (as - s)) + * + */ static force_inline float blend_color_dodge (float sa, float s, float da, float d) { @@ -413,6 +503,26 @@ blend_color_dodge (float sa, float s, float da, float d) return sa * sa * d / (sa - s); } +/* + * Color burn + * + * We modify the first clause "if d = 1" to "if d >= 1" since with + * premultiplied colors d > 1 can actually happen. + * + * ad * as * B(d/ad, s/as) + * = if d/ad >= 1 + * ad * as * 1 + * elif (1 - d/ad) >= s/as + * ad * as * 0 + * else + * ad * as * (1 - ((1 - d/ad) / (s/as))) + * = if d >= ad + * ad * as + * elif as * ad - as * d >= ad * s + * 0 + * else + * ad * as - as * as * (ad - d) / s + */ static force_inline float blend_color_burn (float sa, float s, float da, float d) { @@ -426,6 +536,23 @@ blend_color_burn (float sa, float s, float da, float d) return sa * (da - sa * (da - d) / s); } +/* + * Hard light + * + * ad * as * B(d/ad, s/as) + * = if (s/as <= 0.5) + * ad * as * Multiply (d/ad, 2 * s/as) + * else + * ad * as * Screen (d/ad, 2 * s/as - 1) + * = if 2 * s <= as + * ad * as * d/ad * 2 * s / as + * else + * ad * as * (d/ad + (2 * s/as - 1) + d/ad * (2 * s/as - 1)) + * = if 2 * s <= as + * 2 * s * d + * else + * as * ad - 2 * (ad - d) * (as - s) + */ static force_inline float blend_hard_light (float sa, float s, float da, float d) { @@ -435,10 +562,27 @@ blend_hard_light (float sa, float s, float da, float d) return sa * da - 2 * (da - d) * (sa - s); } +/* + * Soft light + * + * ad * as * B(d/ad, s/as) + * = if (s/as <= 0.5) + * ad * as * (d/ad - (1 - 2 * s/as) * d/ad * (1 - d/ad)) + * else if (d/ad <= 0.25) + * ad * as * (d/ad + (2 * s/as - 1) * ((((16 * d/ad - 12) * d/ad + 4) * d/ad) - d/ad)) + * else + * ad * as * (d/ad + (2 * s/as - 1) * sqrt (d/ad)) + * = if (2 * s <= as) + * d * as - d * (ad - d) * (as - 2 * s) / ad; + * else if (4 * d <= ad) + * (2 * s - as) * d * ((16 * d / ad - 12) * d / ad + 3); + * else + * d * as + (sqrt (d * ad) - d) * (2 * s - as); + */ static force_inline float blend_soft_light (float sa, float s, float da, float d) { - if (2 * s < sa) + if (2 * s <= sa) { if (FLOAT_IS_ZERO (da)) return d * sa; @@ -449,7 +593,7 @@ blend_soft_light (float sa, float s, float da, float d) { if (FLOAT_IS_ZERO (da)) { - return 0.0f; + return d * sa; } else { @@ -461,6 +605,20 @@ blend_soft_light (float sa, float s, float da, float d) } } +/* + * Difference + * + * ad * as * B(s/as, d/ad) + * = ad * as * abs (s/as - d/ad) + * = if (s/as <= d/ad) + * ad * as * (d/ad - s/as) + * else + * ad * as * (s/as - d/ad) + * = if (ad * s <= as * d) + * as * d - ad * s + * else + * ad * s - as * d + */ static force_inline float blend_difference (float sa, float s, float da, float d) { @@ -473,6 +631,13 @@ blend_difference (float sa, float s, float da, float d) return sda - dsa; } +/* + * Exclusion + * + * ad * as * B(s/as, d/ad) + * = ad * as * (d/ad + s/as - 2 * d/ad * s/as) + * = as * d + ad * s - 2 * s * d + */ static force_inline float blend_exclusion (float sa, float s, float da, float d) { @@ -492,116 +657,79 @@ MAKE_SEPARABLE_PDF_COMBINERS (difference) MAKE_SEPARABLE_PDF_COMBINERS (exclusion) /* - * PDF nonseperable blend modes. - * - * These are implemented using the following functions to operate in Hsl - * space, with Cmax, Cmid, Cmin referring to the max, mid and min value - * of the red, green and blue components. + * PDF nonseperable blend modes are implemented using the following functions + * to operate in Hsl space, with Cmax, Cmid, Cmin referring to the max, mid + * and min value of the red, green and blue components. * * LUM (C) = 0.3 × Cred + 0.59 × Cgreen + 0.11 × Cblue * * clip_color (C): - * l = LUM (C) - * min = Cmin - * max = Cmax - * if n < 0.0 - * C = l + (((C – l) × l) ⁄ (l – min)) - * if x > 1.0 - * C = l + (((C – l) × (1 – l)) (max – l)) - * return C + * l = LUM (C) + * min = Cmin + * max = Cmax + * if n < 0.0 + * C = l + (((C – l) × l) ⁄ (l – min)) + * if x > 1.0 + * C = l + (((C – l) × (1 – l) ) ⁄ (max – l)) + * return C * * set_lum (C, l): - * d = l – LUM (C) - * C += d - * return clip_color (C) + * d = l – LUM (C) + * C += d + * return clip_color (C) * * SAT (C) = CH_MAX (C) - CH_MIN (C) * * set_sat (C, s): - * if Cmax > Cmin - * Cmid = ( ( ( Cmid – Cmin ) × s ) ⁄ ( Cmax – Cmin ) ) - * Cmax = s - * else - * Cmid = Cmax = 0.0 - * Cmin = 0.0 - * return C + * if Cmax > Cmin + * Cmid = ( ( ( Cmid – Cmin ) × s ) ⁄ ( Cmax – Cmin ) ) + * Cmax = s + * else + * Cmid = Cmax = 0.0 + * Cmin = 0.0 + * return C */ /* For premultiplied colors, we need to know what happens when C is * multiplied by a real number. LUM and SAT are linear: * - * LUM (r × C) = r × LUM (C) SAT (r × C) = r × SAT (C) + * LUM (r × C) = r × LUM (C) SAT (r * C) = r * SAT (C) * * If we extend clip_color with an extra argument a and change * - * if x >= 1.0 + * if x >= 1.0 * * into * - * if x >= a + * if x >= a * * then clip_color is also linear: * - * r * clip_color (C, a) = clip_color (r_c, ra); + * r * clip_color (C, a) = clip_color (r * C, r * a); * * for positive r. * * Similarly, we can extend set_lum with an extra argument that is just passed * on to clip_color: * - * r × set_lum ( C, l, a) + * r * set_lum (C, l, a) * - * = r × clip_color ( C + l - LUM (C), a) + * = r × clip_color (C + l - LUM (C), a) * - * = clip_color ( r * C + r × l - LUM (r × C), r * a) + * = clip_color (r * C + r × l - r * LUM (C), r * a) * - * = set_lum ( r * C, r * l, r * a) + * = set_lum (r * C, r * l, r * a) * * Finally, set_sat: * - * r * set_sat (C, s) = set_sat (x * C, r * s) + * r * set_sat (C, s) = set_sat (x * C, r * s) * - * The above holds for all non-zero x because they x'es in the fraction for + * The above holds for all non-zero x, because the x'es in the fraction for * C_mid cancel out. Specifically, it holds for x = r: * - * r * set_sat (C, s) = set_sat (r_c, rs) - * - * - * - * - * So, for the non-separable PDF blend modes, we have (using s, d for - * non-premultiplied colors, and S, D for premultiplied: - * - * Color: - * - * a_s * a_d * B(s, d) - * = a_s * a_d * set_lum (S/a_s, LUM (D/a_d), 1) - * = set_lum (S * a_d, a_s * LUM (D), a_s * a_d) - * - * - * Luminosity: - * - * a_s * a_d * B(s, d) - * = a_s * a_d * set_lum (D/a_d, LUM(S/a_s), 1) - * = set_lum (a_s * D, a_d * LUM(S), a_s * a_d) - * - * - * Saturation: - * - * a_s * a_d * B(s, d) - * = a_s * a_d * set_lum (set_sat (D/a_d, SAT (S/a_s)), LUM (D/a_d), 1) - * = set_lum (a_s * a_d * set_sat (D/a_d, SAT (S/a_s)), - * a_s * LUM (D), a_s * a_d) - * = set_lum (set_sat (a_s * D, a_d * SAT (S), a_s * LUM (D), a_s * a_d)) - * - * Hue: - * - * a_s * a_d * B(s, d) - * = a_s * a_d * set_lum (set_sat (S/a_s, SAT (D/a_d)), LUM (D/a_d), 1) - * = set_lum (set_sat (a_d * S, a_s * SAT (D)), a_s * LUM (D), a_s * a_d) + * r * set_sat (C, s) = set_sat (r * C, r * s) * */ - typedef struct { float r; @@ -769,9 +897,12 @@ set_sat (rgb_t *src, float sat) *min = 0.0f; } -/* - * Hue: - * B(Cb, Cs) = set_lum (set_sat (Cs, SAT (Cb)), LUM (Cb)) +/* Hue: + * + * as * ad * B(s/as, d/as) + * = as * ad * set_lum (set_sat (s/as, SAT (d/ad)), LUM (d/ad), 1) + * = set_lum (set_sat (ad * s, as * SAT (d)), as * LUM (d), as * ad) + * */ static force_inline void blend_hsl_hue (rgb_t *res, @@ -786,9 +917,14 @@ blend_hsl_hue (rgb_t *res, set_lum (res, sa * da, get_lum (dest) * sa); } -/* - * Saturation: - * B(Cb, Cs) = set_lum (set_sat (Cb, SAT (Cs)), LUM (Cb)) +/* + * Saturation + * + * as * ad * B(s/as, d/ad) + * = as * ad * set_lum (set_sat (d/ad, SAT (s/as)), LUM (d/ad), 1) + * = set_lum (as * ad * set_sat (d/ad, SAT (s/as)), + * as * LUM (d), as * ad) + * = set_lum (set_sat (as * d, ad * SAT (s), as * LUM (d), as * ad)) */ static force_inline void blend_hsl_saturation (rgb_t *res, @@ -803,9 +939,12 @@ blend_hsl_saturation (rgb_t *res, set_lum (res, sa * da, get_lum (dest) * sa); } -/* - * Color: - * B(Cb, Cs) = set_lum (Cs, LUM (Cb)) +/* + * Color + * + * as * ad * B(s/as, d/as) + * = as * ad * set_lum (s/as, LUM (d/ad), 1) + * = set_lum (s * ad, as * LUM (d), as * ad) */ static force_inline void blend_hsl_color (rgb_t *res, @@ -820,8 +959,11 @@ blend_hsl_color (rgb_t *res, } /* - * Luminosity: - * B(Cb, Cs) = set_lum (Cb, LUM (Cs)) + * Luminosity + * + * as * ad * B(s/as, d/ad) + * = as * ad * set_lum (d/ad, LUM (s/as), 1) + * = set_lum (as * d, ad * LUM (s), as * ad) */ static force_inline void blend_hsl_luminosity (rgb_t *res, diff --git a/source/libs/pixman/pixman-src/pixman/pixman-combine32.c b/source/libs/pixman/pixman-src/pixman/pixman-combine32.c new file mode 100644 index 000000000..4c484d3e3 --- /dev/null +++ b/source/libs/pixman/pixman-src/pixman/pixman-combine32.c @@ -0,0 +1,1189 @@ +/* + * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. + * 2005 Lars Knoll & Zack Rusin, Trolltech + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <math.h> +#include <string.h> + +#include "pixman-private.h" +#include "pixman-combine32.h" + +/* component alpha helper functions */ + +static void +combine_mask_ca (uint32_t *src, uint32_t *mask) +{ + uint32_t a = *mask; + + uint32_t x; + uint16_t xa; + + if (!a) + { + *(src) = 0; + return; + } + + x = *(src); + if (a == ~0) + { + x = x >> A_SHIFT; + x |= x << G_SHIFT; + x |= x << R_SHIFT; + *(mask) = x; + return; + } + + xa = x >> A_SHIFT; + UN8x4_MUL_UN8x4 (x, a); + *(src) = x; + + UN8x4_MUL_UN8 (a, xa); + *(mask) = a; +} + +static void +combine_mask_value_ca (uint32_t *src, const uint32_t *mask) +{ + uint32_t a = *mask; + uint32_t x; + + if (!a) + { + *(src) = 0; + return; + } + + if (a == ~0) + return; + + x = *(src); + UN8x4_MUL_UN8x4 (x, a); + *(src) = x; +} + +static void +combine_mask_alpha_ca (const uint32_t *src, uint32_t *mask) +{ + uint32_t a = *(mask); + uint32_t x; + + if (!a) + return; + + x = *(src) >> A_SHIFT; + if (x == MASK) + return; + + if (a == ~0) + { + x |= x << G_SHIFT; + x |= x << R_SHIFT; + *(mask) = x; + return; + } + + UN8x4_MUL_UN8 (a, x); + *(mask) = a; +} + +/* + * There are two ways of handling alpha -- either as a single unified value or + * a separate value for each component, hence each macro must have two + * versions. The unified alpha version has a 'u' at the end of the name, + * the component version has a 'ca'. Similarly, functions which deal with + * this difference will have two versions using the same convention. + */ + +static force_inline uint32_t +combine_mask (const uint32_t *src, const uint32_t *mask, int i) +{ + uint32_t s, m; + + if (mask) + { + m = *(mask + i) >> A_SHIFT; + + if (!m) + return 0; + } + + s = *(src + i); + + if (mask) + UN8x4_MUL_UN8 (s, m); + + return s; +} + +static void +combine_clear (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + memset (dest, 0, width * sizeof (uint32_t)); +} + +static void +combine_dst (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + return; +} + +static void +combine_src_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + if (!mask) + { + memcpy (dest, src, width * sizeof (uint32_t)); + } + else + { + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + + *(dest + i) = s; + } + } +} + +static void +combine_over_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + if (!mask) + { + for (i = 0; i < width; ++i) + { + uint32_t s = *(src + i); + uint32_t a = ALPHA_8 (s); + if (a == 0xFF) + { + *(dest + i) = s; + } + else if (s) + { + uint32_t d = *(dest + i); + uint32_t ia = a ^ 0xFF; + UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s); + *(dest + i) = d; + } + } + } + else + { + for (i = 0; i < width; ++i) + { + uint32_t m = ALPHA_8 (*(mask + i)); + if (m == 0xFF) + { + uint32_t s = *(src + i); + uint32_t a = ALPHA_8 (s); + if (a == 0xFF) + { + *(dest + i) = s; + } + else if (s) + { + uint32_t d = *(dest + i); + uint32_t ia = a ^ 0xFF; + UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s); + *(dest + i) = d; + } + } + else if (m) + { + uint32_t s = *(src + i); + if (s) + { + uint32_t d = *(dest + i); + UN8x4_MUL_UN8 (s, m); + UN8x4_MUL_UN8_ADD_UN8x4 (d, ALPHA_8 (~s), s); + *(dest + i) = d; + } + } + } + } +} + +static void +combine_over_reverse_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t d = *(dest + i); + uint32_t ia = ALPHA_8 (~*(dest + i)); + UN8x4_MUL_UN8_ADD_UN8x4 (s, ia, d); + *(dest + i) = s; + } +} + +static void +combine_in_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t a = ALPHA_8 (*(dest + i)); + UN8x4_MUL_UN8 (s, a); + *(dest + i) = s; + } +} + +static void +combine_in_reverse_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t d = *(dest + i); + uint32_t a = ALPHA_8 (s); + UN8x4_MUL_UN8 (d, a); + *(dest + i) = d; + } +} + +static void +combine_out_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t a = ALPHA_8 (~*(dest + i)); + UN8x4_MUL_UN8 (s, a); + *(dest + i) = s; + } +} + +static void +combine_out_reverse_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t d = *(dest + i); + uint32_t a = ALPHA_8 (~s); + UN8x4_MUL_UN8 (d, a); + *(dest + i) = d; + } +} + +static void +combine_atop_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t d = *(dest + i); + uint32_t dest_a = ALPHA_8 (d); + uint32_t src_ia = ALPHA_8 (~s); + + UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_a, d, src_ia); + *(dest + i) = s; + } +} + +static void +combine_atop_reverse_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t d = *(dest + i); + uint32_t src_a = ALPHA_8 (s); + uint32_t dest_ia = ALPHA_8 (~d); + + UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_a); + *(dest + i) = s; + } +} + +static void +combine_xor_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t d = *(dest + i); + uint32_t src_ia = ALPHA_8 (~s); + uint32_t dest_ia = ALPHA_8 (~d); + + UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (s, dest_ia, d, src_ia); + *(dest + i) = s; + } +} + +static void +combine_add_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t d = *(dest + i); + UN8x4_ADD_UN8x4 (d, s); + *(dest + i) = d; + } +} + +/* + * PDF blend modes: + * + * The following blend modes have been taken from the PDF ISO 32000 + * specification, which at this point in time is available from + * + * http://www.adobe.com/devnet/pdf/pdf_reference.html + * + * The specific documents of interest are the PDF spec itself: + * + * http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf + * + * chapters 11.3.5 and 11.3.6 and a later supplement for Adobe Acrobat + * 9.1 and Reader 9.1: + * + * http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000_1.pdf + * + * that clarifies the specifications for blend modes ColorDodge and + * ColorBurn. + * + * The formula for computing the final pixel color given in 11.3.6 is: + * + * αr × Cr = (1 – αs) × αb × Cb + (1 – αb) × αs × Cs + αb × αs × B(Cb, Cs) + * + * with B() is the blend function. When B(Cb, Cs) = Cs, this formula + * reduces to the regular OVER operator. + * + * Cs and Cb are not premultiplied, so in our implementation we instead + * use: + * + * cr = (1 – αs) × cb + (1 – αb) × cs + αb × αs × B (cb/αb, cs/αs) + * + * where cr, cs, and cb are premultiplied colors, and where the + * + * αb × αs × B(cb/αb, cs/αs) + * + * part is first arithmetically simplified under the assumption that αb + * and αs are not 0, and then updated to produce a meaningful result when + * they are. + * + * For all the blend mode operators, the alpha channel is given by + * + * αr = αs + αb + αb × αs + */ + +/* + * Multiply + * + * ad * as * B(d / ad, s / as) + * = ad * as * d/ad * s/as + * = d * s + * + */ +static void +combine_multiply_u (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = combine_mask (src, mask, i); + uint32_t d = *(dest + i); + uint32_t ss = s; + uint32_t src_ia = ALPHA_8 (~s); + uint32_t dest_ia = ALPHA_8 (~d); + + UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8 (ss, dest_ia, d, src_ia); + UN8x4_MUL_UN8x4 (d, s); + UN8x4_ADD_UN8x4 (d, ss); + + *(dest + i) = d; + } +} + +static void +combine_multiply_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t m = *(mask + i); + uint32_t s = *(src + i); + uint32_t d = *(dest + i); + uint32_t r = d; + uint32_t dest_ia = ALPHA_8 (~d); + + combine_mask_ca (&s, &m); + + UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (r, ~m, s, dest_ia); + UN8x4_MUL_UN8x4 (d, s); + UN8x4_ADD_UN8x4 (r, d); + + *(dest + i) = r; + } +} + +#define CLAMP(v, low, high) \ + do \ + { \ + if (v < (low)) \ + v = (low); \ + if (v > (high)) \ + v = (high); \ + } while (0) + +#define PDF_SEPARABLE_BLEND_MODE(name) \ + static void \ + combine_ ## name ## _u (pixman_implementation_t *imp, \ + pixman_op_t op, \ + uint32_t * dest, \ + const uint32_t * src, \ + const uint32_t * mask, \ + int width) \ + { \ + int i; \ + for (i = 0; i < width; ++i) \ + { \ + uint32_t s = combine_mask (src, mask, i); \ + uint32_t d = *(dest + i); \ + uint8_t sa = ALPHA_8 (s); \ + uint8_t isa = ~sa; \ + uint8_t da = ALPHA_8 (d); \ + uint8_t ida = ~da; \ + int32_t ra, rr, rg, rb; \ + \ + ra = da * 0xff + sa * 0xff - sa * da; \ + rr = isa * RED_8 (d) + ida * RED_8 (s); \ + rg = isa * GREEN_8 (d) + ida * GREEN_8 (s); \ + rb = isa * BLUE_8 (d) + ida * BLUE_8 (s); \ + \ + rr += blend_ ## name (RED_8 (d), da, RED_8 (s), sa); \ + rg += blend_ ## name (GREEN_8 (d), da, GREEN_8 (s), sa); \ + rb += blend_ ## name (BLUE_8 (d), da, BLUE_8 (s), sa); \ + \ + CLAMP (ra, 0, 255 * 255); \ + CLAMP (rr, 0, 255 * 255); \ + CLAMP (rg, 0, 255 * 255); \ + CLAMP (rb, 0, 255 * 255); \ + \ + ra = DIV_ONE_UN8 (ra); \ + rr = DIV_ONE_UN8 (rr); \ + rg = DIV_ONE_UN8 (rg); \ + rb = DIV_ONE_UN8 (rb); \ + \ + *(dest + i) = ra << 24 | rr << 16 | rg << 8 | rb; \ + } \ + } \ + \ + static void \ + combine_ ## name ## _ca (pixman_implementation_t *imp, \ + pixman_op_t op, \ + uint32_t * dest, \ + const uint32_t * src, \ + const uint32_t * mask, \ + int width) \ + { \ + int i; \ + for (i = 0; i < width; ++i) \ + { \ + uint32_t m = *(mask + i); \ + uint32_t s = *(src + i); \ + uint32_t d = *(dest + i); \ + uint8_t da = ALPHA_8 (d); \ + uint8_t ida = ~da; \ + int32_t ra, rr, rg, rb; \ + uint8_t ira, iga, iba; \ + \ + combine_mask_ca (&s, &m); \ + \ + ira = ~RED_8 (m); \ + iga = ~GREEN_8 (m); \ + iba = ~BLUE_8 (m); \ + \ + ra = da * 0xff + ALPHA_8 (s) * 0xff - ALPHA_8 (s) * da; \ + rr = ira * RED_8 (d) + ida * RED_8 (s); \ + rg = iga * GREEN_8 (d) + ida * GREEN_8 (s); \ + rb = iba * BLUE_8 (d) + ida * BLUE_8 (s); \ + \ + rr += blend_ ## name (RED_8 (d), da, RED_8 (s), RED_8 (m)); \ + rg += blend_ ## name (GREEN_8 (d), da, GREEN_8 (s), GREEN_8 (m)); \ + rb += blend_ ## name (BLUE_8 (d), da, BLUE_8 (s), BLUE_8 (m)); \ + \ + CLAMP (ra, 0, 255 * 255); \ + CLAMP (rr, 0, 255 * 255); \ + CLAMP (rg, 0, 255 * 255); \ + CLAMP (rb, 0, 255 * 255); \ + \ + ra = DIV_ONE_UN8 (ra); \ + rr = DIV_ONE_UN8 (rr); \ + rg = DIV_ONE_UN8 (rg); \ + rb = DIV_ONE_UN8 (rb); \ + \ + *(dest + i) = ra << 24 | rr << 16 | rg << 8 | rb; \ + } \ + } + +/* + * Screen + * + * ad * as * B(d/ad, s/as) + * = ad * as * (d/ad + s/as - s/as * d/ad) + * = ad * s + as * d - s * d + */ +static inline int32_t +blend_screen (int32_t d, int32_t ad, int32_t s, int32_t as) +{ + return s * ad + d * as - s * d; +} + +PDF_SEPARABLE_BLEND_MODE (screen) + +/* + * Overlay + * + * ad * as * B(d/ad, s/as) + * = ad * as * Hardlight (s, d) + * = if (d / ad < 0.5) + * as * ad * Multiply (s/as, 2 * d/ad) + * else + * as * ad * Screen (s/as, 2 * d / ad - 1) + * = if (d < 0.5 * ad) + * as * ad * s/as * 2 * d /ad + * else + * as * ad * (s/as + 2 * d / ad - 1 - s / as * (2 * d / ad - 1)) + * = if (2 * d < ad) + * 2 * s * d + * else + * ad * s + 2 * as * d - as * ad - ad * s * (2 * d / ad - 1) + * = if (2 * d < ad) + * 2 * s * d + * else + * as * ad - 2 * (ad - d) * (as - s) + */ +static inline int32_t +blend_overlay (int32_t d, int32_t ad, int32_t s, int32_t as) +{ + uint32_t r; + + if (2 * d < ad) + r = 2 * s * d; + else + r = as * ad - 2 * (ad - d) * (as - s); + + return r; +} + +PDF_SEPARABLE_BLEND_MODE (overlay) + +/* + * Darken + * + * ad * as * B(d/ad, s/as) + * = ad * as * MIN(d/ad, s/as) + * = MIN (as * d, ad * s) + */ +static inline int32_t +blend_darken (int32_t d, int32_t ad, int32_t s, int32_t as) +{ + s = ad * s; + d = as * d; + + return s > d ? d : s; +} + +PDF_SEPARABLE_BLEND_MODE (darken) + +/* + * Lighten + * + * ad * as * B(d/ad, s/as) + * = ad * as * MAX(d/ad, s/as) + * = MAX (as * d, ad * s) + */ +static inline int32_t +blend_lighten (int32_t d, int32_t ad, int32_t s, int32_t as) +{ + s = ad * s; + d = as * d; + + return s > d ? s : d; +} + +PDF_SEPARABLE_BLEND_MODE (lighten) + +/* + * Hard light + * + * ad * as * B(d/ad, s/as) + * = if (s/as <= 0.5) + * ad * as * Multiply (d/ad, 2 * s/as) + * else + * ad * as * Screen (d/ad, 2 * s/as - 1) + * = if 2 * s <= as + * ad * as * d/ad * 2 * s / as + * else + * ad * as * (d/ad + (2 * s/as - 1) + d/ad * (2 * s/as - 1)) + * = if 2 * s <= as + * 2 * s * d + * else + * as * ad - 2 * (ad - d) * (as - s) + */ +static inline int32_t +blend_hard_light (int32_t d, int32_t ad, int32_t s, int32_t as) +{ + if (2 * s < as) + return 2 * s * d; + else + return as * ad - 2 * (ad - d) * (as - s); +} + +PDF_SEPARABLE_BLEND_MODE (hard_light) + +/* + * Difference + * + * ad * as * B(s/as, d/ad) + * = ad * as * abs (s/as - d/ad) + * = if (s/as <= d/ad) + * ad * as * (d/ad - s/as) + * else + * ad * as * (s/as - d/ad) + * = if (ad * s <= as * d) + * as * d - ad * s + * else + * ad * s - as * d + */ +static inline int32_t +blend_difference (int32_t d, int32_t ad, int32_t s, int32_t as) +{ + int32_t das = d * as; + int32_t sad = s * ad; + + if (sad < das) + return das - sad; + else + return sad - das; +} + +PDF_SEPARABLE_BLEND_MODE (difference) + +/* + * Exclusion + * + * ad * as * B(s/as, d/ad) + * = ad * as * (d/ad + s/as - 2 * d/ad * s/as) + * = as * d + ad * s - 2 * s * d + */ + +/* This can be made faster by writing it directly and not using + * PDF_SEPARABLE_BLEND_MODE, but that's a performance optimization */ + +static inline int32_t +blend_exclusion (int32_t d, int32_t ad, int32_t s, int32_t as) +{ + return s * ad + d * as - 2 * d * s; +} + +PDF_SEPARABLE_BLEND_MODE (exclusion) + +#undef PDF_SEPARABLE_BLEND_MODE + +/* Component alpha combiners */ + +static void +combine_clear_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + memset (dest, 0, width * sizeof(uint32_t)); +} + +static void +combine_src_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = *(src + i); + uint32_t m = *(mask + i); + + combine_mask_value_ca (&s, &m); + + *(dest + i) = s; + } +} + +static void +combine_over_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = *(src + i); + uint32_t m = *(mask + i); + uint32_t a; + + combine_mask_ca (&s, &m); + + a = ~m; + if (a) + { + uint32_t d = *(dest + i); + UN8x4_MUL_UN8x4_ADD_UN8x4 (d, a, s); + s = d; + } + + *(dest + i) = s; + } +} + +static void +combine_over_reverse_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t d = *(dest + i); + uint32_t a = ~d >> A_SHIFT; + + if (a) + { + uint32_t s = *(src + i); + uint32_t m = *(mask + i); + + UN8x4_MUL_UN8x4 (s, m); + UN8x4_MUL_UN8_ADD_UN8x4 (s, a, d); + + *(dest + i) = s; + } + } +} + +static void +combine_in_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t d = *(dest + i); + uint16_t a = d >> A_SHIFT; + uint32_t s = 0; + + if (a) + { + uint32_t m = *(mask + i); + + s = *(src + i); + combine_mask_value_ca (&s, &m); + + if (a != MASK) + UN8x4_MUL_UN8 (s, a); + } + + *(dest + i) = s; + } +} + +static void +combine_in_reverse_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = *(src + i); + uint32_t m = *(mask + i); + uint32_t a; + + combine_mask_alpha_ca (&s, &m); + + a = m; + if (a != ~0) + { + uint32_t d = 0; + + if (a) + { + d = *(dest + i); + UN8x4_MUL_UN8x4 (d, a); + } + + *(dest + i) = d; + } + } +} + +static void +combine_out_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t d = *(dest + i); + uint16_t a = ~d >> A_SHIFT; + uint32_t s = 0; + + if (a) + { + uint32_t m = *(mask + i); + + s = *(src + i); + combine_mask_value_ca (&s, &m); + + if (a != MASK) + UN8x4_MUL_UN8 (s, a); + } + + *(dest + i) = s; + } +} + +static void +combine_out_reverse_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = *(src + i); + uint32_t m = *(mask + i); + uint32_t a; + + combine_mask_alpha_ca (&s, &m); + + a = ~m; + if (a != ~0) + { + uint32_t d = 0; + + if (a) + { + d = *(dest + i); + UN8x4_MUL_UN8x4 (d, a); + } + + *(dest + i) = d; + } + } +} + +static void +combine_atop_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t d = *(dest + i); + uint32_t s = *(src + i); + uint32_t m = *(mask + i); + uint32_t ad; + uint16_t as = d >> A_SHIFT; + + combine_mask_ca (&s, &m); + + ad = ~m; + + UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ad, s, as); + + *(dest + i) = d; + } +} + +static void +combine_atop_reverse_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t d = *(dest + i); + uint32_t s = *(src + i); + uint32_t m = *(mask + i); + uint32_t ad; + uint16_t as = ~d >> A_SHIFT; + + combine_mask_ca (&s, &m); + + ad = m; + + UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ad, s, as); + + *(dest + i) = d; + } +} + +static void +combine_xor_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t d = *(dest + i); + uint32_t s = *(src + i); + uint32_t m = *(mask + i); + uint32_t ad; + uint16_t as = ~d >> A_SHIFT; + + combine_mask_ca (&s, &m); + + ad = ~m; + + UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8 (d, ad, s, as); + + *(dest + i) = d; + } +} + +static void +combine_add_ca (pixman_implementation_t *imp, + pixman_op_t op, + uint32_t * dest, + const uint32_t * src, + const uint32_t * mask, + int width) +{ + int i; + + for (i = 0; i < width; ++i) + { + uint32_t s = *(src + i); + uint32_t m = *(mask + i); + uint32_t d = *(dest + i); + + combine_mask_value_ca (&s, &m); + + UN8x4_ADD_UN8x4 (d, s); + + *(dest + i) = d; + } +} + +void +_pixman_setup_combiner_functions_32 (pixman_implementation_t *imp) +{ + /* Unified alpha */ + imp->combine_32[PIXMAN_OP_CLEAR] = combine_clear; + imp->combine_32[PIXMAN_OP_SRC] = combine_src_u; + imp->combine_32[PIXMAN_OP_DST] = combine_dst; + imp->combine_32[PIXMAN_OP_OVER] = combine_over_u; + imp->combine_32[PIXMAN_OP_OVER_REVERSE] = combine_over_reverse_u; + imp->combine_32[PIXMAN_OP_IN] = combine_in_u; + imp->combine_32[PIXMAN_OP_IN_REVERSE] = combine_in_reverse_u; + imp->combine_32[PIXMAN_OP_OUT] = combine_out_u; + imp->combine_32[PIXMAN_OP_OUT_REVERSE] = combine_out_reverse_u; + imp->combine_32[PIXMAN_OP_ATOP] = combine_atop_u; + imp->combine_32[PIXMAN_OP_ATOP_REVERSE] = combine_atop_reverse_u; + imp->combine_32[PIXMAN_OP_XOR] = combine_xor_u; + imp->combine_32[PIXMAN_OP_ADD] = combine_add_u; + + imp->combine_32[PIXMAN_OP_MULTIPLY] = combine_multiply_u; + imp->combine_32[PIXMAN_OP_SCREEN] = combine_screen_u; + imp->combine_32[PIXMAN_OP_OVERLAY] = combine_overlay_u; + imp->combine_32[PIXMAN_OP_DARKEN] = combine_darken_u; + imp->combine_32[PIXMAN_OP_LIGHTEN] = combine_lighten_u; + imp->combine_32[PIXMAN_OP_HARD_LIGHT] = combine_hard_light_u; + imp->combine_32[PIXMAN_OP_DIFFERENCE] = combine_difference_u; + imp->combine_32[PIXMAN_OP_EXCLUSION] = combine_exclusion_u; + + /* Component alpha combiners */ + imp->combine_32_ca[PIXMAN_OP_CLEAR] = combine_clear_ca; + imp->combine_32_ca[PIXMAN_OP_SRC] = combine_src_ca; + /* dest */ + imp->combine_32_ca[PIXMAN_OP_OVER] = combine_over_ca; + imp->combine_32_ca[PIXMAN_OP_OVER_REVERSE] = combine_over_reverse_ca; + imp->combine_32_ca[PIXMAN_OP_IN] = combine_in_ca; + imp->combine_32_ca[PIXMAN_OP_IN_REVERSE] = combine_in_reverse_ca; + imp->combine_32_ca[PIXMAN_OP_OUT] = combine_out_ca; + imp->combine_32_ca[PIXMAN_OP_OUT_REVERSE] = combine_out_reverse_ca; + imp->combine_32_ca[PIXMAN_OP_ATOP] = combine_atop_ca; + imp->combine_32_ca[PIXMAN_OP_ATOP_REVERSE] = combine_atop_reverse_ca; + imp->combine_32_ca[PIXMAN_OP_XOR] = combine_xor_ca; + imp->combine_32_ca[PIXMAN_OP_ADD] = combine_add_ca; + + imp->combine_32_ca[PIXMAN_OP_MULTIPLY] = combine_multiply_ca; + imp->combine_32_ca[PIXMAN_OP_SCREEN] = combine_screen_ca; + imp->combine_32_ca[PIXMAN_OP_OVERLAY] = combine_overlay_ca; + imp->combine_32_ca[PIXMAN_OP_DARKEN] = combine_darken_ca; + imp->combine_32_ca[PIXMAN_OP_LIGHTEN] = combine_lighten_ca; + imp->combine_32_ca[PIXMAN_OP_HARD_LIGHT] = combine_hard_light_ca; + imp->combine_32_ca[PIXMAN_OP_DIFFERENCE] = combine_difference_ca; + imp->combine_32_ca[PIXMAN_OP_EXCLUSION] = combine_exclusion_ca; +} diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-combine32.h b/source/libs/pixman/pixman-src/pixman/pixman-combine32.h old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-combine32.h rename to source/libs/pixman/pixman-src/pixman/pixman-combine32.h diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-compiler.h b/source/libs/pixman/pixman-src/pixman/pixman-compiler.h old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-compiler.h rename to source/libs/pixman/pixman-src/pixman/pixman-compiler.h diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-conical-gradient.c b/source/libs/pixman/pixman-src/pixman/pixman-conical-gradient.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-conical-gradient.c rename to source/libs/pixman/pixman-src/pixman/pixman-conical-gradient.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-edge-accessors.c b/source/libs/pixman/pixman-src/pixman/pixman-edge-accessors.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-edge-accessors.c rename to source/libs/pixman/pixman-src/pixman/pixman-edge-accessors.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-edge-imp.h b/source/libs/pixman/pixman-src/pixman/pixman-edge-imp.h old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-edge-imp.h rename to source/libs/pixman/pixman-src/pixman/pixman-edge-imp.h diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-edge.c b/source/libs/pixman/pixman-src/pixman/pixman-edge.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-edge.c rename to source/libs/pixman/pixman-src/pixman/pixman-edge.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-fast-path.c b/source/libs/pixman/pixman-src/pixman/pixman-fast-path.c old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-fast-path.c rename to source/libs/pixman/pixman-src/pixman/pixman-fast-path.c index c6e43de10..53d4a1f90 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-fast-path.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-fast-path.c @@ -2343,6 +2343,8 @@ fast_fetch_bilinear_cover (pixman_iter_t *iter, const uint32_t *mask) int32_t dist_y; int i; + COMPILE_TIME_ASSERT (BILINEAR_INTERPOLATION_BITS < 8); + fx = info->x; ux = iter->image->common.transform->matrix[0][0]; diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-filter.c b/source/libs/pixman/pixman-src/pixman/pixman-filter.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-filter.c rename to source/libs/pixman/pixman-src/pixman/pixman-filter.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-general.c b/source/libs/pixman/pixman-src/pixman/pixman-general.c old mode 100755 new mode 100644 similarity index 91% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-general.c rename to source/libs/pixman/pixman-src/pixman/pixman-general.c index f82ea7d71..6141cb0a3 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-general.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-general.c @@ -109,6 +109,20 @@ static const op_info_t op_flags[PIXMAN_N_OPERATORS] = #define SCANLINE_BUFFER_LENGTH 8192 +static pixman_bool_t +operator_needs_division (pixman_op_t op) +{ + static const uint8_t needs_division[] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, /* SATURATE */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, /* DISJOINT */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, /* CONJOINT */ + 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, /* blend ops */ + }; + + return needs_division[op]; +} + static void general_composite_rect (pixman_implementation_t *imp, pixman_composite_info_t *info) @@ -124,9 +138,10 @@ general_composite_rect (pixman_implementation_t *imp, int Bpp; int i; - if ((src_image->common.flags & FAST_PATH_NARROW_FORMAT) && - (!mask_image || mask_image->common.flags & FAST_PATH_NARROW_FORMAT) && - (dest_image->common.flags & FAST_PATH_NARROW_FORMAT)) + if ((src_image->common.flags & FAST_PATH_NARROW_FORMAT) && + (!mask_image || mask_image->common.flags & FAST_PATH_NARROW_FORMAT) && + (dest_image->common.flags & FAST_PATH_NARROW_FORMAT) && + !(operator_needs_division (op))) { width_flag = ITER_NARROW; Bpp = 4; @@ -143,9 +158,9 @@ general_composite_rect (pixman_implementation_t *imp, if (width <= 0 || _pixman_multiply_overflows_int (width, Bpp * 3)) return; - if (width * Bpp * 3 > sizeof (stack_scanline_buffer) - 32 * 3) + if (width * Bpp * 3 > sizeof (stack_scanline_buffer) - 15 * 3) { - scanline_buffer = pixman_malloc_ab_plus_c (width, Bpp * 3, 32 * 3); + scanline_buffer = pixman_malloc_ab_plus_c (width, Bpp * 3, 15 * 3); if (!scanline_buffer) return; @@ -181,11 +196,7 @@ general_composite_rect (pixman_implementation_t *imp, mask_image = NULL; } - component_alpha = - mask_image && - mask_image->common.type == BITS && - mask_image->common.component_alpha && - PIXMAN_FORMAT_RGB (mask_image->bits.format); + component_alpha = mask_image && mask_image->common.component_alpha; _pixman_implementation_iter_init ( imp->toplevel, &mask_iter, diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-glyph.c b/source/libs/pixman/pixman-src/pixman/pixman-glyph.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-glyph.c rename to source/libs/pixman/pixman-src/pixman/pixman-glyph.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-gradient-walker.c b/source/libs/pixman/pixman-src/pixman/pixman-gradient-walker.c old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-gradient-walker.c rename to source/libs/pixman/pixman-src/pixman/pixman-gradient-walker.c index 5944a559a..822f8e62b --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-gradient-walker.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-gradient-walker.c @@ -54,7 +54,7 @@ static void gradient_walker_reset (pixman_gradient_walker_t *walker, pixman_fixed_48_16_t pos) { - int32_t x, left_x, right_x; + int64_t x, left_x, right_x; pixman_color_t *left_c, *right_c; int n, count = walker->num_stops; pixman_gradient_stop_t *stops = walker->stops; diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-image.c b/source/libs/pixman/pixman-src/pixman/pixman-image.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-image.c rename to source/libs/pixman/pixman-src/pixman/pixman-image.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-implementation.c b/source/libs/pixman/pixman-src/pixman/pixman-implementation.c old mode 100755 new mode 100644 similarity index 96% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-implementation.c rename to source/libs/pixman/pixman-src/pixman/pixman-implementation.c index 588405451..2c7de4c68 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-implementation.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-implementation.c @@ -380,6 +380,11 @@ _pixman_disabled (const char *name) return FALSE; } +static const pixman_fast_path_t empty_fast_path[] = +{ + { PIXMAN_OP_NONE } +}; + pixman_implementation_t * _pixman_choose_implementation (void) { @@ -397,5 +402,16 @@ _pixman_choose_implementation (void) imp = _pixman_implementation_create_noop (imp); + if (_pixman_disabled ("wholeops")) + { + pixman_implementation_t *cur; + + /* Disable all whole-operation paths except the general one, + * so that optimized iterators are used as much as possible. + */ + for (cur = imp; cur->fallback; cur = cur->fallback) + cur->fast_paths = empty_fast_path; + } + return imp; } diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-inlines.h b/source/libs/pixman/pixman-src/pixman/pixman-inlines.h old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-inlines.h rename to source/libs/pixman/pixman-src/pixman/pixman-inlines.h index dd1c2f17f..1c8441d6d --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-inlines.h +++ b/source/libs/pixman/pixman-src/pixman/pixman-inlines.h @@ -747,7 +747,8 @@ fast_composite_scaled_nearest ## scale_func_name (pixman_implementation_t *imp, #define SIMPLE_NEAREST_SOLID_MASK_FAST_PATH(op,s,d,func) \ SIMPLE_NEAREST_SOLID_MASK_FAST_PATH_COVER (op,s,d,func), \ SIMPLE_NEAREST_SOLID_MASK_FAST_PATH_NONE (op,s,d,func), \ - SIMPLE_NEAREST_SOLID_MASK_FAST_PATH_PAD (op,s,d,func) + SIMPLE_NEAREST_SOLID_MASK_FAST_PATH_PAD (op,s,d,func), \ + SIMPLE_NEAREST_SOLID_MASK_FAST_PATH_NORMAL (op,s,d,func) /*****************************************************************************/ diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-linear-gradient.c b/source/libs/pixman/pixman-src/pixman/pixman-linear-gradient.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-linear-gradient.c rename to source/libs/pixman/pixman-src/pixman/pixman-linear-gradient.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-matrix.c b/source/libs/pixman/pixman-src/pixman/pixman-matrix.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-matrix.c rename to source/libs/pixman/pixman-src/pixman/pixman-matrix.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2-asm.S b/source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2-asm.S old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2-asm.S rename to source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2-asm.S index 866e93e58..9dad163b7 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2-asm.S +++ b/source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2-asm.S @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * Author: Nemanja Lukic (nlukic@mips.com) + * Author: Nemanja Lukic (nemanja.lukic@rt-rk.com) */ #include "pixman-private.h" diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2-asm.h b/source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2-asm.h old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2-asm.h rename to source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2-asm.h index 11849bd66..e23856619 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2-asm.h +++ b/source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2-asm.h @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * Author: Nemanja Lukic (nlukic@mips.com) + * Author: Nemanja Lukic (nemanja.lukic@rt-rk.com) */ #ifndef PIXMAN_MIPS_DSPR2_ASM_H @@ -72,10 +72,8 @@ #define LEAF_MIPS32R2(symbol) \ .globl symbol; \ .align 2; \ -#ifdef __ELF__ .hidden symbol; \ .type symbol, @function; \ -#endif .ent symbol, 0; \ symbol: .frame sp, 0, ra; \ .set push; \ diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2.c b/source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2.c old mode 100755 new mode 100644 similarity index 98% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2.c rename to source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2.c index e10c9df0a..87969ae70 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * Author: Nemanja Lukic (nlukic@mips.com) + * Author: Nemanja Lukic (nemanja.lukic@rt-rk.com) */ #ifdef HAVE_CONFIG_H @@ -388,11 +388,11 @@ static const pixman_fast_path_t mips_dspr2_fast_paths[] = SIMPLE_NEAREST_FAST_PATH_PAD (SRC, r5g6b5, a8r8g8b8, mips_0565_8888), SIMPLE_NEAREST_FAST_PATH_PAD (SRC, b5g6r5, a8b8g8r8, mips_0565_8888), - PIXMAN_MIPS_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8r8g8b8, r5g6b5, mips_8888_8_0565), - PIXMAN_MIPS_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8b8g8r8, b5g6r5, mips_8888_8_0565), + SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8r8g8b8, r5g6b5, mips_8888_8_0565), + SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, a8b8g8r8, b5g6r5, mips_8888_8_0565), - PIXMAN_MIPS_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, r5g6b5, r5g6b5, mips_0565_8_0565), - PIXMAN_MIPS_SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, b5g6r5, b5g6r5, mips_0565_8_0565), + SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, r5g6b5, r5g6b5, mips_0565_8_0565), + SIMPLE_NEAREST_A8_MASK_FAST_PATH (OVER, b5g6r5, b5g6r5, mips_0565_8_0565), SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, mips_8888_8888), SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, mips_8888_8888), diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2.h b/source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2.h old mode 100755 new mode 100644 similarity index 98% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2.h rename to source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2.h index 955ed70b8..57b38359e --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-dspr2.h +++ b/source/libs/pixman/pixman-src/pixman/pixman-mips-dspr2.h @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * Author: Nemanja Lukic (nlukic@mips.com) + * Author: Nemanja Lukic (nemanja.lukic@rt-rk.com) */ #ifndef PIXMAN_MIPS_DSPR2_H @@ -328,12 +328,6 @@ FAST_NEAREST_MAINLOOP_COMMON (mips_##name##_pad_##op, \ scaled_nearest_scanline_mips_##name##_##op, \ src_type, uint8_t, dst_type, PAD, TRUE, FALSE) -/* Provide entries for the fast path table */ -#define PIXMAN_MIPS_SIMPLE_NEAREST_A8_MASK_FAST_PATH(op,s,d,func) \ - SIMPLE_NEAREST_A8_MASK_FAST_PATH_COVER (op,s,d,func), \ - SIMPLE_NEAREST_A8_MASK_FAST_PATH_NONE (op,s,d,func), \ - SIMPLE_NEAREST_A8_MASK_FAST_PATH_PAD (op,s,d,func) - /****************************************************************************/ #define PIXMAN_MIPS_BIND_SCALED_BILINEAR_SRC_DST(flags, name, op, \ diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-memcpy-asm.S b/source/libs/pixman/pixman-src/pixman/pixman-mips-memcpy-asm.S old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-mips-memcpy-asm.S rename to source/libs/pixman/pixman-src/pixman/pixman-mips-memcpy-asm.S diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mips.c b/source/libs/pixman/pixman-src/pixman/pixman-mips.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-mips.c rename to source/libs/pixman/pixman-src/pixman/pixman-mips.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mmx.c b/source/libs/pixman/pixman-src/pixman/pixman-mmx.c old mode 100755 new mode 100644 similarity index 96% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-mmx.c rename to source/libs/pixman/pixman-src/pixman/pixman-mmx.c index f9a92ce09..dec397432 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-mmx.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-mmx.c @@ -89,21 +89,7 @@ _mm_mulhi_pu16 (__m64 __A, __m64 __B) return __A; } -# ifdef __OPTIMIZE__ -extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -_mm_shuffle_pi16 (__m64 __A, int8_t const __N) -{ - __m64 ret; - - asm ("pshufw %2, %1, %0\n\t" - : "=y" (ret) - : "y" (__A), "K" (__N) - ); - - return ret; -} -# else -# define _mm_shuffle_pi16(A, N) \ +# define _mm_shuffle_pi16(A, N) \ ({ \ __m64 ret; \ \ @@ -114,7 +100,6 @@ _mm_shuffle_pi16 (__m64 __A, int8_t const __N) \ ret; \ }) -# endif # endif #endif @@ -3555,6 +3540,105 @@ mmx_composite_over_reverse_n_8888 (pixman_implementation_t *imp, _mm_empty (); } +static force_inline void +scaled_nearest_scanline_mmx_8888_8888_OVER (uint32_t* pd, + const uint32_t* ps, + int32_t w, + pixman_fixed_t vx, + pixman_fixed_t unit_x, + pixman_fixed_t src_width_fixed, + pixman_bool_t fully_transparent_src) +{ + if (fully_transparent_src) + return; + + while (w) + { + __m64 d = load (pd); + __m64 s = load (ps + pixman_fixed_to_int (vx)); + vx += unit_x; + while (vx >= 0) + vx -= src_width_fixed; + + store8888 (pd, core_combine_over_u_pixel_mmx (s, d)); + pd++; + + w--; + } + + _mm_empty (); +} + +FAST_NEAREST_MAINLOOP (mmx_8888_8888_cover_OVER, + scaled_nearest_scanline_mmx_8888_8888_OVER, + uint32_t, uint32_t, COVER) +FAST_NEAREST_MAINLOOP (mmx_8888_8888_none_OVER, + scaled_nearest_scanline_mmx_8888_8888_OVER, + uint32_t, uint32_t, NONE) +FAST_NEAREST_MAINLOOP (mmx_8888_8888_pad_OVER, + scaled_nearest_scanline_mmx_8888_8888_OVER, + uint32_t, uint32_t, PAD) +FAST_NEAREST_MAINLOOP (mmx_8888_8888_normal_OVER, + scaled_nearest_scanline_mmx_8888_8888_OVER, + uint32_t, uint32_t, NORMAL) + +static force_inline void +scaled_nearest_scanline_mmx_8888_n_8888_OVER (const uint32_t * mask, + uint32_t * dst, + const uint32_t * src, + int32_t w, + pixman_fixed_t vx, + pixman_fixed_t unit_x, + pixman_fixed_t src_width_fixed, + pixman_bool_t zero_src) +{ + __m64 mm_mask; + + if (zero_src || (*mask >> 24) == 0) + { + /* A workaround for https://gcc.gnu.org/PR47759 */ + _mm_empty (); + return; + } + + mm_mask = expand_alpha (load8888 (mask)); + + while (w) + { + uint32_t s = *(src + pixman_fixed_to_int (vx)); + vx += unit_x; + while (vx >= 0) + vx -= src_width_fixed; + + if (s) + { + __m64 ms = load8888 (&s); + __m64 alpha = expand_alpha (ms); + __m64 dest = load8888 (dst); + + store8888 (dst, (in_over (ms, alpha, mm_mask, dest))); + } + + dst++; + w--; + } + + _mm_empty (); +} + +FAST_NEAREST_MAINLOOP_COMMON (mmx_8888_n_8888_cover_OVER, + scaled_nearest_scanline_mmx_8888_n_8888_OVER, + uint32_t, uint32_t, uint32_t, COVER, TRUE, TRUE) +FAST_NEAREST_MAINLOOP_COMMON (mmx_8888_n_8888_pad_OVER, + scaled_nearest_scanline_mmx_8888_n_8888_OVER, + uint32_t, uint32_t, uint32_t, PAD, TRUE, TRUE) +FAST_NEAREST_MAINLOOP_COMMON (mmx_8888_n_8888_none_OVER, + scaled_nearest_scanline_mmx_8888_n_8888_OVER, + uint32_t, uint32_t, uint32_t, NONE, TRUE, TRUE) +FAST_NEAREST_MAINLOOP_COMMON (mmx_8888_n_8888_normal_OVER, + scaled_nearest_scanline_mmx_8888_n_8888_OVER, + uint32_t, uint32_t, uint32_t, NORMAL, TRUE, TRUE) + #define BSHIFT ((1 << BILINEAR_INTERPOLATION_BITS)) #define BMSK (BSHIFT - 1) @@ -3995,6 +4079,16 @@ static const pixman_fast_path_t mmx_fast_paths[] = PIXMAN_STD_FAST_PATH (IN, a8, null, a8, mmx_composite_in_8_8 ), PIXMAN_STD_FAST_PATH (IN, solid, a8, a8, mmx_composite_in_n_8_8 ), + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, mmx_8888_8888 ), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, mmx_8888_8888 ), + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, mmx_8888_8888 ), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, mmx_8888_8888 ), + + SIMPLE_NEAREST_SOLID_MASK_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, mmx_8888_n_8888 ), + SIMPLE_NEAREST_SOLID_MASK_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, mmx_8888_n_8888 ), + SIMPLE_NEAREST_SOLID_MASK_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, mmx_8888_n_8888 ), + SIMPLE_NEAREST_SOLID_MASK_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, mmx_8888_n_8888 ), + SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, mmx_8888_8888 ), SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, mmx_8888_8888 ), SIMPLE_BILINEAR_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, mmx_8888_8888 ), diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-noop.c b/source/libs/pixman/pixman-src/pixman/pixman-noop.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-noop.c rename to source/libs/pixman/pixman-src/pixman/pixman-noop.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-ppc.c b/source/libs/pixman/pixman-src/pixman/pixman-ppc.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-ppc.c rename to source/libs/pixman/pixman-src/pixman/pixman-ppc.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-private.h b/source/libs/pixman/pixman-src/pixman/pixman-private.h old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-private.h rename to source/libs/pixman/pixman-src/pixman/pixman-private.h index 6ca13b216..73108a01d --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-private.h +++ b/source/libs/pixman/pixman-src/pixman/pixman-private.h @@ -7,7 +7,7 @@ * The defines which are shared between C and assembly code */ -/* bilinear interpolation precision (must be <= 8) */ +/* bilinear interpolation precision (must be < 8) */ #define BILINEAR_INTERPOLATION_BITS 7 #define BILINEAR_INTERPOLATION_RANGE (1 << BILINEAR_INTERPOLATION_BITS) @@ -345,8 +345,8 @@ typedef struct float r_s, r_b; float g_s, g_b; float b_s, b_b; - pixman_fixed_t left_x; - pixman_fixed_t right_x; + pixman_fixed_48_16_t left_x; + pixman_fixed_48_16_t right_x; pixman_gradient_stop_t *stops; int num_stops; diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-radial-gradient.c b/source/libs/pixman/pixman-src/pixman/pixman-radial-gradient.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-radial-gradient.c rename to source/libs/pixman/pixman-src/pixman/pixman-radial-gradient.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-region.c b/source/libs/pixman/pixman-src/pixman/pixman-region.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-region.c rename to source/libs/pixman/pixman-src/pixman/pixman-region.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-region16.c b/source/libs/pixman/pixman-src/pixman/pixman-region16.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-region16.c rename to source/libs/pixman/pixman-src/pixman/pixman-region16.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-region32.c b/source/libs/pixman/pixman-src/pixman/pixman-region32.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-region32.c rename to source/libs/pixman/pixman-src/pixman/pixman-region32.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-solid-fill.c b/source/libs/pixman/pixman-src/pixman/pixman-solid-fill.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-solid-fill.c rename to source/libs/pixman/pixman-src/pixman/pixman-solid-fill.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-sse2.c b/source/libs/pixman/pixman-src/pixman/pixman-sse2.c old mode 100755 new mode 100644 similarity index 99% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-sse2.c rename to source/libs/pixman/pixman-src/pixman/pixman-sse2.c index a6e780815..895510372 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-sse2.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-sse2.c @@ -6274,31 +6274,15 @@ static const pixman_fast_path_t sse2_fast_paths[] = PIXMAN_STD_FAST_PATH (IN, solid, a8, a8, sse2_composite_in_n_8_8), PIXMAN_STD_FAST_PATH (IN, solid, null, a8, sse2_composite_in_n_8), - SIMPLE_NEAREST_FAST_PATH_COVER (OVER, a8r8g8b8, x8r8g8b8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_COVER (OVER, a8b8g8r8, x8b8g8r8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_COVER (OVER, a8r8g8b8, a8r8g8b8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_COVER (OVER, a8b8g8r8, a8b8g8r8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_NONE (OVER, a8r8g8b8, x8r8g8b8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_NONE (OVER, a8b8g8r8, x8b8g8r8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_NONE (OVER, a8r8g8b8, a8r8g8b8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_NONE (OVER, a8b8g8r8, a8b8g8r8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_PAD (OVER, a8r8g8b8, x8r8g8b8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_PAD (OVER, a8b8g8r8, x8b8g8r8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_PAD (OVER, a8r8g8b8, a8r8g8b8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_PAD (OVER, a8b8g8r8, a8b8g8r8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_NORMAL (OVER, a8r8g8b8, x8r8g8b8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_NORMAL (OVER, a8b8g8r8, x8b8g8r8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_NORMAL (OVER, a8r8g8b8, a8r8g8b8, sse2_8888_8888), - SIMPLE_NEAREST_FAST_PATH_NORMAL (OVER, a8b8g8r8, a8b8g8r8, sse2_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, sse2_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, sse2_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, sse2_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, sse2_8888_8888), SIMPLE_NEAREST_SOLID_MASK_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, sse2_8888_n_8888), SIMPLE_NEAREST_SOLID_MASK_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, sse2_8888_n_8888), SIMPLE_NEAREST_SOLID_MASK_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, sse2_8888_n_8888), SIMPLE_NEAREST_SOLID_MASK_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, sse2_8888_n_8888), - SIMPLE_NEAREST_SOLID_MASK_FAST_PATH_NORMAL (OVER, a8r8g8b8, a8r8g8b8, sse2_8888_n_8888), - SIMPLE_NEAREST_SOLID_MASK_FAST_PATH_NORMAL (OVER, a8b8g8r8, a8b8g8r8, sse2_8888_n_8888), - SIMPLE_NEAREST_SOLID_MASK_FAST_PATH_NORMAL (OVER, a8r8g8b8, x8r8g8b8, sse2_8888_n_8888), - SIMPLE_NEAREST_SOLID_MASK_FAST_PATH_NORMAL (OVER, a8b8g8r8, x8b8g8r8, sse2_8888_n_8888), SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, sse2_8888_8888), SIMPLE_BILINEAR_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, sse2_8888_8888), diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-ssse3.c b/source/libs/pixman/pixman-src/pixman/pixman-ssse3.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-ssse3.c rename to source/libs/pixman/pixman-src/pixman/pixman-ssse3.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-timer.c b/source/libs/pixman/pixman-src/pixman/pixman-timer.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-timer.c rename to source/libs/pixman/pixman-src/pixman/pixman-timer.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-trap.c b/source/libs/pixman/pixman-src/pixman/pixman-trap.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-trap.c rename to source/libs/pixman/pixman-src/pixman/pixman-trap.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-utils.c b/source/libs/pixman/pixman-src/pixman/pixman-utils.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-utils.c rename to source/libs/pixman/pixman-src/pixman/pixman-utils.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-version.h.in b/source/libs/pixman/pixman-src/pixman/pixman-version.h.in old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-version.h.in rename to source/libs/pixman/pixman-src/pixman/pixman-version.h.in diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-vmx.c b/source/libs/pixman/pixman-src/pixman/pixman-vmx.c old mode 100755 new mode 100644 similarity index 61% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-vmx.c rename to source/libs/pixman/pixman-src/pixman/pixman-vmx.c index c33631c0e..41efdcfa1 --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman-vmx.c +++ b/source/libs/pixman/pixman-src/pixman/pixman-vmx.c @@ -30,17 +30,41 @@ #endif #include "pixman-private.h" #include "pixman-combine32.h" +#include "pixman-inlines.h" #include <altivec.h> #define AVV(x...) {x} +static vector unsigned int mask_ff000000; +static vector unsigned int mask_red; +static vector unsigned int mask_green; +static vector unsigned int mask_blue; +static vector unsigned int mask_565_fix_rb; +static vector unsigned int mask_565_fix_g; + static force_inline vector unsigned int splat_alpha (vector unsigned int pix) { +#ifdef WORDS_BIGENDIAN return vec_perm (pix, pix, (vector unsigned char)AVV ( 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x0C, 0x0C, 0x0C, 0x0C)); +#else + return vec_perm (pix, pix, + (vector unsigned char)AVV ( + 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, + 0x0B, 0x0B, 0x0B, 0x0B, 0x0F, 0x0F, 0x0F, 0x0F)); +#endif +} + +static force_inline vector unsigned int +splat_pixel (vector unsigned int pix) +{ + return vec_perm (pix, pix, + (vector unsigned char)AVV ( + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03)); } static force_inline vector unsigned int @@ -50,12 +74,22 @@ pix_multiply (vector unsigned int p, vector unsigned int a) /* unpack to short */ hi = (vector unsigned short) +#ifdef WORDS_BIGENDIAN vec_mergeh ((vector unsigned char)AVV (0), (vector unsigned char)p); +#else + vec_mergeh ((vector unsigned char) p, + (vector unsigned char) AVV (0)); +#endif mod = (vector unsigned short) +#ifdef WORDS_BIGENDIAN vec_mergeh ((vector unsigned char)AVV (0), (vector unsigned char)a); +#else + vec_mergeh ((vector unsigned char) a, + (vector unsigned char) AVV (0)); +#endif hi = vec_mladd (hi, mod, (vector unsigned short) AVV (0x0080, 0x0080, 0x0080, 0x0080, @@ -67,11 +101,22 @@ pix_multiply (vector unsigned int p, vector unsigned int a) /* unpack to short */ lo = (vector unsigned short) +#ifdef WORDS_BIGENDIAN vec_mergel ((vector unsigned char)AVV (0), (vector unsigned char)p); +#else + vec_mergel ((vector unsigned char) p, + (vector unsigned char) AVV (0)); +#endif + mod = (vector unsigned short) +#ifdef WORDS_BIGENDIAN vec_mergel ((vector unsigned char)AVV (0), (vector unsigned char)a); +#else + vec_mergel ((vector unsigned char) a, + (vector unsigned char) AVV (0)); +#endif lo = vec_mladd (lo, mod, (vector unsigned short) AVV (0x0080, 0x0080, 0x0080, 0x0080, @@ -129,6 +174,7 @@ over (vector unsigned int src, over (pix_multiply (src, mask), \ pix_multiply (srca, mask), dest) +#ifdef WORDS_BIGENDIAN #define COMPUTE_SHIFT_MASK(source) \ source ## _mask = vec_lvsl (0, source); @@ -140,36 +186,305 @@ over (vector unsigned int src, mask ## _mask = vec_lvsl (0, mask); \ source ## _mask = vec_lvsl (0, source); -/* notice you have to declare temp vars... - * Note: tmp3 and tmp4 must remain untouched! - */ - -#define LOAD_VECTORS(dest, source) \ +#define LOAD_VECTOR(source) \ +do \ +{ \ + vector unsigned char tmp1, tmp2; \ tmp1 = (typeof(tmp1))vec_ld (0, source); \ tmp2 = (typeof(tmp2))vec_ld (15, source); \ - v ## source = (typeof(v ## source)) \ + v ## source = (typeof(v ## source)) \ vec_perm (tmp1, tmp2, source ## _mask); \ - v ## dest = (typeof(v ## dest))vec_ld (0, dest); +} while (0) -#define LOAD_VECTORSC(dest, source, mask) \ - tmp1 = (typeof(tmp1))vec_ld (0, source); \ - tmp2 = (typeof(tmp2))vec_ld (15, source); \ - v ## source = (typeof(v ## source)) \ - vec_perm (tmp1, tmp2, source ## _mask); \ - tmp1 = (typeof(tmp1))vec_ld (0, mask); \ +#define LOAD_VECTORS(dest, source) \ +do \ +{ \ + LOAD_VECTOR(source); \ v ## dest = (typeof(v ## dest))vec_ld (0, dest); \ - tmp2 = (typeof(tmp2))vec_ld (15, mask); \ - v ## mask = (typeof(v ## mask)) \ - vec_perm (tmp1, tmp2, mask ## _mask); +} while (0) + +#define LOAD_VECTORSC(dest, source, mask) \ +do \ +{ \ + LOAD_VECTORS(dest, source); \ + LOAD_VECTOR(mask); \ +} while (0) + +#define DECLARE_SRC_MASK_VAR vector unsigned char src_mask +#define DECLARE_MASK_MASK_VAR vector unsigned char mask_mask + +#else + +/* Now the COMPUTE_SHIFT_{MASK, MASKS, MASKC} below are just no-op. + * They are defined that way because little endian altivec can do unaligned + * reads natively and have no need for constructing the permutation pattern + * variables. + */ +#define COMPUTE_SHIFT_MASK(source) + +#define COMPUTE_SHIFT_MASKS(dest, source) + +#define COMPUTE_SHIFT_MASKC(dest, source, mask) + +# define LOAD_VECTOR(source) \ + v ## source = *((typeof(v ## source)*)source); + +# define LOAD_VECTORS(dest, source) \ + LOAD_VECTOR(source); \ + LOAD_VECTOR(dest); \ + +# define LOAD_VECTORSC(dest, source, mask) \ + LOAD_VECTORS(dest, source); \ + LOAD_VECTOR(mask); \ + +#define DECLARE_SRC_MASK_VAR +#define DECLARE_MASK_MASK_VAR + +#endif /* WORDS_BIGENDIAN */ #define LOAD_VECTORSM(dest, source, mask) \ - LOAD_VECTORSC (dest, source, mask) \ + LOAD_VECTORSC (dest, source, mask); \ v ## source = pix_multiply (v ## source, \ splat_alpha (v ## mask)); #define STORE_VECTOR(dest) \ vec_st ((vector unsigned int) v ## dest, 0, dest); +/* load 4 pixels from a 16-byte boundary aligned address */ +static force_inline vector unsigned int +load_128_aligned (const uint32_t* src) +{ + return *((vector unsigned int *) src); +} + +/* load 4 pixels from a unaligned address */ +static force_inline vector unsigned int +load_128_unaligned (const uint32_t* src) +{ + vector unsigned int vsrc; + DECLARE_SRC_MASK_VAR; + + COMPUTE_SHIFT_MASK (src); + LOAD_VECTOR (src); + + return vsrc; +} + +/* save 4 pixels on a 16-byte boundary aligned address */ +static force_inline void +save_128_aligned (uint32_t* data, + vector unsigned int vdata) +{ + STORE_VECTOR(data) +} + +static force_inline vector unsigned int +create_mask_1x32_128 (const uint32_t *src) +{ + vector unsigned int vsrc; + DECLARE_SRC_MASK_VAR; + + COMPUTE_SHIFT_MASK (src); + LOAD_VECTOR (src); + return vec_splat(vsrc, 0); +} + +static force_inline vector unsigned int +create_mask_32_128 (uint32_t mask) +{ + return create_mask_1x32_128(&mask); +} + +static force_inline vector unsigned int +unpacklo_128_16x8 (vector unsigned int data1, vector unsigned int data2) +{ + vector unsigned char lo; + + /* unpack to short */ + lo = (vector unsigned char) +#ifdef WORDS_BIGENDIAN + vec_mergel ((vector unsigned char) data2, + (vector unsigned char) data1); +#else + vec_mergel ((vector unsigned char) data1, + (vector unsigned char) data2); +#endif + + return (vector unsigned int) lo; +} + +static force_inline vector unsigned int +unpackhi_128_16x8 (vector unsigned int data1, vector unsigned int data2) +{ + vector unsigned char hi; + + /* unpack to short */ + hi = (vector unsigned char) +#ifdef WORDS_BIGENDIAN + vec_mergeh ((vector unsigned char) data2, + (vector unsigned char) data1); +#else + vec_mergeh ((vector unsigned char) data1, + (vector unsigned char) data2); +#endif + + return (vector unsigned int) hi; +} + +static force_inline vector unsigned int +unpacklo_128_8x16 (vector unsigned int data1, vector unsigned int data2) +{ + vector unsigned short lo; + + /* unpack to char */ + lo = (vector unsigned short) +#ifdef WORDS_BIGENDIAN + vec_mergel ((vector unsigned short) data2, + (vector unsigned short) data1); +#else + vec_mergel ((vector unsigned short) data1, + (vector unsigned short) data2); +#endif + + return (vector unsigned int) lo; +} + +static force_inline vector unsigned int +unpackhi_128_8x16 (vector unsigned int data1, vector unsigned int data2) +{ + vector unsigned short hi; + + /* unpack to char */ + hi = (vector unsigned short) +#ifdef WORDS_BIGENDIAN + vec_mergeh ((vector unsigned short) data2, + (vector unsigned short) data1); +#else + vec_mergeh ((vector unsigned short) data1, + (vector unsigned short) data2); +#endif + + return (vector unsigned int) hi; +} + +static force_inline void +unpack_128_2x128 (vector unsigned int data1, vector unsigned int data2, + vector unsigned int* data_lo, vector unsigned int* data_hi) +{ + *data_lo = unpacklo_128_16x8(data1, data2); + *data_hi = unpackhi_128_16x8(data1, data2); +} + +static force_inline void +unpack_128_2x128_16 (vector unsigned int data1, vector unsigned int data2, + vector unsigned int* data_lo, vector unsigned int* data_hi) +{ + *data_lo = unpacklo_128_8x16(data1, data2); + *data_hi = unpackhi_128_8x16(data1, data2); +} + +static force_inline vector unsigned int +unpack_565_to_8888 (vector unsigned int lo) +{ + vector unsigned int r, g, b, rb, t; + + r = vec_and (vec_sl(lo, create_mask_32_128(8)), mask_red); + g = vec_and (vec_sl(lo, create_mask_32_128(5)), mask_green); + b = vec_and (vec_sl(lo, create_mask_32_128(3)), mask_blue); + + rb = vec_or (r, b); + t = vec_and (rb, mask_565_fix_rb); + t = vec_sr (t, create_mask_32_128(5)); + rb = vec_or (rb, t); + + t = vec_and (g, mask_565_fix_g); + t = vec_sr (t, create_mask_32_128(6)); + g = vec_or (g, t); + + return vec_or (rb, g); +} + +static force_inline int +is_opaque (vector unsigned int x) +{ + uint32_t cmp_result; + vector bool int ffs = vec_cmpeq(x, x); + + cmp_result = vec_all_eq(x, ffs); + + return (cmp_result & 0x8888) == 0x8888; +} + +static force_inline int +is_zero (vector unsigned int x) +{ + uint32_t cmp_result; + + cmp_result = vec_all_eq(x, (vector unsigned int) AVV(0)); + + return cmp_result == 0xffff; +} + +static force_inline int +is_transparent (vector unsigned int x) +{ + uint32_t cmp_result; + + cmp_result = vec_all_eq(x, (vector unsigned int) AVV(0)); + return (cmp_result & 0x8888) == 0x8888; +} + +static force_inline uint32_t +core_combine_over_u_pixel_vmx (uint32_t src, uint32_t dst) +{ + uint32_t a; + + a = ALPHA_8(src); + + if (a == 0xff) + { + return src; + } + else if (src) + { + UN8x4_MUL_UN8_ADD_UN8x4(dst, (~a & MASK), src); + } + + return dst; +} + +static force_inline uint32_t +combine1 (const uint32_t *ps, const uint32_t *pm) +{ + uint32_t s = *ps; + + if (pm) + UN8x4_MUL_UN8(s, ALPHA_8(*pm)); + + return s; +} + +static force_inline vector unsigned int +combine4 (const uint32_t* ps, const uint32_t* pm) +{ + vector unsigned int src, msk; + + if (pm) + { + msk = load_128_unaligned(pm); + + if (is_transparent(msk)) + return (vector unsigned int) AVV(0); + } + + src = load_128_unaligned(ps); + + if (pm) + src = pix_multiply(src, msk); + + return src; +} + static void vmx_combine_over_u_no_mask (uint32_t * dest, const uint32_t *src, @@ -177,7 +492,7 @@ vmx_combine_over_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -227,7 +542,8 @@ vmx_combine_over_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -298,7 +614,7 @@ vmx_combine_over_reverse_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -346,7 +662,8 @@ vmx_combine_over_reverse_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -414,7 +731,7 @@ vmx_combine_in_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -459,7 +776,8 @@ vmx_combine_in_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -524,7 +842,7 @@ vmx_combine_in_reverse_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -571,7 +889,8 @@ vmx_combine_in_reverse_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -638,7 +957,7 @@ vmx_combine_out_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -685,7 +1004,8 @@ vmx_combine_out_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -750,7 +1070,7 @@ vmx_combine_out_reverse_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -798,7 +1118,8 @@ vmx_combine_out_reverse_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -865,7 +1186,7 @@ vmx_combine_atop_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -917,7 +1238,8 @@ vmx_combine_atop_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -993,7 +1315,7 @@ vmx_combine_atop_reverse_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1045,7 +1367,8 @@ vmx_combine_atop_reverse_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1121,7 +1444,7 @@ vmx_combine_xor_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1173,7 +1496,8 @@ vmx_combine_xor_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1249,7 +1573,7 @@ vmx_combine_add_u_no_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc; - vector unsigned char tmp1, tmp2, src_mask; + DECLARE_SRC_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1295,7 +1619,8 @@ vmx_combine_add_u_mask (uint32_t * dest, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, src_mask, mask_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1363,7 +1688,8 @@ vmx_combine_src_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1413,7 +1739,8 @@ vmx_combine_over_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1471,7 +1798,8 @@ vmx_combine_over_reverse_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1527,7 +1855,8 @@ vmx_combine_in_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1581,7 +1910,8 @@ vmx_combine_in_reverse_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1636,7 +1966,8 @@ vmx_combine_out_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1693,7 +2024,8 @@ vmx_combine_out_reverse_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1750,7 +2082,8 @@ vmx_combine_atop_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask, vsrca; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1816,7 +2149,8 @@ vmx_combine_atop_reverse_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1879,7 +2213,8 @@ vmx_combine_xor_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1942,7 +2277,8 @@ vmx_combine_add_ca (pixman_implementation_t *imp, { int i; vector unsigned int vdest, vsrc, vmask; - vector unsigned char tmp1, tmp2, mask_mask, src_mask; + DECLARE_SRC_MASK_VAR; + DECLARE_MASK_MASK_VAR; while (width && ((uintptr_t)dest & 15)) { @@ -1986,16 +2322,809 @@ vmx_combine_add_ca (pixman_implementation_t *imp, } } +static void +vmx_composite_over_n_8_8888 (pixman_implementation_t *imp, + pixman_composite_info_t *info) +{ + PIXMAN_COMPOSITE_ARGS (info); + uint32_t src, srca; + uint32_t *dst_line, *dst; + uint8_t *mask_line; + int dst_stride, mask_stride; + int32_t w; + uint32_t m, d, s, ia; + + vector unsigned int vsrc, valpha, vmask, vdst; + + src = _pixman_image_get_solid (imp, src_image, dest_image->bits.format); + + srca = ALPHA_8(src); + if (src == 0) + return; + + PIXMAN_IMAGE_GET_LINE ( + dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1); + PIXMAN_IMAGE_GET_LINE ( + mask_image, mask_x, mask_y, uint8_t, mask_stride, mask_line, 1); + + vsrc = (vector unsigned int) {src, src, src, src}; + valpha = splat_alpha(vsrc); + + while (height--) + { + const uint8_t *pm = mask_line; + dst = dst_line; + dst_line += dst_stride; + mask_line += mask_stride; + w = width; + + while (w && (uintptr_t)dst & 15) + { + s = src; + m = *pm++; + + if (m) + { + d = *dst; + UN8x4_MUL_UN8 (s, m); + ia = ALPHA_8 (~s); + UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s); + *dst = d; + } + + w--; + dst++; + } + + while (w >= 4) + { + m = *((uint32_t*)pm); + + if (srca == 0xff && m == 0xffffffff) + { + save_128_aligned(dst, vsrc); + } + else if (m) + { + vmask = splat_pixel((vector unsigned int) {m, m, m, m}); + + /* dst is 16-byte aligned */ + vdst = in_over (vsrc, valpha, vmask, load_128_aligned (dst)); + + save_128_aligned(dst, vdst); + } + + w -= 4; + dst += 4; + pm += 4; + } + + while (w) + { + s = src; + m = *pm++; + + if (m) + { + d = *dst; + UN8x4_MUL_UN8 (s, m); + ia = ALPHA_8 (~s); + UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s); + *dst = d; + } + + w--; + dst++; + } + } + +} + +static pixman_bool_t +vmx_fill (pixman_implementation_t *imp, + uint32_t * bits, + int stride, + int bpp, + int x, + int y, + int width, + int height, + uint32_t filler) +{ + uint32_t byte_width; + uint8_t *byte_line; + + vector unsigned int vfiller; + + if (bpp == 8) + { + uint8_t b; + uint16_t w; + + stride = stride * (int) sizeof (uint32_t) / 1; + byte_line = (uint8_t *)(((uint8_t *)bits) + stride * y + x); + byte_width = width; + stride *= 1; + + b = filler & 0xff; + w = (b << 8) | b; + filler = (w << 16) | w; + } + else if (bpp == 16) + { + stride = stride * (int) sizeof (uint32_t) / 2; + byte_line = (uint8_t *)(((uint16_t *)bits) + stride * y + x); + byte_width = 2 * width; + stride *= 2; + + filler = (filler & 0xffff) * 0x00010001; + } + else if (bpp == 32) + { + stride = stride * (int) sizeof (uint32_t) / 4; + byte_line = (uint8_t *)(((uint32_t *)bits) + stride * y + x); + byte_width = 4 * width; + stride *= 4; + } + else + { + return FALSE; + } + + vfiller = create_mask_1x32_128(&filler); + + while (height--) + { + int w; + uint8_t *d = byte_line; + byte_line += stride; + w = byte_width; + + if (w >= 1 && ((uintptr_t)d & 1)) + { + *(uint8_t *)d = filler; + w -= 1; + d += 1; + } + + while (w >= 2 && ((uintptr_t)d & 3)) + { + *(uint16_t *)d = filler; + w -= 2; + d += 2; + } + + while (w >= 4 && ((uintptr_t)d & 15)) + { + *(uint32_t *)d = filler; + + w -= 4; + d += 4; + } + + while (w >= 128) + { + vec_st(vfiller, 0, (uint32_t *) d); + vec_st(vfiller, 0, (uint32_t *) d + 4); + vec_st(vfiller, 0, (uint32_t *) d + 8); + vec_st(vfiller, 0, (uint32_t *) d + 12); + vec_st(vfiller, 0, (uint32_t *) d + 16); + vec_st(vfiller, 0, (uint32_t *) d + 20); + vec_st(vfiller, 0, (uint32_t *) d + 24); + vec_st(vfiller, 0, (uint32_t *) d + 28); + + d += 128; + w -= 128; + } + + if (w >= 64) + { + vec_st(vfiller, 0, (uint32_t *) d); + vec_st(vfiller, 0, (uint32_t *) d + 4); + vec_st(vfiller, 0, (uint32_t *) d + 8); + vec_st(vfiller, 0, (uint32_t *) d + 12); + + d += 64; + w -= 64; + } + + if (w >= 32) + { + vec_st(vfiller, 0, (uint32_t *) d); + vec_st(vfiller, 0, (uint32_t *) d + 4); + + d += 32; + w -= 32; + } + + if (w >= 16) + { + vec_st(vfiller, 0, (uint32_t *) d); + + d += 16; + w -= 16; + } + + while (w >= 4) + { + *(uint32_t *)d = filler; + + w -= 4; + d += 4; + } + + if (w >= 2) + { + *(uint16_t *)d = filler; + w -= 2; + d += 2; + } + + if (w >= 1) + { + *(uint8_t *)d = filler; + w -= 1; + d += 1; + } + } + + return TRUE; +} + +static void +vmx_composite_src_x888_8888 (pixman_implementation_t *imp, + pixman_composite_info_t *info) +{ + PIXMAN_COMPOSITE_ARGS (info); + uint32_t *dst_line, *dst; + uint32_t *src_line, *src; + int32_t w; + int dst_stride, src_stride; + + PIXMAN_IMAGE_GET_LINE ( + dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1); + PIXMAN_IMAGE_GET_LINE ( + src_image, src_x, src_y, uint32_t, src_stride, src_line, 1); + + while (height--) + { + dst = dst_line; + dst_line += dst_stride; + src = src_line; + src_line += src_stride; + w = width; + + while (w && (uintptr_t)dst & 15) + { + *dst++ = *src++ | 0xff000000; + w--; + } + + while (w >= 16) + { + vector unsigned int vmx_src1, vmx_src2, vmx_src3, vmx_src4; + + vmx_src1 = load_128_unaligned (src); + vmx_src2 = load_128_unaligned (src + 4); + vmx_src3 = load_128_unaligned (src + 8); + vmx_src4 = load_128_unaligned (src + 12); + + save_128_aligned (dst, vec_or (vmx_src1, mask_ff000000)); + save_128_aligned (dst + 4, vec_or (vmx_src2, mask_ff000000)); + save_128_aligned (dst + 8, vec_or (vmx_src3, mask_ff000000)); + save_128_aligned (dst + 12, vec_or (vmx_src4, mask_ff000000)); + + dst += 16; + src += 16; + w -= 16; + } + + while (w) + { + *dst++ = *src++ | 0xff000000; + w--; + } + } +} + +static void +vmx_composite_over_n_8888 (pixman_implementation_t *imp, + pixman_composite_info_t *info) +{ + PIXMAN_COMPOSITE_ARGS (info); + uint32_t *dst_line, *dst; + uint32_t src, ia; + int i, w, dst_stride; + vector unsigned int vdst, vsrc, via; + + src = _pixman_image_get_solid (imp, src_image, dest_image->bits.format); + + if (src == 0) + return; + + PIXMAN_IMAGE_GET_LINE ( + dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1); + + vsrc = (vector unsigned int){src, src, src, src}; + via = negate (splat_alpha (vsrc)); + ia = ALPHA_8 (~src); + + while (height--) + { + dst = dst_line; + dst_line += dst_stride; + w = width; + + while (w && ((uintptr_t)dst & 15)) + { + uint32_t d = *dst; + UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, src); + *dst++ = d; + w--; + } + + for (i = w / 4; i > 0; i--) + { + vdst = pix_multiply (load_128_aligned (dst), via); + save_128_aligned (dst, pix_add (vsrc, vdst)); + dst += 4; + } + + for (i = w % 4; --i >= 0;) + { + uint32_t d = dst[i]; + UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, src); + dst[i] = d; + } + } +} + +static void +vmx_composite_over_8888_8888 (pixman_implementation_t *imp, + pixman_composite_info_t *info) +{ + PIXMAN_COMPOSITE_ARGS (info); + int dst_stride, src_stride; + uint32_t *dst_line, *dst; + uint32_t *src_line, *src; + + PIXMAN_IMAGE_GET_LINE ( + dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1); + PIXMAN_IMAGE_GET_LINE ( + src_image, src_x, src_y, uint32_t, src_stride, src_line, 1); + + dst = dst_line; + src = src_line; + + while (height--) + { + vmx_combine_over_u (imp, op, dst, src, NULL, width); + + dst += dst_stride; + src += src_stride; + } +} + +static void +vmx_composite_over_n_8888_8888_ca (pixman_implementation_t *imp, + pixman_composite_info_t *info) +{ + PIXMAN_COMPOSITE_ARGS (info); + uint32_t src, ia; + uint32_t *dst_line, d; + uint32_t *mask_line, m; + uint32_t pack_cmp; + int dst_stride, mask_stride; + + vector unsigned int vsrc, valpha, vmask, vdest; + + src = _pixman_image_get_solid (imp, src_image, dest_image->bits.format); + + if (src == 0) + return; + + PIXMAN_IMAGE_GET_LINE ( + dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1); + PIXMAN_IMAGE_GET_LINE ( + mask_image, mask_x, mask_y, uint32_t, mask_stride, mask_line, 1); + + vsrc = (vector unsigned int) {src, src, src, src}; + valpha = splat_alpha(vsrc); + ia = ALPHA_8 (src); + + while (height--) + { + int w = width; + const uint32_t *pm = (uint32_t *)mask_line; + uint32_t *pd = (uint32_t *)dst_line; + uint32_t s; + + dst_line += dst_stride; + mask_line += mask_stride; + + while (w && (uintptr_t)pd & 15) + { + s = src; + m = *pm++; + + if (m) + { + d = *pd; + UN8x4_MUL_UN8x4 (s, m); + UN8x4_MUL_UN8 (m, ia); + m = ~m; + UN8x4_MUL_UN8x4_ADD_UN8x4 (d, m, s); + *pd = d; + } + + pd++; + w--; + } + + while (w >= 4) + { + /* pm is NOT necessarily 16-byte aligned */ + vmask = load_128_unaligned (pm); + + pack_cmp = vec_all_eq(vmask, (vector unsigned int) AVV(0)); + + /* if all bits in mask are zero, pack_cmp is not 0 */ + if (pack_cmp == 0) + { + /* pd is 16-byte aligned */ + vdest = in_over (vsrc, valpha, vmask, load_128_aligned (pd)); + + save_128_aligned(pd, vdest); + } + + pd += 4; + pm += 4; + w -= 4; + } + + while (w) + { + s = src; + m = *pm++; + + if (m) + { + d = *pd; + UN8x4_MUL_UN8x4 (s, m); + UN8x4_MUL_UN8 (m, ia); + m = ~m; + UN8x4_MUL_UN8x4_ADD_UN8x4 (d, m, s); + *pd = d; + } + + pd++; + w--; + } + } +} + +static void +vmx_composite_add_8_8 (pixman_implementation_t *imp, + pixman_composite_info_t *info) +{ + PIXMAN_COMPOSITE_ARGS (info); + uint8_t *dst_line, *dst; + uint8_t *src_line, *src; + int dst_stride, src_stride; + int32_t w; + uint16_t t; + + PIXMAN_IMAGE_GET_LINE ( + src_image, src_x, src_y, uint8_t, src_stride, src_line, 1); + PIXMAN_IMAGE_GET_LINE ( + dest_image, dest_x, dest_y, uint8_t, dst_stride, dst_line, 1); + + while (height--) + { + dst = dst_line; + src = src_line; + + dst_line += dst_stride; + src_line += src_stride; + w = width; + + /* Small head */ + while (w && (uintptr_t)dst & 3) + { + t = (*dst) + (*src++); + *dst++ = t | (0 - (t >> 8)); + w--; + } + + vmx_combine_add_u (imp, op, + (uint32_t*)dst, (uint32_t*)src, NULL, w >> 2); + + /* Small tail */ + dst += w & 0xfffc; + src += w & 0xfffc; + + w &= 3; + + while (w) + { + t = (*dst) + (*src++); + *dst++ = t | (0 - (t >> 8)); + w--; + } + } +} + +static void +vmx_composite_add_8888_8888 (pixman_implementation_t *imp, + pixman_composite_info_t *info) +{ + PIXMAN_COMPOSITE_ARGS (info); + uint32_t *dst_line, *dst; + uint32_t *src_line, *src; + int dst_stride, src_stride; + + PIXMAN_IMAGE_GET_LINE ( + src_image, src_x, src_y, uint32_t, src_stride, src_line, 1); + PIXMAN_IMAGE_GET_LINE ( + dest_image, dest_x, dest_y, uint32_t, dst_stride, dst_line, 1); + + while (height--) + { + dst = dst_line; + dst_line += dst_stride; + src = src_line; + src_line += src_stride; + + vmx_combine_add_u (imp, op, dst, src, NULL, width); + } +} + +static force_inline void +scaled_nearest_scanline_vmx_8888_8888_OVER (uint32_t* pd, + const uint32_t* ps, + int32_t w, + pixman_fixed_t vx, + pixman_fixed_t unit_x, + pixman_fixed_t src_width_fixed, + pixman_bool_t fully_transparent_src) +{ + uint32_t s, d; + const uint32_t* pm = NULL; + + vector unsigned int vsrc, vdst; + + if (fully_transparent_src) + return; + + /* Align dst on a 16-byte boundary */ + while (w && ((uintptr_t)pd & 15)) + { + d = *pd; + s = combine1 (ps + pixman_fixed_to_int (vx), pm); + vx += unit_x; + while (vx >= 0) + vx -= src_width_fixed; + + *pd++ = core_combine_over_u_pixel_vmx (s, d); + if (pm) + pm++; + w--; + } + + while (w >= 4) + { + vector unsigned int tmp; + uint32_t tmp1, tmp2, tmp3, tmp4; + + tmp1 = *(ps + pixman_fixed_to_int (vx)); + vx += unit_x; + while (vx >= 0) + vx -= src_width_fixed; + tmp2 = *(ps + pixman_fixed_to_int (vx)); + vx += unit_x; + while (vx >= 0) + vx -= src_width_fixed; + tmp3 = *(ps + pixman_fixed_to_int (vx)); + vx += unit_x; + while (vx >= 0) + vx -= src_width_fixed; + tmp4 = *(ps + pixman_fixed_to_int (vx)); + vx += unit_x; + while (vx >= 0) + vx -= src_width_fixed; + + tmp[0] = tmp1; + tmp[1] = tmp2; + tmp[2] = tmp3; + tmp[3] = tmp4; + + vsrc = combine4 ((const uint32_t *) &tmp, pm); + + if (is_opaque (vsrc)) + { + save_128_aligned (pd, vsrc); + } + else if (!is_zero (vsrc)) + { + vdst = over(vsrc, splat_alpha(vsrc), load_128_aligned (pd)); + + save_128_aligned (pd, vdst); + } + + w -= 4; + pd += 4; + if (pm) + pm += 4; + } + + while (w) + { + d = *pd; + s = combine1 (ps + pixman_fixed_to_int (vx), pm); + vx += unit_x; + while (vx >= 0) + vx -= src_width_fixed; + + *pd++ = core_combine_over_u_pixel_vmx (s, d); + if (pm) + pm++; + + w--; + } +} + +FAST_NEAREST_MAINLOOP (vmx_8888_8888_cover_OVER, + scaled_nearest_scanline_vmx_8888_8888_OVER, + uint32_t, uint32_t, COVER) +FAST_NEAREST_MAINLOOP (vmx_8888_8888_none_OVER, + scaled_nearest_scanline_vmx_8888_8888_OVER, + uint32_t, uint32_t, NONE) +FAST_NEAREST_MAINLOOP (vmx_8888_8888_pad_OVER, + scaled_nearest_scanline_vmx_8888_8888_OVER, + uint32_t, uint32_t, PAD) +FAST_NEAREST_MAINLOOP (vmx_8888_8888_normal_OVER, + scaled_nearest_scanline_vmx_8888_8888_OVER, + uint32_t, uint32_t, NORMAL) + static const pixman_fast_path_t vmx_fast_paths[] = { + PIXMAN_STD_FAST_PATH (OVER, solid, null, a8r8g8b8, vmx_composite_over_n_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, null, x8r8g8b8, vmx_composite_over_n_8888), + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, vmx_composite_over_8888_8888), + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, vmx_composite_over_8888_8888), + PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, vmx_composite_over_8888_8888), + PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, vmx_composite_over_8888_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8r8g8b8, vmx_composite_over_n_8_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, vmx_composite_over_n_8_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, vmx_composite_over_n_8_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, vmx_composite_over_n_8_8888), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, vmx_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, vmx_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, vmx_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, vmx_composite_over_n_8888_8888_ca), + + /* PIXMAN_OP_ADD */ + PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, vmx_composite_add_8_8), + PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, null, a8r8g8b8, vmx_composite_add_8888_8888), + PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, null, a8b8g8r8, vmx_composite_add_8888_8888), + + /* PIXMAN_OP_SRC */ + PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, vmx_composite_src_x888_8888), + PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, vmx_composite_src_x888_8888), + + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, vmx_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, vmx_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, vmx_8888_8888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, vmx_8888_8888), + { PIXMAN_OP_NONE }, }; +static uint32_t * +vmx_fetch_x8r8g8b8 (pixman_iter_t *iter, const uint32_t *mask) +{ + int w = iter->width; + vector unsigned int ff000000 = mask_ff000000; + uint32_t *dst = iter->buffer; + uint32_t *src = (uint32_t *)iter->bits; + + iter->bits += iter->stride; + + while (w && ((uintptr_t)dst) & 0x0f) + { + *dst++ = (*src++) | 0xff000000; + w--; + } + + while (w >= 4) + { + save_128_aligned(dst, vec_or(load_128_unaligned(src), ff000000)); + + dst += 4; + src += 4; + w -= 4; + } + + while (w) + { + *dst++ = (*src++) | 0xff000000; + w--; + } + + return iter->buffer; +} + +static uint32_t * +vmx_fetch_a8 (pixman_iter_t *iter, const uint32_t *mask) +{ + int w = iter->width; + uint32_t *dst = iter->buffer; + uint8_t *src = iter->bits; + vector unsigned int vmx0, vmx1, vmx2, vmx3, vmx4, vmx5, vmx6; + + iter->bits += iter->stride; + + while (w && (((uintptr_t)dst) & 15)) + { + *dst++ = *(src++) << 24; + w--; + } + + while (w >= 16) + { + vmx0 = load_128_unaligned((uint32_t *) src); + + unpack_128_2x128((vector unsigned int) AVV(0), vmx0, &vmx1, &vmx2); + unpack_128_2x128_16((vector unsigned int) AVV(0), vmx1, &vmx3, &vmx4); + unpack_128_2x128_16((vector unsigned int) AVV(0), vmx2, &vmx5, &vmx6); + + save_128_aligned(dst, vmx6); + save_128_aligned((dst + 4), vmx5); + save_128_aligned((dst + 8), vmx4); + save_128_aligned((dst + 12), vmx3); + + dst += 16; + src += 16; + w -= 16; + } + + while (w) + { + *dst++ = *(src++) << 24; + w--; + } + + return iter->buffer; +} + +#define IMAGE_FLAGS \ + (FAST_PATH_STANDARD_FLAGS | FAST_PATH_ID_TRANSFORM | \ + FAST_PATH_BITS_IMAGE | FAST_PATH_SAMPLES_COVER_CLIP_NEAREST) + +static const pixman_iter_info_t vmx_iters[] = +{ + { PIXMAN_x8r8g8b8, IMAGE_FLAGS, ITER_NARROW, + _pixman_iter_init_bits_stride, vmx_fetch_x8r8g8b8, NULL + }, + { PIXMAN_a8, IMAGE_FLAGS, ITER_NARROW, + _pixman_iter_init_bits_stride, vmx_fetch_a8, NULL + }, + { PIXMAN_null }, +}; + pixman_implementation_t * _pixman_implementation_create_vmx (pixman_implementation_t *fallback) { pixman_implementation_t *imp = _pixman_implementation_create (fallback, vmx_fast_paths); + /* VMX constants */ + mask_ff000000 = create_mask_32_128 (0xff000000); + mask_red = create_mask_32_128 (0x00f80000); + mask_green = create_mask_32_128 (0x0000fc00); + mask_blue = create_mask_32_128 (0x000000f8); + mask_565_fix_rb = create_mask_32_128 (0x00e000e0); + mask_565_fix_g = create_mask_32_128 (0x0000c000); + /* Set up function pointers */ imp->combine_32[PIXMAN_OP_OVER] = vmx_combine_over_u; @@ -2022,5 +3151,9 @@ _pixman_implementation_create_vmx (pixman_implementation_t *fallback) imp->combine_32_ca[PIXMAN_OP_XOR] = vmx_combine_xor_ca; imp->combine_32_ca[PIXMAN_OP_ADD] = vmx_combine_add_ca; + imp->fill = vmx_fill; + + imp->iter_info = vmx_iters; + return imp; } diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman-x86.c b/source/libs/pixman/pixman-src/pixman/pixman-x86.c old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman-x86.c rename to source/libs/pixman/pixman-src/pixman/pixman-x86.c diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman.c b/source/libs/pixman/pixman-src/pixman/pixman.c old mode 100755 new mode 100644 similarity index 97% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman.c rename to source/libs/pixman/pixman-src/pixman/pixman.c index 9555ceaaf..f932eac3c --- a/source/libs/pixman/pixman-0.32.8/pixman/pixman.c +++ b/source/libs/pixman/pixman-src/pixman/pixman.c @@ -325,18 +325,20 @@ _pixman_compute_composite_region32 (pixman_region32_t * region, return TRUE; } -typedef struct +typedef struct box_48_16 box_48_16_t; + +struct box_48_16 { - pixman_fixed_48_16_t x1; - pixman_fixed_48_16_t y1; - pixman_fixed_48_16_t x2; - pixman_fixed_48_16_t y2; -} box_48_16_t; + pixman_fixed_48_16_t x1; + pixman_fixed_48_16_t y1; + pixman_fixed_48_16_t x2; + pixman_fixed_48_16_t y2; +}; static pixman_bool_t -compute_transformed_extents (pixman_transform_t *transform, +compute_transformed_extents (pixman_transform_t *transform, const pixman_box32_t *extents, - box_48_16_t *transformed) + box_48_16_t *transformed) { pixman_fixed_48_16_t tx1, ty1, tx2, ty2; pixman_fixed_t x1, y1, x2, y2; @@ -495,21 +497,12 @@ analyze_extent (pixman_image_t *image, if (!compute_transformed_extents (transform, extents, &transformed)) return FALSE; - /* Expand the source area by a tiny bit so account of different rounding that - * may happen during sampling. Note that (8 * pixman_fixed_e) is very far from - * 0.5 so this won't cause the area computed to be overly pessimistic. - */ - transformed.x1 -= 8 * pixman_fixed_e; - transformed.y1 -= 8 * pixman_fixed_e; - transformed.x2 += 8 * pixman_fixed_e; - transformed.y2 += 8 * pixman_fixed_e; - if (image->common.type == BITS) { - if (pixman_fixed_to_int (transformed.x1) >= 0 && - pixman_fixed_to_int (transformed.y1) >= 0 && - pixman_fixed_to_int (transformed.x2) < image->bits.width && - pixman_fixed_to_int (transformed.y2) < image->bits.height) + if (pixman_fixed_to_int (transformed.x1 - pixman_fixed_e) >= 0 && + pixman_fixed_to_int (transformed.y1 - pixman_fixed_e) >= 0 && + pixman_fixed_to_int (transformed.x2 - pixman_fixed_e) < image->bits.width && + pixman_fixed_to_int (transformed.y2 - pixman_fixed_e) < image->bits.height) { *flags |= FAST_PATH_SAMPLES_COVER_CLIP_NEAREST; } diff --git a/source/libs/pixman/pixman-0.32.8/pixman/pixman.h b/source/libs/pixman/pixman-src/pixman/pixman.h old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/pixman.h rename to source/libs/pixman/pixman-src/pixman/pixman.h diff --git a/source/libs/pixman/pixman-0.32.8/pixman/solaris-hwcap.mapfile b/source/libs/pixman/pixman-src/pixman/solaris-hwcap.mapfile old mode 100755 new mode 100644 similarity index 100% rename from source/libs/pixman/pixman-0.32.8/pixman/solaris-hwcap.mapfile rename to source/libs/pixman/pixman-src/pixman/solaris-hwcap.mapfile diff --git a/source/libs/pixman/version.ac b/source/libs/pixman/version.ac index c0935e7a3..149bb50d1 100644 --- a/source/libs/pixman/version.ac +++ b/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.32.8]) +m4_define([pixman_version], [0.34.0]) diff --git a/source/texk/README b/source/texk/README index d039d2321..993b4e5a2 100644 --- a/source/texk/README +++ b/source/texk/README @@ -1,4 +1,4 @@ -$Id: README 39295 2016-01-06 05:27:06Z kakuto $ +$Id: README 39470 2016-01-23 22:38:00Z kakuto $ Copyright 2006-2015 TeX Users Group. You may freely use, modify and/or distribute this file. @@ -59,10 +59,10 @@ dvipos - ? dvipsk - maintained here, by us -dvisvgm 1.14.1 - checked 6jan16 +dvisvgm 1.14.2 - checked 20jan16 http://dvisvgm.bplaced.net/Downloads -gregorio 4.0.1 - checked 29dec15 +gregorio 4.1.0-beta1 - checked 23jan16 https://github.com/gregorio-project/gregorio/releases/ gsftopk - from Paul Vojta's xdvi? diff --git a/source/texk/kpathsea/ChangeLog b/source/texk/kpathsea/ChangeLog index f43e07ec9..82b10a2ba 100644 --- a/source/texk/kpathsea/ChangeLog +++ b/source/texk/kpathsea/ChangeLog @@ -1,3 +1,8 @@ +2016-02-03 Akira Kakuto <kakuto@fuk.kindai.ac.jp> + + * win32lib.[ch], mingw32.[ch]: Define a function + double win32_floor (double x), since floor is defined in cpascal.h. + 2015-12-29 Akira Kakuto <kakuto@fuk.kindai.ac.jp> * win32lib.h: Update (w32 only). diff --git a/source/texk/kpathsea/mingw32.c b/source/texk/kpathsea/mingw32.c index f6f73719b..32c23e75d 100644 --- a/source/texk/kpathsea/mingw32.c +++ b/source/texk/kpathsea/mingw32.c @@ -48,6 +48,12 @@ extern int __cdecl _free_osfhnd (int fd); static char *get_home_directory (void); static int _parse_root (char * name, char ** pPath); +double +win32_floor (double x) +{ + return floor (x); +} + void init_user_info (void) { diff --git a/source/texk/kpathsea/mingw32.h b/source/texk/kpathsea/mingw32.h index f05935cef..8db9c135f 100644 --- a/source/texk/kpathsea/mingw32.h +++ b/source/texk/kpathsea/mingw32.h @@ -72,7 +72,8 @@ extern char *quote_args(char **); #endif /* MAKE_KPSE_DLL */ extern KPSEDLL BOOL win32_get_long_filename (char *, char *, int); -extern KPSEDLL void texlive_gs_init(void); +extern KPSEDLL void texlive_gs_init (void); +extern KPSEDLL double win32_floor (double); static inline FILE * win32_popen (const char *command, const char *fmode) diff --git a/source/texk/kpathsea/win32lib.c b/source/texk/kpathsea/win32lib.c index 35a026788..4b176aab9 100644 --- a/source/texk/kpathsea/win32lib.c +++ b/source/texk/kpathsea/win32lib.c @@ -31,6 +31,11 @@ static int is_include_space(const char *s) return 0; } +double win32_floor (double x) +{ + return floor (x); +} + FILE * win32_popen (const char *cmd, const char *fmode) { char mode[3]; diff --git a/source/texk/kpathsea/win32lib.h b/source/texk/kpathsea/win32lib.h index b31ab6235..28aae28d8 100644 --- a/source/texk/kpathsea/win32lib.h +++ b/source/texk/kpathsea/win32lib.h @@ -255,6 +255,7 @@ extern "C" { #endif +extern KPSEDLL double win32_floor (double x); extern KPSEDLL FILE *win32_popen (const char *cmd, const char *mode); extern KPSEDLL int win32_pclose (FILE *f); extern KPSEDLL struct passwd *kpathsea_getpwnam (kpathsea kpse, char *name); diff --git a/source/texk/web2c/cwebdir/README b/source/texk/web2c/cwebdir/README index 1f4add6dd..e4dfc0de0 100644 --- a/source/texk/web2c/cwebdir/README +++ b/source/texk/web2c/cwebdir/README @@ -1,9 +1,9 @@ % This file is part of CWEB. % The CWEB programs by Silvio Levy are based on programs by D. E. Knuth. % They are distributed WITHOUT ANY WARRANTY, express or implied. -% This README file last updated May 2000 by Don Knuth +% This README file last updated January 2016 by Don Knuth -% Copyright (C) 1987,1990,1993,2000 Silvio Levy and Donald E. Knuth +% Copyright (C) 1987,1990,1993,2000,2016 Silvio Levy and Donald E. Knuth % Permission is granted to make and distribute verbatim copies of this % document provided that the copyright notice and this permission notice @@ -14,7 +14,13 @@ % entire resulting derived work is given a different name and distributed % under the terms of a permission notice identical to this one. -% Please send comments, suggestions, etc. to levy@math.berkeley.edu. +% Please send comments, suggestions, etc. to tex-k@tug.org, and people +% there will verify and forward bug reports. +% +% DEK takes no responsibility for the changefiles; they should be +% maintained independently. His job is to correct errors in +% ctangle.w, cweave.w, common.w, cwebmac.tex, cwebman.tex, +% and in the files of examples/*.w, nothing more. This directory contains the following files: diff --git a/source/texk/web2c/cwebdir/cwebmac.tex b/source/texk/web2c/cwebdir/cwebmac.tex index 8890b63b4..d50987da9 100644 --- a/source/texk/web2c/cwebdir/cwebmac.tex +++ b/source/texk/web2c/cwebdir/cwebmac.tex @@ -1,8 +1,8 @@ % standard macros for CWEB listings (in addition to plain.tex) -% Version 3.67 --- July 2006 +% Version 3.68 --- January 2016 \ifx\renewenvironment\undefined\else\endinput\fi % LaTeX will use other macros -\xdef\fmtversion{\fmtversion+CWEB3.67} -\chardef\cwebversion=3 \chardef\cwebrevision=67 +\xdef\fmtversion{\fmtversion+CWEB3.68} +\chardef\cwebversion=3 \chardef\cwebrevision=68 \newif\ifpdf \ifx\pdf+\pdftrue\fi % Uncomment the following line if you want PDF goodies to be the default @@ -278,7 +278,8 @@ \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50 \noindent{\let\*=\lapstar\bf\secstar.\quad}% \ifpdftex\smash{\raise\baselineskip\hbox to0pt{% - \let\*=\empty\pdfdest num \secstar fith}} +% \let\*=\empty\pdfdest num \secstar fith}} % bad space in versions < 3.68 + \let\*=\empty\pdfdest num \secstar fith}}% changed in version 3.68 \else\ifpdf\smash{\raise\baselineskip\hbox to0pt{% \let\*=\empty\special{% pdf: dest (\romannumeral\secstar) [ @thispage /FitH @ypos ]}}}\fi\fi} @@ -340,7 +341,7 @@ \def\T#1{\leavevmode % octal, hex or decimal constant \hbox{$\def\?{\kern.2em}% % \def\$##1{\egroup_{\,\rm##1}\bgroup}% suffix to constant % versions < 3.67 - \def\$##1{\egroup_{\rm##1}\bgroup}% suffix to constant + \def\$##1{\egroup_{\rm##1}\bgroup}% suffix to constant % in version 3.67 \def\_{\cdot 10^{\aftergroup}}% power of ten (via dirty trick) \let\~=\oct \let\^=\hex {#1}$}} \def\U{\note{This code is used in section}} % xref for use of a section @@ -457,6 +458,7 @@ \def\fin{\par\vfill\eject % this is done when we are ending the index \ifpagesaved\null\vfill\eject\fi % output a null index column \if L\lr\else\null\vfill\eject\fi % finish the current page + \ifpdftex \makebookmarks \fi % added in Version 3.68 \parfillskip 0pt plus 1fil \def\grouptitle{NAMES OF THE SECTIONS} \let\topsecno=\nullsec @@ -470,7 +472,8 @@ \def\Us{\note{Used in sections}} % crossref for uses of a section \def\I{\par\hangindent 2em}\let\*=* \ifacro \def\outsecname{Names of the sections} \let\Xpdf\X - \ifpdftex \makebookmarks \pdfdest name {NOS} fitb +% \ifpdftex \makebookmarks \pdfdest name {NOS} fitb % in versions < 3.68 + \ifpdftex \pdfdest name {NOS} fitb % changed in version 3.68 \pdfoutline goto name {NOS} count -\secno {\outsecname} \def\X##1:##2\X{\Xpdf##1:##2\X \firstsecno##1.% {\toksF={}\makeoutlinetoks##2\outlinedone\outlinedone}% diff --git a/source/texk/web2c/lib/ChangeLog b/source/texk/web2c/lib/ChangeLog index 32bf88532..a0ea61120 100644 --- a/source/texk/web2c/lib/ChangeLog +++ b/source/texk/web2c/lib/ChangeLog @@ -1,3 +1,7 @@ +2016-01-26 Akira Kakuto <kakuto@fuk.kinidai.ac.jp> + + * texmfmp.c: Improve to skip BOM (win32 only). + 2016-01-02 Akira Kakuto <kakuto@fuk.kinidai.ac.jp> * printversion.c: 2015 ---> 2016. diff --git a/source/texk/web2c/lib/texmfmp.c b/source/texk/web2c/lib/texmfmp.c index 75c846a33..b5242e2d3 100644 --- a/source/texk/web2c/lib/texmfmp.c +++ b/source/texk/web2c/lib/texmfmp.c @@ -2288,12 +2288,13 @@ input_line (FILE *f) long position = ftell (f); if (position == 0L) { /* Detect and skip Byte order marks. */ - int k1 = getc (f); + int k1, k2, k3, k4; + k1 = getc (f); if (k1 != 0xff && k1 != 0xfe && k1 != 0xef) rewind (f); else { - int k2 = getc (f); + k2 = getc (f); if (k2 != 0xff && k2 != 0xfe && k2 != 0xbb) rewind (f); @@ -2301,10 +2302,11 @@ input_line (FILE *f) (k1 == 0xfe && k2 == 0xff)) /* UTF-16(BE) */ ; else { - int k3 = getc (f); - - if (k1 == 0xef && k2 == 0xbb && k3 == 0xbf) /* UTF-8 */ - ; + k3 = getc (f); + k4 = getc (f); + if (k1 == 0xef && k2 == 0xbb && k3 == 0xbf && + k4 >= 0 && k4 <= 0x7e) /* UTF-8 */ + ungetc (k4, f); else rewind (f); } diff --git a/source/texk/web2c/luatexdir/lang/texlang.w b/source/texk/web2c/luatexdir/lang/texlang.w index 65cc3c163..8e0deb335 100644 --- a/source/texk/web2c/luatexdir/lang/texlang.w +++ b/source/texk/web2c/luatexdir/lang/texlang.w @@ -26,7 +26,7 @@ @ Low-level helpers @ @c -#define noVERBOSE +#define unVERBOSE #define MAX_TEX_LANGUAGES 16384 @@ -795,7 +795,9 @@ static int valid_wordend(halfword s) || type(r) == ins_node || type(r) == adjust_node || type(r) == penalty_node - || (type(r) == kern_node && (subtype(r) == explicit || subtype(r) == acc_kern))) + || (type(r) == kern_node && (subtype(r) == explicit_kern || + subtype(r) == italic_kern || + subtype(r) == accent_kern ))) return 1; return 0; } diff --git a/source/texk/web2c/luatexdir/lua/lpdflib.c b/source/texk/web2c/luatexdir/lua/lpdflib.c index cb7aa5aba..210bc41a7 100644 --- a/source/texk/web2c/luatexdir/lua/lpdflib.c +++ b/source/texk/web2c/luatexdir/lua/lpdflib.c @@ -730,12 +730,12 @@ static int l_getmatrix(lua_State * L) { if (matrix_stack_used > 0) { matrix_entry *m = &matrix_stack[matrix_stack_used - 1]; - lua_pushinteger(L, m->a); - lua_pushinteger(L, m->b); - lua_pushinteger(L, m->c); - lua_pushinteger(L, m->d); - lua_pushinteger(L, m->e); - lua_pushinteger(L, m->f); + lua_pushnumber(L, m->a); + lua_pushnumber(L, m->b); + lua_pushnumber(L, m->c); + lua_pushnumber(L, m->d); + lua_pushnumber(L, m->e); + lua_pushnumber(L, m->f); } else { lua_pushinteger(L, 1); lua_pushinteger(L, 0); diff --git a/source/texk/web2c/luatexdir/luatex.c b/source/texk/web2c/luatexdir/luatex.c index 23e5252dc..14d5fd2cd 100644 --- a/source/texk/web2c/luatexdir/luatex.c +++ b/source/texk/web2c/luatexdir/luatex.c @@ -30,7 +30,7 @@ int luatex_version = 89; /* \.{\\luatexversion} */ int luatex_revision = '0'; /* \.{\\luatexrevision} */ -int luatex_date_info = 2016012800; /* the compile date is now hardwired */ +int luatex_date_info = 2016020500; /* the compile date is now hardwired */ const char *luatex_version_string = "beta-0.89.0"; const char *engine_name = my_name; /* the name of this engine */ diff --git a/source/texk/web2c/luatexdir/pdf/pdfgen.w b/source/texk/web2c/luatexdir/pdf/pdfgen.w index f14254c19..b9f34c270 100644 --- a/source/texk/web2c/luatexdir/pdf/pdfgen.w +++ b/source/texk/web2c/luatexdir/pdf/pdfgen.w @@ -538,6 +538,7 @@ void pdf_print_int(PDF pdf, longinteger n) } @ @c +/* void print_pdffloat(PDF pdf, pdffloat f) { char a[24]; @@ -561,6 +562,53 @@ void print_pdffloat(PDF pdf, pdffloat f) pdf_puts(pdf, (a + 1)); } } +*/ + +void print_pdffloat(PDF pdf, pdffloat f) +{ + int64_t m = f.m; + if (m == 0) { + pdf_out(pdf, '0'); + } else { + int e = f.e; + if (e == 0) { + /* division by ten_pow[0] == 1 */ + if (m == 1) { + pdf_out(pdf, '1'); + } else { + char a[24]; + snprintf(a, 23, "%i", m); + pdf_puts(pdf, a); + } + } else { + int t = ten_pow[e] ; + if (t == m) { + pdf_out(pdf, '1'); + } else { + int i; + char a[24]; + int l = m / t; + int w = snprintf(a, 23, "%i", l); + pdf_out_block(pdf, (const char *) a, (size_t) w); + if (m < 0) { + l = - m % t; + } else { + l = m % t; + } + if (l != 0) { + pdf_out(pdf, '.'); + snprintf(a, 23, "%d", l + t); + for (i = e; i > 0; i--) { + if (a[i] != '0') + break; + a[i] = '\0'; + } + pdf_puts(pdf, (a + 1)); + } + } + } + } +} @ print out |s| as string in PDF output @@ -914,7 +962,8 @@ static void init_pdf_outputparameters(PDF pdf) int pk_mode; pdf->draftmode = fix_int(int_par(draft_mode_code), 0, 1); pdf->compress_level = fix_int(pdf_compress_level, 0, 9); - pdf->decimal_digits = fix_int(pdf_decimal_digits, 3, 6); + pdf->decimal_digits = fix_int(pdf_decimal_digits, 3, 5); +/* pdf->decimal_digits = fix_int(pdf_decimal_digits, 3, 6);*//* later, maybe (LS)*/ pdf->gamma = fix_int(pdf_gamma, 0, 1000000); pdf->image_gamma = fix_int(pdf_image_gamma, 0, 1000000); pdf->image_hicolor = fix_int(pdf_image_hicolor, 0, 1); diff --git a/source/texk/web2c/luatexdir/pdf/pdfpage.w b/source/texk/web2c/luatexdir/pdf/pdfpage.w index 34bb5d1e9..90f63534d 100644 --- a/source/texk/web2c/luatexdir/pdf/pdfpage.w +++ b/source/texk/web2c/luatexdir/pdf/pdfpage.w @@ -105,16 +105,16 @@ boolean calc_pdfpos(pdfstructure * p, scaledpos pos) boolean move_pdfpos = false; switch (p->mode) { case PMODE_PAGE: - new.h = i32round(pos.h * p->k1); - new.v = i32round(pos.v * p->k1); + new.h = i64round(pos.h * p->k1); + new.v = i64round(pos.v * p->k1); p->cm[4].m = new.h - p->pdf.h.m; /* cm is concatenated */ p->cm[5].m = new.v - p->pdf.v.m; if (new.h != p->pdf.h.m || new.v != p->pdf.v.m) move_pdfpos = true; break; case PMODE_TEXT: - new.h = i32round(pos.h * p->k1); - new.v = i32round(pos.v * p->k1); + new.h = i64round(pos.h * p->k1); + new.v = i64round(pos.v * p->k1); p->tm[4].m = new.h - p->pdf_bt_pos.h.m; /* Tm replaces */ p->tm[5].m = new.v - p->pdf_bt_pos.v.m; if (new.h != p->pdf.h.m || new.v != p->pdf.v.m) @@ -124,16 +124,16 @@ boolean calc_pdfpos(pdfstructure * p, scaledpos pos) case PMODE_CHARARRAY: switch (p->wmode) { case WMODE_H: - new.h = i32round((pos.h * p->k1 - (double) p->pdf_tj_pos.h.m) * p->k2); - new.v = i32round(pos.v * p->k1); + new.h = i64round((pos.h * p->k1 - (double) p->pdf_tj_pos.h.m) * p->k2); + new.v = i64round(pos.v * p->k1); p->tj_delta.m = -i64round((double) ((new.h - p->cw.m) / ten_pow[p->cw.e - p->tj_delta.e])); p->tm[5].m = new.v - p->pdf_bt_pos.v.m; /* p->tm[4] is meaningless */ if (p->tj_delta.m != 0 || new.v != p->pdf.v.m) move_pdfpos = true; break; case WMODE_V: - new.h = i32round(pos.h * p->k1); - new.v = i32round(((double) p->pdf_tj_pos.v.m - pos.v * p->k1) * p->k2); + new.h = i64round(pos.h * p->k1); + new.v = i64round(((double) p->pdf_tj_pos.v.m - pos.v * p->k1) * p->k2); p->tm[4].m = new.h - p->pdf_bt_pos.h.m; /* p->tm[5] is meaningless */ p->tj_delta.m = -i64round((double) ((new.v - p->cw.m) / ten_pow[p->cw.e - p->tj_delta.e])); if (p->tj_delta.m != 0 || new.h != p->pdf.h.m) diff --git a/source/texk/web2c/luatexdir/pdf/pdfrule.w b/source/texk/web2c/luatexdir/pdf/pdfrule.w index e4897dfb0..2f75b4c76 100644 --- a/source/texk/web2c/luatexdir/pdf/pdfrule.w +++ b/source/texk/web2c/luatexdir/pdf/pdfrule.w @@ -54,7 +54,7 @@ void pdf_place_rule(PDF pdf, halfword q, scaledpos size, int callback_id) dim.v.e = p->pdf.v.e; pdf_puts(pdf, "q\n"); if (size.v <= one_bp) { - pos.v += i32round(0.5 * size.v); + pos.v += i64round(0.5 * size.v); pdf_set_pos_temp(pdf, pos); pdf_puts(pdf, "[]0 d 0 J "); print_pdffloat(pdf, dim.v); @@ -62,7 +62,7 @@ void pdf_place_rule(PDF pdf, halfword q, scaledpos size, int callback_id) print_pdffloat(pdf, dim.h); pdf_puts(pdf, " 0 l S\n"); } else if (size.h <= one_bp) { - pos.h += i32round(0.5 * size.h); + pos.h += i64round(0.5 * size.h); pdf_set_pos_temp(pdf, pos); pdf_puts(pdf, "[]0 d 0 J "); print_pdffloat(pdf, dim.h); diff --git a/source/texk/web2c/luatexdir/pdf/pdftypes.h b/source/texk/web2c/luatexdir/pdf/pdftypes.h index 8a670a527..71f843e00 100644 --- a/source/texk/web2c/luatexdir/pdf/pdftypes.h +++ b/source/texk/web2c/luatexdir/pdf/pdftypes.h @@ -36,7 +36,14 @@ # define pdfkeyprefix "PTEX" # define i32round(a) (int) floor((a) + 0.5) -# define i64round(a) (int64_t) floor((a) + 0.5) +/*# define i64round(a) (int64_t) floor((a) + 0.5)*/ +/*# define i64round(a) (int64_t) ( (double)(a+0.5) - ((int64_t)(a+0.5))%1 ) */ +#ifdef _WIN32 +# define i64round(a) (int64_t) win32_floor((a) + 0.5) +#else +# define i64round(a) (int64_t) lround((a)) +#endif + # define MAX_OBJ_COMPRESS_LEVEL 3 /* maximum/clipping value for \pdfobjcompresslevel */ # define OBJSTM_UNSET -1 /* initial value */ @@ -81,9 +88,12 @@ typedef struct { # define scaled int typedef struct scaledpos_ { - scaled h; - scaled v; -} scaledpos; + int64_t h; + int64_t v; + } scaledpos; + + + typedef struct scaled_whd_ { scaled wd; /* TeX width */ diff --git a/source/texk/web2c/luatexdir/tex/commands.h b/source/texk/web2c/luatexdir/tex/commands.h index d2a7779a0..60bfef895 100644 --- a/source/texk/web2c/luatexdir/tex/commands.h +++ b/source/texk/web2c/luatexdir/tex/commands.h @@ -327,13 +327,10 @@ typedef enum { expand_font_code, } normal_codes; -# define explicit 1 -# define acc_kern 2 # define lp_code_base 2 # define rp_code_base 3 # define ef_code_base 4 # define tag_code 5 -# define auto_kern explicit # define no_lig_code 6 # define immediate_code 4 /* command modifier for \.{\\immediate} */ diff --git a/source/texk/web2c/luatexdir/tex/commands.w b/source/texk/web2c/luatexdir/tex/commands.w index 125b203a3..53497af52 100644 --- a/source/texk/web2c/luatexdir/tex/commands.w +++ b/source/texk/web2c/luatexdir/tex/commands.w @@ -405,7 +405,7 @@ void initialize_commands(void) primitive_tex("vss", vskip_cmd, ss_code, 0); primitive_tex("vfilneg", vskip_cmd, fil_neg_code, 0); primitive_tex("mskip", mskip_cmd, mskip_code, 0); - primitive_tex("kern", kern_cmd, explicit, 0); + primitive_tex("kern", kern_cmd, explicit_kern, 0); primitive_tex("mkern", mkern_cmd, mu_glue, 0); primitive_tex("moveleft", hmove_cmd, 1, 0); primitive_tex("moveright", hmove_cmd, 0, 0); diff --git a/source/texk/web2c/luatexdir/tex/linebreak.w b/source/texk/web2c/luatexdir/tex/linebreak.w index 28ab6fa55..b2909606d 100644 --- a/source/texk/web2c/luatexdir/tex/linebreak.w +++ b/source/texk/web2c/luatexdir/tex/linebreak.w @@ -913,7 +913,7 @@ static void compute_break_width(int break_type, int line_break_dir, int adjust_s case penalty_node: break; case kern_node: - if (subtype(s) != explicit) + if (subtype(s) != explicit_kern && subtype(s) != italic_kern) return; else break_width[1] -= width(s); @@ -1866,7 +1866,8 @@ void ext_do_line_break(int paragraph_dir, if (prev_p != temp_head && ( is_char_node(prev_p) || precedes_break(prev_p) - || ((type(prev_p) == kern_node) && (subtype(prev_p) != explicit)) + || ((type(prev_p) == kern_node) && (subtype(prev_p) != explicit_kern && + subtype(prev_p) != italic_kern )) )) { ext_try_break(0, unhyphenated_node, line_break_dir, adjust_spacing, par_shape_ptr, adj_demerits, @@ -1889,7 +1890,7 @@ void ext_do_line_break(int paragraph_dir, /* end mathskip code */ break; case kern_node: - if (subtype(cur_p) == explicit) { + if (subtype(cur_p) == explicit_kern || subtype(cur_p) == italic_kern) { kern_break(); } else { active_width[1] += width(cur_p); diff --git a/source/texk/web2c/luatexdir/tex/maincontrol.w b/source/texk/web2c/luatexdir/tex/maincontrol.w index c6b30b099..ff7e7279a 100644 --- a/source/texk/web2c/luatexdir/tex/maincontrol.w +++ b/source/texk/web2c/luatexdir/tex/maincontrol.w @@ -25,13 +25,10 @@ /* these will move to equivalents.h */ @ @c -#define explicit 1 -#define acc_kern 2 #define lp_code_base 2 #define rp_code_base 3 #define ef_code_base 4 #define tag_code 5 -#define auto_kern explicit #define no_lig_code 6 #define gp_code_base 7 @@ -505,7 +502,7 @@ static void run_par_end_hmode (void) { @ @c static void append_italic_correction_mmode (void) { - tail_append(new_kern(0)); + tail_append(new_kern(0)); /* what subtype to use */ } @ @c @@ -1810,7 +1807,7 @@ void append_italic_correction(void) return; f = font(p); tail_append(new_kern(char_italic(f, character(p)))); - subtype(tail) = explicit; + subtype(tail) = italic_kern; } } @@ -2035,11 +2032,11 @@ void make_accent(void) } delta = round(float_cast(w - a) / float_constant(2) + h * t - x * s); /* real multiplication */ r = new_kern(delta); - subtype(r) = acc_kern; + subtype(r) = accent_kern; couple_nodes(tail, r); couple_nodes(r, p); tail = new_kern(-a - delta); - subtype(tail) = acc_kern; + subtype(tail) = accent_kern; couple_nodes(p, tail); p = q; diff --git a/source/texk/web2c/luatexdir/tex/mlist.w b/source/texk/web2c/luatexdir/tex/mlist.w index 035ef6340..fbded2844 100644 --- a/source/texk/web2c/luatexdir/tex/mlist.w +++ b/source/texk/web2c/luatexdir/tex/mlist.w @@ -1567,7 +1567,7 @@ static void math_kern(pointer p, scaled m) f = f + unity; } width(p) = mu_mult(width(p)); - subtype(p) = explicit; + subtype(p) = italic_kern; } } diff --git a/source/texk/web2c/luatexdir/tex/postlinebreak.w b/source/texk/web2c/luatexdir/tex/postlinebreak.w index 873eaf968..b78b599aa 100644 --- a/source/texk/web2c/luatexdir/tex/postlinebreak.w +++ b/source/texk/web2c/luatexdir/tex/postlinebreak.w @@ -174,7 +174,7 @@ void ext_post_line_break(int paragraph_dir, break; } else if (non_discardable(q)) { break; - } else if (type(q) == kern_node && subtype(q) != explicit) { + } else if (type(q) == kern_node && subtype(q) != explicit_kern && subtype(q) != italic_kern) { break; } q = vlink(q); @@ -559,7 +559,7 @@ void ext_post_line_break(int paragraph_dir, if (q == cur_break(cur_p) || is_char_node(q)) break; if (!((type(q) == local_par_node))) { - if (non_discardable(q) || (type(q) == kern_node && subtype(q) != explicit)) + if (non_discardable(q) || (type(q) == kern_node && subtype(q) != explicit_kern && subtype(q) != italic_kern)) break; } */ @@ -581,7 +581,7 @@ void ext_post_line_break(int paragraph_dir, /* weird, in the middle somewhere */ } else if (non_discardable(q)) { break; - } else if (type(q) == kern_node && subtype(q) != explicit) { + } else if (type(q) == kern_node && subtype(q) != explicit_kern && subtype(q) != italic_kern) { break; } r = q; diff --git a/source/texk/web2c/luatexdir/tex/printing.w b/source/texk/web2c/luatexdir/tex/printing.w index baafa24a8..478d55f88 100644 --- a/source/texk/web2c/luatexdir/tex/printing.w +++ b/source/texk/web2c/luatexdir/tex/printing.w @@ -987,11 +987,13 @@ void short_display_n(int p, int m) print(character(p)); } } else { - if ((type(p) == glue_node) || - (type(p) == disc_node) || - (type(p) == penalty_node) || - ((type(p) == kern_node) && (subtype(p) == explicit))) + if ( (type(p) == glue_node) || + (type(p) == disc_node) || + (type(p) == penalty_node) || + ((type(p) == kern_node) && (subtype(p) == explicit_kern || + subtype(p) == italic_kern ))) { incr(i); + } if (i >= m) return; if (type(p) == disc_node) { diff --git a/source/texk/web2c/luatexdir/tex/texnodes.h b/source/texk/web2c/luatexdir/tex/texnodes.h index 618902b58..d5198b92f 100644 --- a/source/texk/web2c/luatexdir/tex/texnodes.h +++ b/source/texk/web2c/luatexdir/tex/texnodes.h @@ -177,9 +177,14 @@ typedef enum { # define tlink_post_break(a) tlink(post_break_head(a)) # define tlink_no_break(a) tlink(no_break_head(a)) +typedef enum { + font_kern = 0, + explicit_kern, /* |subtype| of kern nodes from \.{\\kern} and \.{\\/} */ + accent_kern, /* |subtype| of kern nodes from accents */ + italic_kern, +} kern_subtypes; + # define kern_node_size 5 -# define explicit 1 /* |subtype| of kern nodes from \.{\\kern} and \.{\\/} */ -# define acc_kern 2 /* |subtype| of kern nodes from accents */ # define ex_kern(a) vinfo((a)+3) /* expansion factor (hz) */ # define synctex_tag_kern(a) vinfo((a)+4) # define synctex_line_kern(a) vlink((a)+4) diff --git a/source/texk/web2c/luatexdir/tex/texnodes.w b/source/texk/web2c/luatexdir/tex/texnodes.w index 0e0c92676..de7181399 100644 --- a/source/texk/web2c/luatexdir/tex/texnodes.w +++ b/source/texk/web2c/luatexdir/tex/texnodes.w @@ -280,7 +280,7 @@ const char *node_subtypes_penalty[] = { "userpenalty", NULL }; const char *node_subtypes_kern[] = { - "fontkern", "userkern", "accentkern", NULL + "fontkern", "userkern", "accentkern", "italiccorrection", NULL }; const char *node_subtypes_rule[] = { "normal", "box", "image", "empty", "user", NULL @@ -3092,7 +3092,7 @@ void show_node_list(int p) if (subtype(p) != normal) print_char(' '); print_scaled(width(p)); - if (subtype(p) == acc_kern) + if (subtype(p) == accent_kern) tprint(" (for accent)"); } else { tprint_esc("mkern"); diff --git a/source/texk/web2c/luatexdir/tex/textoken.w b/source/texk/web2c/luatexdir/tex/textoken.w index 4b14b6ec9..5b10b1cdd 100644 --- a/source/texk/web2c/luatexdir/tex/textoken.w +++ b/source/texk/web2c/luatexdir/tex/textoken.w @@ -238,6 +238,10 @@ including the expansion of a macro or mark. @c void print_meaning(void) { + if (cur_cmd == math_char_num_cmd && cur_chr == 0) { + /* \mathchar -> \Umathchar */ + cur_chr = 1 ; + } print_cmd_chr((quarterword) cur_cmd, cur_chr); if (cur_cmd >= call_cmd) { print_char(':'); @@ -249,21 +253,21 @@ void print_meaning(void) print_char(':'); print_ln(); switch (cur_chr) { - case first_mark_code: - token_show(first_mark(0)); - break; - case bot_mark_code: - token_show(bot_mark(0)); - break; - case split_first_mark_code: - token_show(split_first_mark(0)); - break; - case split_bot_mark_code: - token_show(split_bot_mark(0)); - break; - default: - token_show(top_mark(0)); - break; + case first_mark_code: + token_show(first_mark(0)); + break; + case bot_mark_code: + token_show(bot_mark(0)); + break; + case split_first_mark_code: + token_show(split_first_mark(0)); + break; + case split_bot_mark_code: + token_show(split_bot_mark(0)); + break; + default: + token_show(top_mark(0)); + break; } } } -- GitLab