From f46cac75c06d8e103d9e90800d2ee4eb9aa50245 Mon Sep 17 00:00:00 2001 From: luigi Date: Fri, 5 Feb 2016 13:40:43 +0000 Subject: [PATCH] sync with experimental git-svn-id: https://foundry.supelec.fr/svn/luatex/trunk@5774 0b2b3880-5936-4365-a048-eb17d2e5a6bf --- 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/pixman-0.32.8/pixman/pixman-combine32.c | 2581 -------------------- .../ChangeLog | 5 + .../TL-Changes | 3 +- .../patch-01-hide-symbols | 6 +- .../pixman/{pixman-0.32.8 => pixman-src}/AUTHORS | 0 .../pixman/{pixman-0.32.8 => pixman-src}/COPYING | 0 .../pixman/{pixman-0.32.8 => pixman-src}/ChangeLog | 0 .../pixman/{pixman-0.32.8 => pixman-src}/INSTALL | 0 .../{pixman-0.32.8 => pixman-src}/Makefile.am | 0 .../{pixman-0.32.8 => pixman-src}/Makefile.win32 | 0 .../Makefile.win32.common | 0 .../libs/pixman/{pixman-0.32.8 => pixman-src}/NEWS | 0 .../pixman/{pixman-0.32.8 => pixman-src}/README | 0 .../{pixman-0.32.8 => pixman-src}/config.h.in | 6 +- .../{pixman-0.32.8 => pixman-src}/configure.ac | 42 +- .../pixman-1-uninstalled.pc.in | 0 .../{pixman-0.32.8 => pixman-src}/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 .../libs/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/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-0.32.8 => pixman-src}/pixman/pixman.c | 35 +- .../{pixman-0.32.8 => pixman-src}/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 +- source/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{} \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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 z%0Ab<{7X8>t{;$?r(<5HqOhRA4US?X>OeZe+(A7c7z-j{$=IF9iyBCT8d7j>A#Jxv z55E&xkojGSjtz>726L;T znS*6DA@*c~Xoj%}YqY!(yt&T+$Wqpum#vxX!An+^fIUpZWHf$#?RP)Ku^j^?j!jn*b{D1UaRzmkx}^Q{$g(6q;pK^UUzE2%+sY5pb^6is_*D> zUrQTodM^vK!1W=;=dJ#{%49E9kxSxPIw`*^1gpO_eC(z|vUoM35UAcN9V$A%xO$1q z7YVN1X_g9kZl;BYY$h`U?WJ?{jY;wZUaRTIRm{e$3ueV49Gp8ujGMvJH}_$ zwla|NISVdfw|!@5P#y$fFR?|KvCWFMvt|L$Z|byb#Y>oZF@ZJR&j&!GBZsLu*;jgsV&bNf)=8vW5?w z!J#l;#FZfs*~XBpVn{}Tcs}C^1Wh<%+l38T1mZau4P^8ad?mHv)b-s@9vF*B~; z|F`T1>IRR>;@)u>K<1!cC>;ESU^w_FT$o3b;3^%DP2mwz&gLMN@Q6hd@Kz`oWDG8` z5;#V~4cG7Bydke5G_@!snhux z$o|e0sCY$pkC{b6igrAZ5tYq)s6fn+->qtO50XLG`N!})6UOO8hV^raDgTN$ipA3rBhv63CyYLYDGLh>2xCV&MrO6%^^*_ zsYUZx*y^%mT=`ay)VR1$t3+y)I54&#_2r!tGiINbI*#KHnP0rtW8vzQ?c$V|xeLvj z=xi9w5--Jyu$Om{!4Ug9ijhSNW)l*V>%G6;)Ft06zF(U<-73H?+d~5MA!@Max;9dSe%ogb#5;PWw8vIWuU%(yKU0>j0f{Ghn%&Jgp zWjI4{pQ;0zz~|Qd)u1>Tj&7(kUmfPgn9xb;(Y+4voYxFHUfw%QPC2w2-qU};1TkcrSHO(@<}l)%{^6C4X@ip<|US0n@}%! zk>hF;r$)hB3Zgm97WX6E^_dbawxhDoJGCm(sQA!Hd$!>bd8W6Ac~m z%waQ_@EVs`mUQc!o&5zPztJfVyUSwo7DKrrCEY#TYepuLtikl|!{t5U(JxO$#kEFo zgwjGs;$pRqsqJ~3%*T5*XuEr1jbpkw0JLT7o@eFgqcB?kB&cJxGN6kWx3i7c!CTS!aFjG zyN{*i(NH;T-ogk@3rA~Dh4QB`(1XxEtxg_d1joYC9#TR{X~1HS%`3LWyd`*v$!*Q_oP#K9q5aU~7D| zZK&;VEKaZu*e>tm{@K?U<-S(D>aZN!wURumFgSY8D9-(JF~MQyb*5llP=9U|r<}gw z*tSAczN@SWNF9^DZ=~Vk-yDWxO_zFR9}R9PD^HLXaiq2>!Li9rU7n2fqP=ns#v4W0 zH=c|Q$LfY-J@Qo;cW9HIZ8P!ZC}~91Ve0R*osZ3a>~1Izm!37pkwnDZif|YPVwnP& z$@usU55q8WhF+AVZGHD2L}mY*4=(7L8?c!l|AqRq<$W+Z&mRV9HLdf#Rz5pgHb(WI zejEI0NhntBzF;C#8x^~#lm)QX~zcoIo`{1iRw*{cwG=P5st z*{AqyL2yWX5=qQs3^5)Euji2d!1Qqm)-ECOIiv*92xiCx#l2Ww^7-1QH9hWL+Van^ zHKz3%(&j9tuG_@7g6=0eEP1CLxf&Zsjo|o4empn5B$(~v4l<%GhoG=ng*qU3PgLQD z>vbghX-S%3nk?yejJ!>vr?_&n{%Q|-^64?ud7!^Q*)!zY^t3)lCX{m{@?%ouN+Us-u}G=h-!F`#|+IkxZbllx(+y4N#4E!Dd 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 + + * Makefile.am (AM_CPPFLAGS): add LIBPNG_USER_CPPFLAGS for Mojca. + http://tug.org/pipermail/tlbuild/2016q1/003327.html + 2016-01-15 Akira Kakuto 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 +## Copyright (C) 2009-2016 Peter Breitenlohner ## ## 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 + + Import pixman-0.34.0. + * version.ac: Adapted. + * configure.ac: New source tree convension. + 2015-09-26 Peter Breitenlohner 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 2012-11-15 Peter Breitenlohner +2016-02-04 Akira Kakuto 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 . # @@ -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 @@ -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 -#endif - -#include -#include - -#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 + + Import pixman-0.34.0. + * patch-01-hide-symbols: Adapted. + 2015-09-26 Peter Breitenlohner 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 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 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 +#include + +/* 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 #include #include +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 #include #include +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 ]]) + 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. @@ -87,6 +97,11 @@ #endif /* + * Offset into stack where space allocated during init macro can be accessed. + */ +.set LOCALS_STACK_OFFSET, 0 + +/* * Constants for selecting preferable prefetch type. */ .set PREFETCH_TYPE_NONE, 0 @@ -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 +#endif + +#include +#include + +#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 #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 + + * win32lib.[ch], mingw32.[ch]: Define a function + double win32_floor (double x), since floor is defined in cpascal.h. + 2015-12-29 Akira Kakuto * 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 + + * texmfmp.c: Improve to skip BOM (win32 only). + 2016-01-02 Akira Kakuto * 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; } } } -- 2.11.4.GIT