From dbd767376b2053bd5b4e0cae2f96d93c53f42df6 Mon Sep 17 00:00:00 2001 From: LaurentGom Date: Mon, 5 Apr 2010 19:04:49 +0000 Subject: [PATCH] The external libs used by sfml-graphics are now linked instead of being integrated to the source code git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/branches/sfml2@1491 4e206d99-4929-0410-ac5d-dfc041789085 --- build/codeblocks/batch-build/build.bat | 4 + build/codeblocks/sfml-graphics.cbp | 276 +- build/vc2005/sfml-graphics.vcproj | 2940 +---- build/vc2008/sfml-graphics.vcproj | 2940 +---- .../GLEW => extlibs/headers/GL}/glew.h | 0 .../GLEW => extlibs/headers/GL}/glxew.h | 0 .../GLEW => extlibs/headers/GL}/wglew.h | 0 .../Graphics => extlibs/headers}/SOIL/SOIL.h | 0 .../headers/jpeg}/jconfig.h | 0 .../libjpeg => extlibs/headers/jpeg}/jerror.h | 0 .../headers/jpeg}/jmorecfg.h | 0 .../headers/jpeg}/jpeglib.h | 0 .../libpng => extlibs/headers/png}/png.h | 0 .../libpng => extlibs/headers/png}/pngconf.h | 0 .../Graphics => extlibs/headers}/zlib/zconf.h | 0 .../Graphics => extlibs/headers}/zlib/zlib.h | 0 extlibs/libs-mingw/libglew.a | Bin 0 -> 294338 bytes extlibs/libs-mingw/libjpeg.a | Bin 0 -> 195202 bytes extlibs/libs-mingw/libpng.a | Bin 0 -> 243584 bytes extlibs/libs-mingw/libsoil.a | Bin 0 -> 85500 bytes extlibs/libs-vc2005/glew.lib | Bin 0 -> 697312 bytes extlibs/libs-vc2005/jpeg.lib | Bin 0 -> 216126 bytes extlibs/libs-vc2005/png.lib | Bin 0 -> 353400 bytes extlibs/libs-vc2005/soil.lib | Bin 0 -> 90964 bytes src/SFML/Graphics/GLCheck.hpp | 2 +- src/SFML/Graphics/GLEW/glew.c | 9752 ----------------- src/SFML/Graphics/ImageLoader.cpp | 10 +- .../Graphics/Linux/RenderImageImplPBuffer.hpp | 4 +- src/SFML/Graphics/SOIL/SOIL.c | 132 - src/SFML/Graphics/SOIL/image_DXT.c | 632 -- src/SFML/Graphics/SOIL/image_DXT.h | 123 - src/SFML/Graphics/SOIL/stb_image_aug.c | 3749 ------- src/SFML/Graphics/SOIL/stb_image_aug.h | 357 - src/SFML/Graphics/SOIL/stbi_DDS_aug.h | 21 - src/SFML/Graphics/SOIL/stbi_DDS_aug_c.h | 511 - .../Graphics/Win32/RenderImageImplPBuffer.hpp | 4 +- src/SFML/Graphics/libjpeg/cderror.h | 132 - src/SFML/Graphics/libjpeg/jcapimin.c | 280 - src/SFML/Graphics/libjpeg/jcapistd.c | 161 - src/SFML/Graphics/libjpeg/jccoefct.c | 449 - src/SFML/Graphics/libjpeg/jccolor.c | 459 - src/SFML/Graphics/libjpeg/jcdctmgr.c | 387 - src/SFML/Graphics/libjpeg/jchuff.c | 909 -- src/SFML/Graphics/libjpeg/jchuff.h | 47 - src/SFML/Graphics/libjpeg/jcinit.c | 72 - src/SFML/Graphics/libjpeg/jcmainct.c | 293 - src/SFML/Graphics/libjpeg/jcmarker.c | 664 -- src/SFML/Graphics/libjpeg/jcmaster.c | 590 - src/SFML/Graphics/libjpeg/jcomapi.c | 106 - src/SFML/Graphics/libjpeg/jcparam.c | 610 -- src/SFML/Graphics/libjpeg/jcphuff.c | 833 -- src/SFML/Graphics/libjpeg/jcprepct.c | 354 - src/SFML/Graphics/libjpeg/jcsample.c | 519 - src/SFML/Graphics/libjpeg/jctrans.c | 388 - src/SFML/Graphics/libjpeg/jdapimin.c | 395 - src/SFML/Graphics/libjpeg/jdapistd.c | 275 - src/SFML/Graphics/libjpeg/jdatadst.c | 151 - src/SFML/Graphics/libjpeg/jdatasrc.c | 212 - src/SFML/Graphics/libjpeg/jdcoefct.c | 736 -- src/SFML/Graphics/libjpeg/jdcolor.c | 396 - src/SFML/Graphics/libjpeg/jdct.h | 176 - src/SFML/Graphics/libjpeg/jddctmgr.c | 269 - src/SFML/Graphics/libjpeg/jdhuff.c | 651 -- src/SFML/Graphics/libjpeg/jdhuff.h | 201 - src/SFML/Graphics/libjpeg/jdinput.c | 381 - src/SFML/Graphics/libjpeg/jdmainct.c | 512 - src/SFML/Graphics/libjpeg/jdmarker.c | 1360 --- src/SFML/Graphics/libjpeg/jdmaster.c | 557 - src/SFML/Graphics/libjpeg/jdmerge.c | 400 - src/SFML/Graphics/libjpeg/jdphuff.c | 668 -- src/SFML/Graphics/libjpeg/jdpostct.c | 290 - src/SFML/Graphics/libjpeg/jdsample.c | 478 - src/SFML/Graphics/libjpeg/jdtrans.c | 143 - src/SFML/Graphics/libjpeg/jerror.c | 252 - src/SFML/Graphics/libjpeg/jfdctflt.c | 168 - src/SFML/Graphics/libjpeg/jfdctfst.c | 224 - src/SFML/Graphics/libjpeg/jfdctint.c | 283 - src/SFML/Graphics/libjpeg/jidctflt.c | 242 - src/SFML/Graphics/libjpeg/jidctfst.c | 368 - src/SFML/Graphics/libjpeg/jidctint.c | 389 - src/SFML/Graphics/libjpeg/jidctred.c | 398 - src/SFML/Graphics/libjpeg/jinclude.h | 91 - src/SFML/Graphics/libjpeg/jmemmgr.c | 1118 -- src/SFML/Graphics/libjpeg/jmemnobs.c | 109 - src/SFML/Graphics/libjpeg/jmemsys.h | 198 - src/SFML/Graphics/libjpeg/jpegint.h | 392 - src/SFML/Graphics/libjpeg/jquant1.c | 856 -- src/SFML/Graphics/libjpeg/jquant2.c | 1310 --- src/SFML/Graphics/libjpeg/jutils.c | 179 - src/SFML/Graphics/libjpeg/jversion.h | 14 - src/SFML/Graphics/libpng/png.c | 828 -- src/SFML/Graphics/libpng/pngerror.c | 295 - src/SFML/Graphics/libpng/pnggccrd.c | 5408 --------- src/SFML/Graphics/libpng/pngget.c | 934 -- src/SFML/Graphics/libpng/pngmem.c | 595 - src/SFML/Graphics/libpng/pngpread.c | 1573 --- src/SFML/Graphics/libpng/pngread.c | 1456 --- src/SFML/Graphics/libpng/pngrio.c | 161 - src/SFML/Graphics/libpng/pngrtran.c | 4177 ------- src/SFML/Graphics/libpng/pngrutil.c | 3124 ------ src/SFML/Graphics/libpng/pngset.c | 1219 --- src/SFML/Graphics/libpng/pngtrans.c | 650 -- src/SFML/Graphics/libpng/pngvcrd.c | 3903 ------- src/SFML/Graphics/libpng/pngwio.c | 228 - src/SFML/Graphics/libpng/pngwrite.c | 1464 --- src/SFML/Graphics/libpng/pngwtran.c | 563 - src/SFML/Graphics/libpng/pngwutil.c | 2730 ----- src/SFML/Graphics/zlib/adler32.c | 149 - src/SFML/Graphics/zlib/compress.c | 79 - src/SFML/Graphics/zlib/crc32.c | 423 - src/SFML/Graphics/zlib/crc32.h | 441 - src/SFML/Graphics/zlib/deflate.c | 1736 --- src/SFML/Graphics/zlib/deflate.h | 331 - src/SFML/Graphics/zlib/inffast.c | 318 - src/SFML/Graphics/zlib/inffast.h | 11 - src/SFML/Graphics/zlib/inffixed.h | 94 - src/SFML/Graphics/zlib/inflate.c | 1368 --- src/SFML/Graphics/zlib/inflate.h | 115 - src/SFML/Graphics/zlib/inftrees.c | 329 - src/SFML/Graphics/zlib/inftrees.h | 55 - src/SFML/Graphics/zlib/trees.c | 1219 --- src/SFML/Graphics/zlib/trees.h | 128 - src/SFML/Graphics/zlib/uncompr.c | 61 - src/SFML/Graphics/zlib/zutil.c | 318 - src/SFML/Graphics/zlib/zutil.h | 269 - 125 files changed, 41 insertions(+), 80263 deletions(-) rename {src/SFML/Graphics/GLEW => extlibs/headers/GL}/glew.h (100%) rename {src/SFML/Graphics/GLEW => extlibs/headers/GL}/glxew.h (100%) rename {src/SFML/Graphics/GLEW => extlibs/headers/GL}/wglew.h (100%) rename {src/SFML/Graphics => extlibs/headers}/SOIL/SOIL.h (100%) rename {src/SFML/Graphics/libjpeg => extlibs/headers/jpeg}/jconfig.h (100%) rename {src/SFML/Graphics/libjpeg => extlibs/headers/jpeg}/jerror.h (100%) rename {src/SFML/Graphics/libjpeg => extlibs/headers/jpeg}/jmorecfg.h (100%) rename {src/SFML/Graphics/libjpeg => extlibs/headers/jpeg}/jpeglib.h (100%) rename {src/SFML/Graphics/libpng => extlibs/headers/png}/png.h (100%) rename {src/SFML/Graphics/libpng => extlibs/headers/png}/pngconf.h (100%) rename {src/SFML/Graphics => extlibs/headers}/zlib/zconf.h (100%) rename {src/SFML/Graphics => extlibs/headers}/zlib/zlib.h (100%) create mode 100644 extlibs/libs-mingw/libglew.a create mode 100644 extlibs/libs-mingw/libjpeg.a create mode 100644 extlibs/libs-mingw/libpng.a create mode 100644 extlibs/libs-mingw/libsoil.a create mode 100644 extlibs/libs-vc2005/glew.lib create mode 100644 extlibs/libs-vc2005/jpeg.lib create mode 100644 extlibs/libs-vc2005/png.lib create mode 100644 extlibs/libs-vc2005/soil.lib delete mode 100644 src/SFML/Graphics/GLEW/glew.c delete mode 100644 src/SFML/Graphics/SOIL/SOIL.c delete mode 100644 src/SFML/Graphics/SOIL/image_DXT.c delete mode 100644 src/SFML/Graphics/SOIL/image_DXT.h delete mode 100644 src/SFML/Graphics/SOIL/stb_image_aug.c delete mode 100644 src/SFML/Graphics/SOIL/stb_image_aug.h delete mode 100644 src/SFML/Graphics/SOIL/stbi_DDS_aug.h delete mode 100644 src/SFML/Graphics/SOIL/stbi_DDS_aug_c.h delete mode 100644 src/SFML/Graphics/libjpeg/cderror.h delete mode 100644 src/SFML/Graphics/libjpeg/jcapimin.c delete mode 100644 src/SFML/Graphics/libjpeg/jcapistd.c delete mode 100644 src/SFML/Graphics/libjpeg/jccoefct.c delete mode 100644 src/SFML/Graphics/libjpeg/jccolor.c delete mode 100644 src/SFML/Graphics/libjpeg/jcdctmgr.c delete mode 100644 src/SFML/Graphics/libjpeg/jchuff.c delete mode 100644 src/SFML/Graphics/libjpeg/jchuff.h delete mode 100644 src/SFML/Graphics/libjpeg/jcinit.c delete mode 100644 src/SFML/Graphics/libjpeg/jcmainct.c delete mode 100644 src/SFML/Graphics/libjpeg/jcmarker.c delete mode 100644 src/SFML/Graphics/libjpeg/jcmaster.c delete mode 100644 src/SFML/Graphics/libjpeg/jcomapi.c delete mode 100644 src/SFML/Graphics/libjpeg/jcparam.c delete mode 100644 src/SFML/Graphics/libjpeg/jcphuff.c delete mode 100644 src/SFML/Graphics/libjpeg/jcprepct.c delete mode 100644 src/SFML/Graphics/libjpeg/jcsample.c delete mode 100644 src/SFML/Graphics/libjpeg/jctrans.c delete mode 100644 src/SFML/Graphics/libjpeg/jdapimin.c delete mode 100644 src/SFML/Graphics/libjpeg/jdapistd.c delete mode 100644 src/SFML/Graphics/libjpeg/jdatadst.c delete mode 100644 src/SFML/Graphics/libjpeg/jdatasrc.c delete mode 100644 src/SFML/Graphics/libjpeg/jdcoefct.c delete mode 100644 src/SFML/Graphics/libjpeg/jdcolor.c delete mode 100644 src/SFML/Graphics/libjpeg/jdct.h delete mode 100644 src/SFML/Graphics/libjpeg/jddctmgr.c delete mode 100644 src/SFML/Graphics/libjpeg/jdhuff.c delete mode 100644 src/SFML/Graphics/libjpeg/jdhuff.h delete mode 100644 src/SFML/Graphics/libjpeg/jdinput.c delete mode 100644 src/SFML/Graphics/libjpeg/jdmainct.c delete mode 100644 src/SFML/Graphics/libjpeg/jdmarker.c delete mode 100644 src/SFML/Graphics/libjpeg/jdmaster.c delete mode 100644 src/SFML/Graphics/libjpeg/jdmerge.c delete mode 100644 src/SFML/Graphics/libjpeg/jdphuff.c delete mode 100644 src/SFML/Graphics/libjpeg/jdpostct.c delete mode 100644 src/SFML/Graphics/libjpeg/jdsample.c delete mode 100644 src/SFML/Graphics/libjpeg/jdtrans.c delete mode 100644 src/SFML/Graphics/libjpeg/jerror.c delete mode 100644 src/SFML/Graphics/libjpeg/jfdctflt.c delete mode 100644 src/SFML/Graphics/libjpeg/jfdctfst.c delete mode 100644 src/SFML/Graphics/libjpeg/jfdctint.c delete mode 100644 src/SFML/Graphics/libjpeg/jidctflt.c delete mode 100644 src/SFML/Graphics/libjpeg/jidctfst.c delete mode 100644 src/SFML/Graphics/libjpeg/jidctint.c delete mode 100644 src/SFML/Graphics/libjpeg/jidctred.c delete mode 100644 src/SFML/Graphics/libjpeg/jinclude.h delete mode 100644 src/SFML/Graphics/libjpeg/jmemmgr.c delete mode 100644 src/SFML/Graphics/libjpeg/jmemnobs.c delete mode 100644 src/SFML/Graphics/libjpeg/jmemsys.h delete mode 100644 src/SFML/Graphics/libjpeg/jpegint.h delete mode 100644 src/SFML/Graphics/libjpeg/jquant1.c delete mode 100644 src/SFML/Graphics/libjpeg/jquant2.c delete mode 100644 src/SFML/Graphics/libjpeg/jutils.c delete mode 100644 src/SFML/Graphics/libjpeg/jversion.h delete mode 100644 src/SFML/Graphics/libpng/png.c delete mode 100644 src/SFML/Graphics/libpng/pngerror.c delete mode 100644 src/SFML/Graphics/libpng/pnggccrd.c delete mode 100644 src/SFML/Graphics/libpng/pngget.c delete mode 100644 src/SFML/Graphics/libpng/pngmem.c delete mode 100644 src/SFML/Graphics/libpng/pngpread.c delete mode 100644 src/SFML/Graphics/libpng/pngread.c delete mode 100644 src/SFML/Graphics/libpng/pngrio.c delete mode 100644 src/SFML/Graphics/libpng/pngrtran.c delete mode 100644 src/SFML/Graphics/libpng/pngrutil.c delete mode 100644 src/SFML/Graphics/libpng/pngset.c delete mode 100644 src/SFML/Graphics/libpng/pngtrans.c delete mode 100644 src/SFML/Graphics/libpng/pngvcrd.c delete mode 100644 src/SFML/Graphics/libpng/pngwio.c delete mode 100644 src/SFML/Graphics/libpng/pngwrite.c delete mode 100644 src/SFML/Graphics/libpng/pngwtran.c delete mode 100644 src/SFML/Graphics/libpng/pngwutil.c delete mode 100644 src/SFML/Graphics/zlib/adler32.c delete mode 100644 src/SFML/Graphics/zlib/compress.c delete mode 100644 src/SFML/Graphics/zlib/crc32.c delete mode 100644 src/SFML/Graphics/zlib/crc32.h delete mode 100644 src/SFML/Graphics/zlib/deflate.c delete mode 100644 src/SFML/Graphics/zlib/deflate.h delete mode 100644 src/SFML/Graphics/zlib/inffast.c delete mode 100644 src/SFML/Graphics/zlib/inffast.h delete mode 100644 src/SFML/Graphics/zlib/inffixed.h delete mode 100644 src/SFML/Graphics/zlib/inflate.c delete mode 100644 src/SFML/Graphics/zlib/inflate.h delete mode 100644 src/SFML/Graphics/zlib/inftrees.c delete mode 100644 src/SFML/Graphics/zlib/inftrees.h delete mode 100644 src/SFML/Graphics/zlib/trees.c delete mode 100644 src/SFML/Graphics/zlib/trees.h delete mode 100644 src/SFML/Graphics/zlib/uncompr.c delete mode 100644 src/SFML/Graphics/zlib/zutil.c delete mode 100644 src/SFML/Graphics/zlib/zutil.h diff --git a/build/codeblocks/batch-build/build.bat b/build/codeblocks/batch-build/build.bat index b84ad7dc..fbbeaff7 100644 --- a/build/codeblocks/batch-build/build.bat +++ b/build/codeblocks/batch-build/build.bat @@ -61,6 +61,10 @@ del *.o /f /q REM Add external libraries to sfml-graphics echo Adding external libraries to libsfml-graphics-s... ar x %SFML%\extlibs\libs-mingw\libfreetype.a +ar x %SFML%\extlibs\libs-mingw\libglew.a +ar x %SFML%\extlibs\libs-mingw\libjpeg.a +ar x %SFML%\extlibs\libs-mingw\libpng.a +ar x %SFML%\extlibs\libs-mingw\libsoil.a ar rs libsfml-graphics-s.a *.o ar rs libsfml-graphics-s-d.a *.o del *.o /f /q diff --git a/build/codeblocks/sfml-graphics.cbp b/build/codeblocks/sfml-graphics.cbp index 703b5c33..ffdaee78 100644 --- a/build/codeblocks/sfml-graphics.cbp +++ b/build/codeblocks/sfml-graphics.cbp @@ -31,6 +31,10 @@ + + + + @@ -61,6 +65,10 @@ + + + + @@ -114,8 +122,10 @@ - + + + @@ -143,17 +153,10 @@ - - - - - - @@ -163,20 +166,6 @@ - - - - - - - - - - - @@ -184,249 +173,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/vc2005/sfml-graphics.vcproj b/build/vc2005/sfml-graphics.vcproj index 90d6cb16..e66a71d3 100644 --- a/build/vc2005/sfml-graphics.vcproj +++ b/build/vc2005/sfml-graphics.vcproj @@ -49,7 +49,7 @@ @@ -313,7 +313,7 @@ EnableIntrinsicFunctions="true" FavorSizeOrSpeed="1" WholeProgramOptimization="false" - AdditionalIncludeDirectories=""$(SolutionDir)..\..\include";"$(SolutionDir)..\..\src";"$(SolutionDir)..\..\extlibs\headers"" + AdditionalIncludeDirectories=""$(SolutionDir)..\..\include";"$(SolutionDir)..\..\src";"$(SolutionDir)..\..\extlibs\headers";"$(SolutionDir)..\..\extlibs\headers\jpeg";"$(SolutionDir)..\..\extlibs\headers\png"" PreprocessorDefinitions="NDEBUG;WIN32;_LIB;SFML_EXPORTS;GLEW_STATIC;STBI_FAILURE_USERMSG" StringPooling="true" MinimalRebuild="false" @@ -338,7 +338,7 @@ /> @@ -362,2930 +362,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/vc2008/sfml-graphics.vcproj b/build/vc2008/sfml-graphics.vcproj index 6ee2f135..970f83bf 100644 --- a/build/vc2008/sfml-graphics.vcproj +++ b/build/vc2008/sfml-graphics.vcproj @@ -51,7 +51,7 @@ Name="VCCLCompilerTool" AdditionalOptions="/MP" Optimization="0" - AdditionalIncludeDirectories=""$(SolutionDir)..\..\src";"$(SolutionDir)..\..\include";"$(SolutionDir)..\..\extlibs\headers"" + AdditionalIncludeDirectories=""$(SolutionDir)..\..\src";"$(SolutionDir)..\..\include";"$(SolutionDir)..\..\extlibs\headers";"$(SolutionDir)..\..\extlibs\headers\jpeg";"$(SolutionDir)..\..\extlibs\headers\png"" PreprocessorDefinitions="WIN32;_DEBUG;_LIB;SFML_EXPORTS;SFML_DYNAMIC;GLEW_STATIC" MinimalRebuild="false" BasicRuntimeChecks="3" @@ -72,7 +72,7 @@ /> @@ -313,7 +313,7 @@ EnableIntrinsicFunctions="true" FavorSizeOrSpeed="1" WholeProgramOptimization="false" - AdditionalIncludeDirectories=""$(SolutionDir)..\..\src";"$(SolutionDir)..\..\include";"$(SolutionDir)..\..\extlibs\headers"" + AdditionalIncludeDirectories=""$(SolutionDir)..\..\src";"$(SolutionDir)..\..\include";"$(SolutionDir)..\..\extlibs\headers";"$(SolutionDir)..\..\extlibs\headers\jpeg";"$(SolutionDir)..\..\extlibs\headers\png"" PreprocessorDefinitions="NDEBUG;WIN32;_LIB;SFML_EXPORTS;GLEW_STATIC;STBI_FAILURE_USERMSG" StringPooling="true" RuntimeLibrary="2" @@ -337,7 +337,7 @@ /> @@ -361,2930 +361,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/SFML/Graphics/GLEW/glew.h b/extlibs/headers/GL/glew.h similarity index 100% rename from src/SFML/Graphics/GLEW/glew.h rename to extlibs/headers/GL/glew.h diff --git a/src/SFML/Graphics/GLEW/glxew.h b/extlibs/headers/GL/glxew.h similarity index 100% rename from src/SFML/Graphics/GLEW/glxew.h rename to extlibs/headers/GL/glxew.h diff --git a/src/SFML/Graphics/GLEW/wglew.h b/extlibs/headers/GL/wglew.h similarity index 100% rename from src/SFML/Graphics/GLEW/wglew.h rename to extlibs/headers/GL/wglew.h diff --git a/src/SFML/Graphics/SOIL/SOIL.h b/extlibs/headers/SOIL/SOIL.h similarity index 100% rename from src/SFML/Graphics/SOIL/SOIL.h rename to extlibs/headers/SOIL/SOIL.h diff --git a/src/SFML/Graphics/libjpeg/jconfig.h b/extlibs/headers/jpeg/jconfig.h similarity index 100% rename from src/SFML/Graphics/libjpeg/jconfig.h rename to extlibs/headers/jpeg/jconfig.h diff --git a/src/SFML/Graphics/libjpeg/jerror.h b/extlibs/headers/jpeg/jerror.h similarity index 100% rename from src/SFML/Graphics/libjpeg/jerror.h rename to extlibs/headers/jpeg/jerror.h diff --git a/src/SFML/Graphics/libjpeg/jmorecfg.h b/extlibs/headers/jpeg/jmorecfg.h similarity index 100% rename from src/SFML/Graphics/libjpeg/jmorecfg.h rename to extlibs/headers/jpeg/jmorecfg.h diff --git a/src/SFML/Graphics/libjpeg/jpeglib.h b/extlibs/headers/jpeg/jpeglib.h similarity index 100% rename from src/SFML/Graphics/libjpeg/jpeglib.h rename to extlibs/headers/jpeg/jpeglib.h diff --git a/src/SFML/Graphics/libpng/png.h b/extlibs/headers/png/png.h similarity index 100% rename from src/SFML/Graphics/libpng/png.h rename to extlibs/headers/png/png.h diff --git a/src/SFML/Graphics/libpng/pngconf.h b/extlibs/headers/png/pngconf.h similarity index 100% rename from src/SFML/Graphics/libpng/pngconf.h rename to extlibs/headers/png/pngconf.h diff --git a/src/SFML/Graphics/zlib/zconf.h b/extlibs/headers/zlib/zconf.h similarity index 100% rename from src/SFML/Graphics/zlib/zconf.h rename to extlibs/headers/zlib/zconf.h diff --git a/src/SFML/Graphics/zlib/zlib.h b/extlibs/headers/zlib/zlib.h similarity index 100% rename from src/SFML/Graphics/zlib/zlib.h rename to extlibs/headers/zlib/zlib.h diff --git a/extlibs/libs-mingw/libglew.a b/extlibs/libs-mingw/libglew.a new file mode 100644 index 0000000000000000000000000000000000000000..7df32921b023493af535cb925bdae51091afc509 GIT binary patch literal 294338 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 XK{#;z2g)=|@vt8j;72WT1n~a=PGxR6 literal 0 HcmV?d00001 diff --git a/extlibs/libs-mingw/libjpeg.a b/extlibs/libs-mingw/libjpeg.a new file mode 100644 index 0000000000000000000000000000000000000000..6718796b93d5e6f5da40f1dc30fec479d39f809f GIT binary patch literal 195202 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 literal 0 HcmV?d00001 diff --git a/extlibs/libs-mingw/libpng.a b/extlibs/libs-mingw/libpng.a new file mode 100644 index 0000000000000000000000000000000000000000..8d594f5ed88dea3dcd82abcb2071fc729df1c19d GIT binary patch literal 243584 zcmeFa3w%`7wLgB63}J|YiJEGpsG|mjiZlUKf~X+Q5Jd)0 zB6D(#O+_tQZ?E2qE$!_?YfC}22IQB3r8Xk9sHnk4Welw-mWNvM|E{&qbIycT?`?m- z|GjrUnatYXz4qE`@4fc(?7h!c4$q~X5T-X%%@9lrhyN&2GSK!YUxBfmd_ZT)AygV#xt z{{8UBlJtN1n^5|w^#8=SZ-$icfBXCCLMh?D;F~z=-z3L(%+IC7f7W+iv6L9^d*fwN z;{QwE9fzbu`u_G_^ZW8XDN+A^`iPYH1;0sOdsRxh^b34zuac7Jdq?K*-zRUBlAf-P z_bqLxt17MX2TN<}OB;fX61!{aY6uVx@+_}!SkYKhRUI^;K+Q4=y4HKu$sl!Yf9D6 zo~^H7QMqSmRqbCr?m8pDr&rw@A|}xbT`q!nf6kt)UD? z)f6n#&4k@Gbz0G|YelU03cG)8S<`JoEVEZMHI$kVm8QS3vA(giQZp|ydVv^qhl@Pe zSks_+2;#LRXt5utVcPTpgN?EV;Bsx|FTll4Xrm%cyy-YAjnpH8~iv_=TEaETUQ%wT)z1&1_kyvJzZP zHLaFRFKeo`b|(}@hs?@NsNU~5QB)7E9i_o)SafxLz*0sOO0S9W{8?|VglJ1zO!Ht| z)I+<6*)p@y`k}q0y{U!UNIx9J!<~wd45Ykag%uH9jK8uh6wpdX??goZQ94Bn$$cGK z0SjlXrT^1<7<(YQC?UwkC?K2|kk7&TMt`X&QVVZ& z*>cg(#bW+CtyDNXv!PrB7Zq6GinAx(LIzJV)En*&b z*ajUOJzB~@Jl&by(q~cXwZV(o&#{CiN~bmTtePggt_I=ks!$$QVx-WdHTKNOVPc|V zEG9C>jIjX+MdEpwX2zlcG+wZbS1h1D`l3*S^E@?#o5LXn41?faUx?)HPw2xuM(WrV$5(5C*gMn!C9TFM0%0s>k!T$vYX0b4 zwMwSd4aV&?$>|d#)8fR)Teysz(pw0v_KLKcIm+>wP6~$DF-Xb2%oHS$vOq(%HX0?i zsus+Pkd%yCNx_XstHsuYZImpXoE!F8ERXy8o@$#}h-9y0Tg=zbpLuNJWfdw7`g$gqkjE8?LEgZ|$}2 z!q(?#nAy@h`V<{7Mr9gc&c`&s91CiIIdIg27?U&&Fz0?6FxQw!YJfRx)H#glrv{iq zT@5ft#~NS`SvA0%Kx%+Fyw(77bgTo$fK>y`i6oh#83nn_tRa^f8~YjKZgSbiv!z%v z;F=`L6my(fbO8R^h9KrPm_OOzS}dYeV(N}*g4WZJJT7<3fLCwc$q$W^ISnL0AIw_9 z)0os4s#RCVlY}FF^04Swsui^T-Hubgy$78 zO9y8`YwPRGK2>yuLRYkdrdDv+)g)gYTUZqUXiIoZuWokV+*s30&+OZ6WA(C%3Tq-N z0~kP?IoRA-gTaViTlB$@g-M45qd6jqb?a+|m5uealpL(Hl?Ju7M#>_KNOD@MP{6<3 zA23z2dePkNB;JSz!^QAGOLe_v&}LPsxu&k7zPS_= zTuU9%I=*UusIjIgSX1us63Npt&AMEv56E@J%@MgkEcqq?qjNQ!T4cg)8IaqGBv^wv zgf^rToW@{Z3rGv3%lsHK`Yme~rk_ZGHs}_xR?PO1y4A~?YU?Opmue34O~e|;7`AJ5 zM)*;Ev5il)D4kjLKvk;qe61Hk4w-I+ik7^ud%N(r9|DDbyxf z`V?6Vgl_Y%Xs&P6>`zOazWyzoVyF~Tf&z@Kq5|c3tPwM812RI zm|d3eH%A1*ZFU}-zcDHhZnIkx?%0maM6I!!qbK2S&eet6>}-VF?6id2oQDgy7*U#I zT^*&hTz`cVN1r8H0Gm?AfK3E9`$pk5heyI~4yAN;`)TWU}@)|)cDJ`=| zMw6N+<{x^S1y-Gu_`wwo+_hN^ND{?ArXV!=^pIweKUm1mrzBe9BBZzxjfmk|9HLk? zFCR^LG&&y-zYGVY6x8s1rmWFK4e#Qz#zpfKc8KqKkQ&^HQ25UBi?s zVKNUQ*}?y&pCU=W0F~+y*d_S!N?A)MbGs+7;r{1JS>2PDH8lJ86K6fyRM zbBJ2~ST6kx4GoF-Hh}`kamfeWvd6Eu`F_t4lsGLJg%Vy~=Bczwh~u@380ot<#GR2UF*T-p%g5@upi!5tnCU zu1k=WUFwq5_BTR58GNU6xrj$Tn5Ozt)uJ@{xO@2xo81sA9~;@cs53o5{?xsEBqI~I z_V^AdJ-&~Mdwd^X)8jilr^oln=pNr+QhIzx#`gG*rl=uzLQm(NBM#;4Bt^PC_ivlf z=lONFygiL|Xx|yykgdD)xRJ(5>Pk0sQh$|3Nj&0d`wuAK*_fZa`AQJkyDN`=B)@aD zvN&^G$NUkVjV~*GTl-xJeVwjtm0J(EyAO=$bmexs!dv?jCv5d>+^H>r(u!WHR6*&5}ll`7?UNt(JO9mRW5 zdw1{x`O}18hWu$_@Z4TsY9_^2f*Zk&Fe&+QMN+P@~gOl{H^NIxe^rvbp&-9!AlgR?bFTvMoI4JBmqRtvJ+PPEsR1wRyL78k2kNkoQd zW{GHiL{YDORz!1&>PzpO7T)?^qFOK|Mkuj3q{;8NN&oRideLVQa6nI9E@G-v*B%q{ zm#Fhy?K|(9k$ps2IiS2<+0{Ajm++BP*I2e#-+*qe>USteuWKxM&(3Lft=gk}rXrA~ z40>hap^r%2>T>tcs-Yo~u4nWdfBU(ip`*Lc+or6g^41$0*axvcKQv@5mbRJ`0OZHO zXwOk>ShOL%%mYyBmC27js{ADWqX{YvZ{bu0bDinTh)w4j3e@Y$APKWQ8^1##b3R`6 zl1QzkuzOiNv614Rk)D(ws4tADZOdN?+YZdG`;Hi-mw5m}ck-hTiTqF(8ND5n(7)v` zunLmP-5>VmFCcCab95}&kdJCUwK|4T_U6L|kkRGtqm{k+=?3?ozzvyq+IjEPc%Ro~ zZq#I!q{S^Wc}q71@U(@&ch`m4M-aaf%uGcK_x;s%Vdc5c>4WEDV&0gEISV zWHz@LTp2xWPeS47t@ww0Z^~*va@Pg+wB?%dW^%kuS*zYbBV>y)e>z8(pG7}fdMdyz z+FI^=c!+@9N=2VKM7cJ!%9Q-#r_gE*kC3{97piNhN3uo02*<%(MCtw1+tz;So77KX z0I2mn_P$LI!980#IyOsN&HZmtD*EzL>e!JH!Rs8_22sZ7U&oQQYsGjjG((qq^ze^V zxj-oHR^Mb`>xRj9kAF=X~`gX|*7DPFPJ&WrUK+Vtejo;+ppbnhkJ0)M%mwm5pH zPV!F4%9@sf=>biwcuS>sLit2*c23UpOUTPR2NRn*??S8_L&zn?{_4i2`ntFQF1rMw zF89u=tH9HOCT~GapvvDEm-ABMyv#c%w8HCatSR>{!d|5SwkA#T&cV~Y2Jf^fle}~5 z$|t8ttTCnK?@fw#LN!mSC#Fc_E4<^Iy!1b7O2rK0pZDS{d`M=A*qQ02$yTGcfu_o| z^~+mR=cTQrG(i!2FDFY0ZczF|? z7fXHK;%nx3jcr$x&E!z@{87L$I%RAMuio=I2`{$riVCkt@IwTC7R75fyvo5F8hJf~ z*L!#oh?hHfd5BkE_(2n|)9}I*uQu_DhZZjnFhFZYD4|p15B2HvC4c&oKYew7kc`u> zHLM;kUf3{r36J1=KE6M~w*=oI?MqWlqNi%Vx*wdwe&&_cNwfXSq@uD$X;wocepg8I zLUs5Cq*#7z!q@;w)U{$o1WqzzHT1YH-Oh28nu4W-2@p&vOS)9)a zX~gRI9ESXd@Fku^v5<|PVS|BCfFvmLqzxGjaoT*V+*AP=Rpz=%H@5@sLlI z1G&S2+~+{nJCL8+kQdocjDk(^JG+~{#>98*98D}2t! z_n+}3iN;OOB5vykPp0%INhPUDaUoVnl;T{qBwZ;k(4Ow_Q>H@k)CV-?*d9D=x}Z3) z`kkSn!$V4OK=|M`s0S)EFEUo^gSv?GkiUN}u|T0xYVEWvkT8q1`esPN}}PG1h1!!I;g%6_N7+3xQu60;OETQ=vfCXg`7qov67B(ZkBXEW3b(l7 z{v*3nA|)S%TSmc6U3W+EDUp(o!!0Rr?`L;vq~vh8L#&cOt_Vjb}l`VQ#XKsgXU8#a$2DfDk}(`IBG5A3ADA8)2X zz%%r3@UhL*^FBlW1|QgrIiB5_Fl zzK54QPZpwqr{!f{Zu|ijQswP;@`FCq zi^$?DADV+lPQM^Q5(Eyu+Qk?bWTi%*f|3AT@(>ODrRXLyP3>th%4PwT4W2gU2Y$#+ z)S2O{(L~(^R=C}gr@fpKN-ONS(0Y_|Cu=g)2e#nX;o{m$lk3Ovwbovw$3+q9k0BwW zV@^WEweiL3r^_wOx9dkxR ze7nM{sEVJ>?&OH?x8YS(%g$cXQy@G7e4?d*0(e7_5?qPi~Jqawb(@G7eA!krTF zy&PUeHD0(+iTHMhS5c)G?$n6ymGCO6_rg6o;@cBmMO9z8$3%R;53i!yFWjDp@73@s zY5>T+iB_wqg6r8-2zP8YMfZsE=<)5%>hZlMb*|hS?E)mSr3hj~h6swXLQs?mf}-RL ziV`j;O0u9Rv4Wyx3W^d~%91H*^O>SV35=3MST?c(NqKOaylo8ILh$N&O38Ll+iCFZ zoRiR5v{zoa-M!qsA<5JB1d^8Bt%kODEFPHf7E^Fk-Ky{4V+&9%*zX z{2}^F`pxdn-rYIxgnS%r;Xb4lOubTP`k8pJhQ@G*-WYy8UUoeJ0h`FKXkv@Da1)f# z+P@!fGTXn$c)JI;x`PjFvb2Sr-yD(ia`P#jCHr#vJon5+-GI_t|D32C!lnbo*X?N| zgGW*puSrnSSLfy&YWzeEb?1bT@JZm#?oK$`nVzjI=~jxKRg1POuT*x4G$-YDrYGmT zyy_!$Nw-?`Z1e@Q=UVg|`C5g{%ECE}e0O2qpOQ0dHfJt~mkTLMb( zRf7_IYtSAD-+Ms`-|v7DzK^4N3E!U>)PO;KWKa`O)db(A232iPA%prcD4~7aHE}V^ zD~H;~2g&6Ruc#u=<9$e?eFc0XkO}y5C=N0k{|ju$BDe~X|0Yi*5E}APobbTsc6;h7EB@ZKfGN|bd&P&=0z|3ai_}pMg7sL(u2P0${{2JN0^&Ur5-Bt6-)UVj zioy9`WnEN)H6{;hSEOQ+Ea41LUXmVR`wG>wS2&QgH7LF+7cQYVZL8UyJc zlDC%U928F*zQ<@-VEO3lEWAsXmQb)5atbyNUXbVJ-5A;3yxWksR=UX#JR{ZIR9b_v z_|cZy&`1I>zW~c$)bKIH5-+USIT#aGm+Oj=TVll7k(&|Y$J=;WpN`zKV*IS(z8d3a z4L2^v&l+xQj30+fL*i1gE+ef-4!5)<1obqlxefa66(g^P=M5UX$ahWdZpdwAxvf^Y zc@08?;8f`Hb=GB~THJubIbSUdX1}2n9a5Hj@^$N`%0h=l z6Z)ObyrUsk3c+q5&|x>hID8OhGiw8rYrHW*Vr38H*n%bkD(BPbdSqkOFVUXB9kR4B*cQ&_tJ%OPw}=CK_$MI*^@6k;tDD;^VFDB)LtQcs+l!I# z0>qUIQ%(!cKwOt0nNyJX$?B8aDb6Ws*ADtURqfhEzo&aPcJ+b47Fs236Sj&Y-7KGe zcn6*}9bBb2ry_eObc!0@i(j+twCnE96}qdrcS7}C<}~uh)SbdH*;Eml`fz)z97=`kp(V5{7E`b9=Is!IK>QK}Y6W@zn8=lx%9(2T zNg_)oP$|KHV(o`(D>n|ap-~<*$_>u+Y>e#VP-)1^NI#M51{g?JQj{BAYS#gBMGn$` zUxt#V6uLG^xsXmf)A0|sgL;L$q+XE@6p$%!UeZ?ZY1~XtMtmu1V}p{lDGWJCeTteF zL^iSu4W(z}!WQM!)UYUXs;_a%J`+;Buwi#_EF_cH%QFJ4e1fW7cIFoy+2BG#4 zqW2Sa8yscCJCh0q5f2w{hIleF6H!k;lIKnfP6@Z3l@y!?OIgsFSF9v&LhYd3OYY@C zDdIoP^Q(ntD5uIh(ntZW$C_?$1jng)3y{Yg=16dN=Z(e6IfK7pp226(M}82aucdB1 zi+HGRb>mk{7dN;mX`@MxdWtdz8}t>AXXE?~C8c9g#=P*S9?zPm;OE)6 z=q&0JP7U92R&sNzT9k=G8wGSMNYvhv2}mWmzlsh4?jo<|KTgzcwAP;csBcm)hbH%Z zAJpnA?iw08w|NY=-TJ6I=$Yhb;gu40UKT?xJq4J-}w0)c%Ml;E3WV3!+M-1Q2YEg7>lM1c?5YW^fh zm}_%;q5+m4T4nL#%RG!z&d;9X5pasAVKu<=h5@*6dBmD}bb9Mb1Rl014QT2Z5}&A+-N& zj}3VW$T+uE&htPP*pS}>*=0lC1@egvp+yw8u>uCOkj?@!&W6kYl4V1RfE3t}av;~+ z5IXMFVnZGVa<2`cXUz6JmoEePg^lL}AUh1ixr&mHT8#$4^7*e?MX{b0rj{Tn;ciPT zCV31RijTe@ZUnLOhmbV5j9qJ%JBw)X4cC7B@71;9=I#Hzx>j63{=Zk({&%{%HqQ1s ztjyv9q`!Y= zUzx>N9y{Rph#75y>!K58v=6R}1`Eb4LJiXyG;L<^O`5nCrFY;AIG;AdQ8Vp~HO(P0 zEhtJ?dJnIsD+CzFS$dva(qb#mm=vFOxE?brjc4`22t~}=V0uE!QkVs#DMhq*%GKF^ zFPG3&o+@x>{4fE-sIN}HIN9tNiHKLqM zkzp&#&~EIv*>@zrE-myb?Qo$CvmZGh{58UA+y`1{aQ|EF?BnW#VM<8}pIQGjF*IX~ z7lR)}Q$+b&(np6nJ0Ilqq-PHGDcj)XrsMax4FX5^R&S@^bPB(+YhLhFI>Ki{h;vH- z-h)qe=^Jh+e5iY{2WiCFdXi=44r9>6y>qZ1G~WpzA4?2f#41@OST)ct0YF@Z!O`Lf zA>Rs6*(KucrBy*LQ^?(5&@c+bo=#<~M#y+DElb%sv>$S~%u38MM;O{L<`o;paQ}hw z@#+`(&Vxk($T-s|j~SNo2#!|h{sXTzYv;oG(=dhed)SC5$piafID=cex~>fc@jTjF z)f zhz+56&2}5o4%Y!2@@=?^p_z!ibn)cuY#_TdL^Luq=kB-hOaVgYJt&mmc?QUIAbHG5 zci_==d-|PtH0UI^@w^uf;^8aGL=YhV|GGL|JXxll<#^9Rne%CKcKn^?*_U3PEgpHA z{p#2(Nvh^-bnYydE)xA}V4}$9@8Rd4(XY~a(k~GAI@-gA5AA<4`_x+q7OgWu;yRgBH8KF5K)KbTRK8zE?^n?-Qy~3rCDF$7sDPs9Q31)rnxE1| zk@ou1mZA!Z8*k9gTl#`DM4F*Rs;2U038g4ayBkN-pH~xS^3K$>&Zqe?j zvDm^(K~+f8Iw5jq4@Gk@PSBDSdLdTnpIiDe)@JarSR^_H0z^J@-npo>umaDfgQt{N zlLjS+u-yH1m5mC?9$)D<-_YIc9E4$>>|5MU|SP6O)=|*>XSca z)>LMFMOk@B=O+tI=px_2?-lseUF>tq(Fp8C=mh zJHeVKiaY>eJ-9$dWlE6`z^y#JkN@}MzbJLA=AgWJ!Tu!iQSCS4^U-MJ%f{!j#iy-$ zWAykm7Oi@+NqqR@Mo%3?=eEGyE&zj#O6b#7C3;*e(uZ1f+M)hI) zZ~M7qezROT+px1X&y};)bI)iX*i(A|duj)GXKjD*Z0xF?xmuZdckUIwfyPggiu#jE z`mYG}d)f|RBPcvq_A5&Ux;n-sM8+lNc8;5#^H%f6>XHGGQ@l}{jAtg|Hwu&W6e-bn zQo|0oT=*UjnOd}5SQCD(ko)kzaa4HA1(b|Xih2J=FEao{diUagE^=91=)w@?wADI0 z)J#YioY&QTAPLt$d4AS|DE5KrNPa^icCvu-Y&@=}KL-L5X*IXAAaUqo7X!*4aG}>x zg|)$hi1zQodsg^(La-)$JSi9qA0H9CLwPBDeB|<^x%8XtSrZ1!>i2MTT~gEOaV3QA zz<(i>0ZnL+BKO0iL#DCo%#ofoH=-PbigNeJtp}2FqYHt^TPV0|dD^cjCkEFGcVctu ztig6cCoKO&d1+9EeNtn&1YshaXfw~O^-ZRBml&UhIHNMm%jxl~c@qd)G~9ziCS=V; zl|xNDr0}o0mW*rS$BOvn3YG9Qg+X=ot82+P(RD0Pda!YO&9@AxY`&J(^yE_6#M$H_ z)uXi>xbKD|l|M~deqLt9+bB+ZmyqtiUyB zzFn{YP6oDi;E5b3Xr8=%0e4b}`)S6G1ZPrqC1O}0vWpu$Tf&HsvWtEbo+f|H@HPtR z=-oW`JOPNRMj7gpst%B=Xm2=2^0e(nucz$j$_-DKLZ7N7dz02uONyLq`xrhrUxt$& zbgWwLPE_)PV3@c~uqcaK(4!XKwe?Z92{Gj67)9a&} zhW@{wf1p01K|i}kN!9Lv+a@1N@T{Q&%)ZaZi)>384XX z3q?I~(1Y!Wu7L5PP94QXR9%*A zUAb3T8JmyFj%XH?J!$SCoH(;248zy2_)-UdWf6?*4W$k~;S>_R2%3;t>sLr=MJ;SQ zdLw-GzGjkGu%J#lZe16*OFHU0O6W`1b!zp=210ZN)fTe8@YSg33?I|#Ial(8Pjj{f zlRAqNES95`^oyd0@xY#k$Z|^hm15IwXw-_U@GO?BWh3f|!)h$K>FcL%AO$k5CdBDy z)5rP?*^~e_AE9;=WlcqXjL#ct>xEbZGV*kvXQMiavZ`o+51xoDp7>(Uw&jV+HnnIU z6zwcX@KO!taS)o2_D3jtUdCu=s`@l{9Y=x_l^qyTt=U7C$6WwbnXMS~a*<8chCkGw zNNXuRHMCFe@nS56>CgZ-Fw-)XlD(Yz_HMM1!GOGSAgOt*{DF(PwEWVp`9j+qL>{ao zMa(3_B_R*`a$annhn9(=5n3oOPuz+*g|5tY_#|+b8ND2tiGDb|g_Ih(JjL203B&4A zb`1VpITRfa&Mw5MAdzf_&g$Nyy-4x^6elRF&CD0x6*BDP>`XZ)BF-;?g zh)e@ej3e&BDx9Q`cD5-pHS4N;5TIvc8WNwTuBCj*1DQ&LCwHez(yjJm8Ci*t#HPv= z%*K}AfSg;1RlMBL0&S=kOs0WVXor={)OyJyIF1UN0qok7lXEKVnoCTS&>&AGRc}bV)+>}lb0vUybKJ!A#9a`WR#f} zUhoaRE)qeB<+GWOAA${oWhLU$MTO3bVY*Xey53|;4n1JmDFOl4gC{ymlzB|>E4AQf znZaG5=VF*LG^S5JF%)ry)|r_`U4x6VaV_T<%$php0Mwjd*%>NqwgmOG-vC|o;GVWC z;rbgQqGypE#uU~#3dCz3@k$Dj7MPJ@MzN7Kv=#T?l#pnV5Ni3N@oztD3Zd3CD)1iH1Aoj6(ON3Egbwi71{ zeTx|yb?+ez{;loA%^!$%Vmi1)I{~KKW0)@2m`=AcEr?+{O=J2qS{_|e+k;?=o{xX= zN)1IZtnF=p6p>?X-NW17$s|`;cn+Y|uw^Y|si}f1)NbV{(>Sg)IHJqY zuh_>%Gc~3Rg9#~VzYKg zt?5~{w!VENKj01G#D=H+N61C&YQQpz($vz~6db&`vP;XX=6V`kRbiN-@^YcJu)vut z791#QYCiPU0E}|SV!D-$smHO+^xTnGZ3L@ZfJn zz8KGMj^x)Q1oKom6_I0J*#0?~jkPw`o4$jA&l?FE{tQ6r^`jeZ@Vx|UVn9lV~FF`?$GV*XF_ zKz$-X(pgL!?OzsoN2`96hbLPk^|WoEfrz$H>S=o(E_*DoOQj-~O^EO0u~-*PJ?&MH z8@*E00ZQB_s3Cem$;VvFNAQ6w6pNVNV*3i_*iX5f6I;x8cX-;GNX?adqBHS}_J&J> z)5@bH*poAd?#9wk^pC_Z{H*D!B)?0L)y6t3Jx63aysne)A2N#%k4nDpY3KC-j<>Ve zbpy%R^Gq%--8RpH>mO&EoD$83v2}>eSTj$xq%WF* z46vs&R4nq=NMrMDNLcKXNnyy?{tS!QfCSK54y`tu4={)NkOyMHMohEy*l9(iFIcI? zQs}xur7G*W=OYN?x$~}p|CF7)uh|J*8q#G?8?G)xBr#Y!*0gbJQT2udPn#RFiSQO$ z0Kru?w8MJ?reCyvj<-(WKP_Qj46z&Bp7w2UD{HB)p{;X?{NTBWX$Y(Ohi|{5f8_Zb zw+_mytP;IIXRGIa-<}yodqOUf${BCS(=*W29~nue8M+w+}dFRVRYR%c_twUT0QyBRzJDF_PLK;^pp&Nw@gNzBqEI`gsr*q18nx1h){Wqse5lX$N# z(W&FiFDG$^F44?K^-a-met@}891G`KN`u~JWSFBh`2cFfl=N@*33-o*xfIs!^?g>U z@}@m#vPLZT^oFTdr4R2>RwINDWp+M>9~vt`JK92B@h+rmbYQClsfVMu{5An;*a4vW)?@6=lxKQ}PiL#c)Uzn(5V2xaRl$gt7T~f7ucjyCc zs(~A&v^QIO%ki?~nsU4%qnz%Uk+dzi4S}+9zn9-VVMF-k6!G4xfo;3|npg4aZ)D2c zx~5QNWlebv-oW9-rbz7Q#aTu#zo*el?=KV)PR7d~g5ENI=LX*cLoeST!dqV7*cfUE z`YZ5e4)3f*`E%z2s?*+zg6AQ)>L@iGdwg;H^B|tWX5qWbgMIrMc)LRjUR4Y3TI^_S z;+LrKdkgI_1T%^kO;{Lx{4z&=DM+ZinmOp5A#_u+P`HT|_Se;is;Z4BbXi3;h_0^6 zOIIv=#e0J}sHA()?aDR}m1)zky z7eM8++1EULGg>Po6uJgU1MA%KBL~OmFMA%mh>O)W>w*P|-uZ67D0fRaWO88dc zPC`K)12vcV&P6SnCsG7zK2sY(3BGPn3mCfu8|X#;<%1Hw^FfJnyTia_P}gvXhYaj{ z2Hz_N_J)C-3j@EFL);H)AybcmTEx^dpoA6ofSLd-S^5x^(BLR2p+V+2z4SW_s{L$9 z`WlCL7SuOb-sE%iIA($paohk(#8C_CVh-^rs1gqG2T-D>%sp4)chMwEOF#)-4jEL2 z7pJ&6#Mz)Gfl8JtKwZz+22diz9#BI2eV~N)QBapi6k;5_ZUBW-5TNLkcd~Rds2dpz zfWjZJAbv#HH3s%A1A7$I*O~8kpl;%@ZyS8?8+=0sHu8L3UOK2O4m$_b5)NAmicS?I zOSgiW$k@Z6Zei*vP;{OkS$fv+9RyX%zDXB|_XZ_PV?c?pSAtr~z9pchaoDAX@3%me zvF{H+UCO>cH+=VlTE@P|L0!ha^ukIZc`B%K_MH!kPFf3ozc;X83Wo<_6pEKoDpcL697?;W73*mo_cE7}ekF(fYJz?iKMC!IsOMWii5fK@ZG^y1pvDU^p>RoD=!e_Gxk@3(AIhrISAyS4WYE$ zoMh$60J6)5Oa@Xh!pc)fJjqsM36O!2R^)adeJFi1_I4ndXxU9<9gqfCgNghU$gZ=j z2;CJhfR@+fc@0S5Y%B6-Ad_I5CeH|@a)W_5PyPHAe&0iGn4f>#sUI2(BiS(@x~V|_ z2=Z$Vgl=5XKZ2a+K(2Qn)i#9A1C{HSN=o{9qDC7J#c`(txyONYIgm#j$a)9zQwOri zfoyXiyBx@?4y50K&}lCHBgju2$O#8RH&5sv;dz<^8RtMQbRby-+}?GT=atJCIXcv2rHZkW%eMCHAo^&8v9msA6@<$u;30!}s}PK`YMfn_HFY(}HM=U5 zhr+|628W4>jn^+nKZO+LbDCMx`z1TOe2S2WvC z0iXPhQKSqle>q?F1Uo9Fkp!nh=vx!Ot8GnFa-J=&s23^2dRJW&-d$T;7Q{P)H9d7t zyr|CKNDF#GwCz%jSo6n9V0kD|7W7l&BKWKE8evpc(*~$j2tjD+)NEZ@J_M}?Aep4U zJ-A^wn!K_mJ#%e*wl+ayHBC(eOpDV1)9^IFv_DHZ>C6k~pf!N)8Yi^z+2Y?BemFN1cZ8^grWdb_K>b2NC!6w2XicrZ<}Ks8BZSNVhld9(r-ZyfYXi~M3i>qkOQf3 zAk_{e5R0r$N9;#>(md^3$g3|r@S!3T7Jd)=ROo^>Wn1{Yw-x52=ih^XNOQJ4TuZNS548HOn-Vc9K_R!!cekx6Ds%w)q33GBzta?ufu)?Yw6e4HG6`2W< z$$}@oJPK`>*YbDBBcAy3$j2@(EvCFICxEoWu(rY+h!M~k+Mt9U*qlaXd{lYs@Du8y zT(zk{%`a4Zk7+N1_pPto97x28V7#$jS(K~5JM@^+RH*vaEBw0nr_z+S)zAZnpU~gr z(WT1iF%hX;W-&$DMz3~J~G>u~S62(^NchriFVtk0aB)9XJ+68+G(^SWn<#G4AHQ0?*7+@tlaC zok_W1vz^l#K&fE+O+OdTOl`lLFSQpsz$A~v32r&YCXOx{!L<`PP*Vht@z!_K`P{-= zJD&7H_8TIh?Po$u*m?GlNT}gH5ZJRr9VaNw4c0+apKUW-n!@kRK91xXkvI92M)A7PkD9t`@v-~fT!(t=p7RX)x0v6 zul-*j0O$4Ehe9bw@~hpRwl1M2&y92~2Jga7(UYXDEfcZnTf~r$j#$1$v4r~CkA!g0 zr`jzxECMt4Z?JSDeYDMl-vx*rr`VAgKWCffDMggL70okX{3( z+n;XrWK!B`Noo)-{@W}cK#7w}XKn!0lHs-f%}ITKa#G)Koz(aCllm??sqdvH^*!^XzQ<{k#IR-f27JvM zb=Fb>ZiKY zEvXc8$kW~dU%l?=t*KrcVp{zer`Qi18z!bn*IPfX(C7#5p}6RIk{-^`q-{BM2;y-6 zd>ozoF)=N|S$NVkXKS-p;n(t6cTFQT6U9bddWWBq-!k~7v0?mFb$$!BrKhO8lag+J zqnPRGsvfhxll(tr|ENNdA^{ktgV*V2S_lA83wwlG@E_!1whK~{dNhP0aT`ZDsfQfu)9;or&g(|s zLkZ~zHr9NKhDVDLhgUv zH0p}xo1C7u$p*vK!~lOOdcMJcQ+}ht5WN5h%Geyw7bnArXp0C&5xp_^AdTtG z(>m8Nao7N7uO1V6Mvc@1sK%9J93Zx-Z;AoLYg=Rb2Q(v9F??c&I_*HG zcE!GZGKSUD{sxkShCDG!C$P+M5;hoGk|Iun$A)dAg$4(>4sEXkd@~*=O}n{U)7j}P z4#{+YAIAfa#{-Arfm5K8LnieR4)8be!1v;TnHYUIf?pjEq(`U@PI@Bg0KX9jY(Ed6 zKB|f-6&VwJYWKA6+lXsX(Z8ZmHs+2oI_y7*-~Ty@-w#jX*Lf1Z+u=7%c3ekZBH`GNU?jZlDmW-* z#(@!imOG4`F~di37!9>&M8ObNmZB;`7IzohQEqXKPVUjQ(UKE~A zJL%!0$EZJ!Z%JPrUX%ncGMi_#{@!LbPYf?|2l@nu3U?3BzYhGvXt#2BuVuq~&CwKi z+meUTUqJ!0%@5#SLtZPx%Yj^|XSulgZw4)%NS=1;3EFmt4tADo5bK10pmoC4E7NX6 zrSjbKE|{=9$X5npfsob$af;@NUbzBTZk`9n4QV%spq?a=UTqeEU%g0hV;?+v8Xuj_v3V_D^tk9{sq2d`QvAN$nP_LRoRnyCjRmg55Ex zk+%o{bP}Fee^G!r@i?Fy37R@ z9iq>|m+XK>#Cp2<&@l3w@by-Fo_!1ypqJh+Nn8CH<@xf_t5>F<3vSPvZzCo|--#O>he46V~o=ThwxLluz-OX5GLxV3f17&a|VpB88Hc^qFZCowm`KZuGN zSbZ%8H-q!)X(x|X4y;2ntY>K4u+uDIwOE!vGPoI5 z>`xa5>0=Cwe|Gm~$^>=Edc6B=FsZT&btid7dO|Q|^?YPcqJ*l1>Jx=VM{?^hE~nX* zc+K7nT#4I}IAa8bM;`_C0Z=SP;Vs#qTMAvbP7Cf@`oLjWE)`y945wB9^}S{}bzAZp ziRiuCQ6u$aL&Du$DepEa<=sZ5ygy#0RQlv@dsFb_I;8Iy9(3rnH?;fndNDJmz!pHxFvDA=UaQ>h*lC}C<&>i8n80TB>K>G!fYYj z2U;TS^{prW=#7Y^BM;?`$kDE*k?0ou;}mJ@MH8TO265w;=6&>wE{>8X%#df~h8c<) z_B#4$zGc~X{%5v9ZrU_PIiWWOp$DuLT{kaq*z74TPkt_G(wlG8dak+pNZ;YhZGz^z ziPXs6N%dn^N7@WB3}gY_4vo@vgA{3#ue;Di(c5LfQXi*G(i9TR)m>$a(IkSP&Q%yf*}TUu5;+T&$m^q}czPcGA$pp}oY{1u^RywDi`G0?*Q)$gGN z1${ken$~*SW`UyYpteXim6)jDoeE#pBp1I(Cu*koJO*#~c=8x zV_C}wBu7$us06u8u2runhmlX}&nZOoEJ(tMzTu9N>8}?o3kLnQ4M94ENBc><*as(0z|jdj?LeFP zHo=%fbovQ5`)N6`w+1@=6uZpZ=-dImIrygI+lNirzr*j`s=E3{Iu(aqPmN_>Y-bUB zmO>5KyC(J|PMGM$#-qR$tdrQf=&gfR&@&LIF9%yi>^VW4?fLso3hGDi{{Az0NYAW> zh5$}Q(q<}esL9_%FLZ45vm#~!u$?dn&9VQ-+f-d23gD!oA1c#vLL6YMm@H*ao-%o= z)QXojY9}BCt)F2msk^PNzPZlJ3?eJ7@ivz=d39Od<{G>U5?MF7+FRLJU+Wbwg1lt> zlK;E z`KgB#Q1;}k$(MPN0DoCypvK<_m8H40WmV8xq@=nA$2l#p)ztG%m@2Yp0v+n%Gfh+R zo6aX71+^INC5%-XREt5;b0y(R!%9K@)S$WzYPUfZq16_A6$V9*Km_&+gQ6ZwU@o+q zf;z*X&I2_KGSek`AEWT~85Ervs9@jM4QvEjIl-rbs$t*9L5UMxFB(|CfejhdVsyiF z?kZhc4yu5ub)c?c>Ia~%V(RChu4ZZ{s9dIK2lzNp$E6*BnlH~1bg_o~+Kpw4A^Ny$2PDkyJ0!8Pk(j`AAs&C0sgMmdriIaV64eTjU`5a<5C?8XYKov4I21B0NOiczg zhbemdOj<-MwEBOGF zu#%5K33-!oPD=1qfD*m|P{Q{!P;@FVUAhn>tLaRYg31DwEH#3f$=DiD*^E76VCz9$ z$-c)y3CUy8?}-pI4Qe(h;kyV_1BX}*Du<~D4BtmV39WtzicS=!OTD13VCqkxgjUiR zJq|Z0p}|y8!uL9Zy2GHJFsL4bItuDmmOLR%*N@K8S24B#R0C5gsB4&d1e7R+CqRi( zcotMH`|boKYVzx#L{0t(l&Hyxr|M+Rp!poI2CphW4HfD+}~2ujq;`#_1>_#;rF zHuiujL>%eTJD}z=bpq5prq06bc|KERpcXK7C#WK({tc8Ut!<#_Nq@Su-=IDMC3HCs zO6ZdL6}={BgA%?upoH&YP~TuF^`I6q)n@SBYw-O5)FSr%h2i_G;rj&O`s~7x&u@hQ)@siW9kQ>M2Me(5_REO1KSQtNZDgx`wZ;D3_WZ%sHH3~7nG1v z2uh@**xp70ILEXUA)u3)>stVMNOsxTR6I1tr z5*oZ@P=5r4KjiM8@w1fq{t8OyJYuXKVl*hhmjO!fT?9(-xCWBhSl79&5 z77+(1Ee}AIGIlYVEg^5JLCpfSlzodpiBy(=5@DAZe13!Pc7tz?;rlI6Lcb>r>?a2H za|7E7N=WVpC2aB_C}ERXXiQsKmt0UHC+C3@Ik^;+(Ec`1A}3`7Q$Yz0wtx~j`L^Nv zJ}8m4PYmpHP$GmI4VaLe21;N*169kqB%$dRzNdf^QpSR+X5So8HB2o8CHk3HK;6dJ z`=A0$rFeCD6F}85b~&herV2ncF!c>kw=;DMs79u41J%S-3#cGd?Vv(T-49CW_XsGV z{SQDjv+plJwJ`M?P$G9np=(*e*jGRa?3q!z2D8wYiL~7b9yG_OGhu^jGpL9`-D^-? z2K9hJ#XTL*XFaHd&5uhX6C|9+OfYdP1yeygZ#|<;eN=jq6`2EMCWNsZ(4rk)kMx-c zl}@(}q5K#aW93nREcIBCbwJXPJEokU0$FTBo&!>NhLz_fAP3NPnxWnXauDsCi5v&A z2ldoMPDKu+Be^Ex1u_m+DG=vr^h?jfT*#Jh|G3lWWytZ7(AoUNKOs)1{`F5H6Vn|? zo&%x9Q~e`CUFSfSI*?l(NYH`M-aP#yB-61I;npI@~8v(z5{vEfzaZo{tl{dx18H#}iUWDX zf&7O9dDekAPuaia;Q7#j(8B|J+C2_roCCSUfn4Q4u5}jG(r-gbOL1QFR{hcn-Nrt)@lYI}+mO<-W%W2XtbMo^G&NvhH%LPYd~`XdjSy}V zxzK?)PvZL=JjD*=76(%AK<;!P4?2+b4y44Fh7Gz7(tNA}nRPX$#s>c%Od7 zMC@tvFLNix_?r2~OHEwvY zT;f9FELVb%6yvUkQqC_tt21Npw=}>sOm_|4riyH+uhTAtA*)|r7O2s9$Z2U&$W>ia z859CoDXjt5?{*;tnwrbBD=dUM97S26p}NeBxS_24Haj13tfrwfhE0Ikmx+MlL7veO zQTW&Z%c`_ih%`qJvTQ}rua!4FsH`uS&_XxX)EieRc>m^I3R%-~y!Cro^eTo(<#M?pPcndy)R zr17j7$u~?ycZ5S zuc6;fEOe&boN93~4vdVv;ijEKIKzQ(t0|n%eIs5ZNP)V#<_2+RZdsjp@XPlL`-9$P z^>|j!_DPw93eAt`n{m;xs4axxfigYcCMiw0@I`xW9cuJX_IelkVY)$ndTtAY$HUi@ zELbpET1eX`e0)=IKJ1F(B@d3%TN$b=r+owb+#nV5lleI;7ErK0GZX&>M!74no0y0A zXtfB-D&YGL{tLd}8PpS?u%H6p*9|KE3KA^594wZPOQU&(B*sp3HZ05YdZJiGA#@VH zWX%F`uB*HSKeBN1W3_Xt0!eY=vf4OJ$>Q=@?3;8?N+1h&ey%Veo{ykG#I-ZpM<0{Z za}@C*WD!WC5n&_I+uRC&WmzboT@_?@b%r5{V78W7v`Hz{s!;o^w<|`gGBy4UEmNjn zniG3N%UCQdiqtq;mA+dXN3@GGiH30CG!P*vV@+VMI3j%;@Y zQy?tO)7A*z4Y{6nT2V#R$SU%{?nFBDd}MnrMV*MKe@Krj;Mo6H(t{M71O|D3qI^8z ztex`y6Y|!i$h@=pb*?u+ki6d&OgfQwc4d3_imz~*uz`C&B5A_~Bd_7N3lh_$P;JM& zvpe!Kj_i+YjpUs}Z?X@=)3b4h=VvMM){$GINy@y`>v_*7T5%Tq88jID*DfJ6I4XP` zFDEO&UQG3ATA-t?iF8a2slYWilR)+4ot5-dQuI8K9rH3e@++oqZM-V70})4x4tLD= zPcJ&$cy&k7VMB-I;qGXXXX8$&U_@ToMcE#u*M>olNM43Dc+*xS9jS<3ia3yHBu&EE zsj;NSyt7=dX@6?RVyB6Eb^rcpdYQ>XFS~ zSH~(#4uy{=1}_dDcX`@=glJFf3|98!jdFM7rEKj_isYT**_fB&`I+yKlIJSrY*a&s zuo3eO{9L0P-TGl-=gjGy)3Vf}Lny(cFU$LrUf!Sm#^5Pk^47%soF#{rKXr{~X&W$*5Ao!)mq?k|bBPS4AEx%rTc zw-Mh`y7L8#Y6%w2ps2-p0M10y_aOA99uIm`r^avRg5Cs?-fe}*IM2qpu8A+HMR?PE z=RovoAQ<_$?gNVyodXxta|dt4e_T}40JrMvhwbz!zJ0V)_7))7M?4!{OQ@&$IPl7la$Gr9x%GfM;%bU4XiAu!6WZ6jOFx;ch9EE0r-b%V zH66q9l(*?U&Eqb&O8G1@?s5+KUNnkY(xo=K@NVws4?)jYhUE7TZK8q9E5}Clk{EhV zUv@WSq$j=d>3N?<(vxy?dYTVKe8x?3aSD@LbK(oP@tju;%K(32)Vi*chRa8&yxWOI%EIC*l z{>&8|iI$3Z!YfAM4xRgEBkVyQR27l&bzFivM*DQP;h5sLMUjrXiarK@3NV0*|8#L8u zsirwpQ2FMC8#VU-Xz=)SJR>`wzQ=!TH4w|1p^9d z7Ge^FN`O=o2oNAbE}LoqO(012{hyh8@7@Hkefm7_`||sdotZlyXU?2CbLPyMGkt)X z!QQ9Cu9rEa*^!Ud>d6D}GMw<@fK<==GoJUS3oUO&AG;^TyC?M(pf0?Vegc_{evjh$ z8V2TbCGzncuThRF)Pp`0;Nusumrw`)rWoJ!2ENcj0Mg(SxE6*7-|2?B>X1K(9&<_l zE@iR{mny!YOinB9#Q;VzfTg`yC9^Pr#acI;o29+>&`Bc)If6!x&>?1oFV`X($xDjl zrh?icxpO0VqvUWWoQTZ7U+!hBK`!n9d`fYbG%YTT?^7O#OViFO5A;dXzEmDKD@{A2 zJn*G7tyg*Aj5O`Ec+4e!nxb4KT{+fMANoK=*^KuAQ&P_!71s)bm$~Fnr{eEIM7l37 z-PKoDG{{+3G&mouUoLWLchZ<}$UY)k47+XhfDMHRr0>;xyNFw5doh1yFTo|<6&F9X zE2A%uODW?=`ny7(sz}c;+q0vn>hF}s$I+4WR$Ou#^GeBZ-Wd=yBk7~Xe1cyeXL1R2!CBQi$#ad4WugBMqjx$E#HbHSG zBiA@1SCB5q6{HJt1?hrZ&v04=@e*|t@k)cndQO#qZaeih48mN4dsoIhWHJpdX%14R zrInt6LPip6>{8*N((x{P_hD%Z z#HGB{`IpqhApPwXR=3F0oYUBx7pj{P6}O~DV~&^xn%NrM90>}5;Vuvh_(nzwfWRLB zL4W(im}8t=-*dooy5ulM3tfx-7&L)S1Sg|#MP&Mm@yO^MSWe}SiC!<2(v`_^X;NI7 z+$T-yQzoC4CY@#BFIo5u3-_|{X|Q)O=A<6gYuT9M1P@$tIUf6tBuUI5@8cE8T_ZkKE7bJR=V^8@#rm3v&>o9)5>64tLJH}@n- zt>1Vfg~Cn3di6UL@->4m27g%Z?Z6O$C8h}Fe*$xXAf^-zLOW8?pwdTNXS*LslZpt* zIfm03Z!5Vd83T<>hgh4-uua++R!zS&=KaUpD%PY%I~=hOs!$B;If!C4+E+I&Kx=f3 zmt2RdDw!YT>2h@ydfEw{6d1oN1LA32u zL+z6L0cpwuwj#_)PjRbINnY!OYFG3iPXv$h?7O;B&U5S)}#bH zdvJr02*-0ms7OK}_B-<2;4XcJ@cDJZ=Te4GppA?J)U^zskhOkCF<&d8_M70I#BbZQ zy#Nm7ArQ+{O7=Cd@KhGwE+5BMO7^uYzU{li?G*chSXiiCMZVm>VjBR=-o-InBUGQH ze0^*Ly42zZb?92`RFGpHax^-8H5e!Pv{2nb+0IbttQu-i-M>PXr;()@xosatKNYAU zo=FY2sqaw-Slg=m*8z3tk3?UGO>QBCO71FYdX-I?*q9buk?b_rDg zP(mHmL5$eY9I3dIf&}k~;`Y!>BYf?l7h^xJQp2sp3l^b{oL#YT9ESB^>A=@|?CX7v zwr#@tZh+KmI|%^(1xmOXbpe3J=wVE;iJ*iQv90O+>gXS3y%v``CZpNH%4!siabcJ4uy@K`c4DL4S1UZTP zUjPz=K=aAz1?Q96?evYNd+;Abix$v*Z4CPMm}ejzmK}*xR}9ojGZNI-HWnK|Mt&-? zD0XEUC}XZ&-0Xm)2wGbw9|yJl1uRY}ic4eTvF(^U`dGdJzfC#2)Nn`aR?yTA6ohtx z#*_3kzQ%}qu%+SSQB4>?QS-m6xFOS3*(8)Bni;5RPIWXe9+^#N+w`8dWUkCOY(Ii=@N(pU8dDL_pYEr|U&|7STT!L+dFB5nWs;Am^W1SlTIYu4&b1=_mv1N~b=8}7* zbZIIEVyc6_FR-5{!z8;j6~ffiWR?S>-Z@oFa!ON^#Tpm3`<*3AwNXr-;qW{~9L3j3 zjPW`o|38N*MThB+#Ls~ zWk*S2A|4Us6VXG?v=d6kr8UQ#a$mI1nTGmvZxN4lrJay6Tm_MgG>^Ztq(OU+?_C%b zVC_c?f@BC}U;|phfCq@#t{)v1r4?q)qZi;t_}3 z6>Ur5EjOlhMKaz*#-y}H#p$T&NI}n{y>{?-g5|_u;ERGO3`X%#Oa|$)~-BC5vRBP7)R0V(S-pEkr8CJy-%yA7`V$I8Zy(H59UA zY8QGwDrwbJ1@v|cEM+ILvXdy! zaqapY50n$R(|ID<5< zWI;=vUJ4vR*pCEi%J}giEE?S%FifmZ;@-B|#Emo$a+NDbq5gYb9Ml2&0+nzhI zFOhd(+Y|1ZUqoL%mq ziX-Dq9eJYaL8L3Ex;Ghh>#B0IZmN$?1N8bFmilysd7`$90ZRdD6DkP;qefkIeuSVs zRE5O`%P)G41=Sr{co|0QD$IPWqNGdB6(YIwvB_g&WkmQ`@tCniy;J_MXFu`XZ3!%A zk}PmPVc8BWJG2_`0CR7cNxF5rGTwz#oQfrkVA6>_H}haXz0(ySQJ7BhOgy{^!O)2=~iFm2~SY5ZWK z-3N`cnFe`0XdsiXb*G_|@#hPbTys1Y>WFkF!1%%-cc}lHcxFB^#aUO6}u|z^@$+|JiWq8o5y3SDH#__mts2F zXUtLTMk`rJ0fYP6laR$ypm27OLoVmP(6QQ^}MQjyP!lZly^g~=j)K8 z7%|{YsD=Nbz-{_Cy!P|^g67nl;C{{COoD%BTNN0rT_JN#T=$|sqmgGtrXD_rh zle`fl8It9veHsqfLmO~b;Nm6z3!fVF{f=w1^MV-XV_$It*_NRProozAFN@?ZBd0r-3jGHK_jw!k!3u3(GF|4m zZ%^JZvDUdyciGi?5hXS!52Yr;`vaA@tS{8B_)I-1u~cP;=3=|ccWin@_P|GRLU)A2f4B+Uy)n}IZr<6jAt`=L^8 zzMX7u04saZhv~KY!Swxq4>zO6mc==4V)lK_#`8G)n!81^=z%lQW%z-2^Tqff?(P66 z_1Pu*RM5bR;pMOr zxD@C@%WB5UE08ApSJivhpnbr%iGIKjHbsxv*+?L#VKXT^Z&iJ3qM8%hRjeZ|aM4so zEkttfaO7t0^VSeG%BR4Q9o_~y#e&4qe&ETr*8e2`WS~sh_dL^mw_ZdE=O@m+#myj2 zm^B3C6dnJn@A=Tn^0v5llj>b%^R5AcJpN5WWIXlmErLLsfT_8EYfH!ek=!^lTPhmnN1H!0GFROu2YP)jsbUK2ynTc8_;c^F>)4BMcn} zo?Hdk2Tsy(8^Z(ky$znOxi_f(P2hBc{lLKrbr~C2-%8b6^UW@~XZL5SQw+!%3!p4$ zn0E|_DhqF7lv}A5uNWD6Y2G#JM!g8uKPq!#_c7JEBv9|16py2GFU{>>bix?GC0N1} z4B&ipMJjeqNj>P{S5VTwN=V?bY8ln~|A&^sx2SJX>)J%n5vHq4c!92_V!F~CW!vLs zX2ixRtVXMX=x_msM20p7m7EWEbPB+6_eWAMUw9V&w{S^j9dK1dbcoNWRust3nh7Jnrm(mtd_HV$uXb33kZTKtsBt^|* zfn|zH-nu2FTf)kl$GVB+(KOkSoaRqfi}Qhg912$Fgu%?p-Gp z+7<6IsnDi)CCOd@-L%KIL3rT{0+zkErZ`=ax1qcyxT`eW5D)G{6%C5Fq5B%F@C|ZT zAp4YD9}rfvmcXbYW>} zu4qnqjUdxw)|_7M1^@t+ylZa2|D@e*<7gpl#@745lg)}a9Eo|5fsf(_J=q09;!Wyn z5XvWGYG4ufH|#6ku+O`J77Jm$n2+2oHIq!~W#2E!rE&-LcV7hsTer3_39of?%Lgst zBM|A1Fe$IS<;nKF#aKX&U`H5`MOrC!iAb;3S}9H1ewFU4prrkqTd*o!pi+4=swMaW zsz}ry7%39%hb}^ZXkRG530*Y1QuEKcv9&ds*2W9Aht@`;TC+mdTA~yEz;F2%DjUhe#B28&hEf6=Q5N;=U7l!65;8Ep-t`3`1-P6NEzblp*$jyp)=N z-Lfkw_)XZMhlawi<4PofgAT#Abg6`}ZFBb}`JU+F_T3kptSvf z3`ErPGdec$E4I=n)=gC?ka9-l058#*h=s5hczS53OXHAlKnX;7nCHb*J6I>E> zrI0iD_8H4zOL8Xho`1q=FEB^gZW>%N{E=DVzr&o2YC@K32-fpX{tL}lqZ02&s(%Bm zgPS4BLnq%WRQE!}AZbHBAyl6T$Zyix40R46Hxi&0`9{ON->2$Bm;uzkNgNA|eT;+-IE%x5m3 z=u#5(?!2=E($PPev;L2OlYW)`+f&Z>5$7s8)6sqfUTf+{Z-ikRX_dW0Ny(fBtuCE< z(&>;I2HH!Yfy8Ac+1DggJc&g4I8%H+i=a@s4lIolpiJ6_AiHXmN+o?Ru8qD0GNkIg zo-|O852hM#BrS9?1%1P5CA^oVc2Fug9g-WN!o-xo=Ug0Bl6{m=JwjbyR`)Oge-5PZPBJ5 zgIITK5@syj6-u|!A2PZ-&a!j!JKv2cU@>+$Ee#?VZE6@zlsHihE_`4UF~^~|0ZWnp zg+|6RY&m!A`6|E@It8(kUCMj%;J89y;7rb}#d!p;HLfFK_Yml4IA zcrK}su3e3TL2>uPY0Q>bs3fmersBT?bi;K2H?kcq?65#vj^JmwhJboHIO$bXVE&__ z(#2$qc{3z=HGDnM&tp)Y5@tR*W z=8~@D%-=zurrG;{n+D@&5LaO``{*3-(J2*z&N^WWfL-OuW3Z0U-Q7KH8ydTO3m<=2mBBtWlDc~6kX_b!i6>k$M?dk#N4)YuCQ_7HfzQ+sXk!TL7`#El)x9~X!pP<1- zGj$%(a+O-?>DUBYV2#^7_tymUVY4#f!?REOyai`h`uzd_LMLJpVq2yolK1<;wA zyB;(7u2>_{lgSitLT`N04VsKOK44ZOSAR~RPtpO?@_OxMtWhLidclF`xa1S!A*bwb z(*A^Grc(m;dT?tE2Ikt&D2)%tH)sZg88fB#oavrMlUke$Bk0(TfOjv={4?APkRT>Y zU-ysXZEPM4Ei^`BzKq4TP?=t615YD+&2164z)1COSLiJ~IU!U}NMmC-!9`_YYfeKw zJI!pIOl|1gJsqd!vCG(AYp*giQyNOge;Dn*WBpNv;_UHcU}T9abP%jMpg!Qjcbp$n zU2&=l3lT_c1M#4Xk&-l**o7AaB*&T-#1}h zAYBdfkze2<2-$-&m}n{EFb(4{fy~c=Da8WQH3MOC41kI5`QqMa#Lf1ka$WR@Gwpa< zlnfh82(fB$2&pwdc*h<6AdKLuO-yBMPbhyL+ba2^x4{yzQ>0N(2kytbkxHlbLgg0B zMdd0TMPeIFpMjk_U7m)Z3tepZfpA=~fF1``f z%|L#!&Y_G}9C@g`5#T{fxgGf32*v^_d<#rgz|J!vn9soOv$z?8r=k`Q!_P>hol=XN zBg;pYQeO5kZaW~uuoE*fOBp&+x{9tI@X}76VWDFC*NZ=ZyhiyHf&{1Wirrcscb%3q zWvNhIZv$|()UeZm4r*5dm293l0dNx~f^J4DHuf1y!e|&1^PF8697fMm6PTO=!5$}8 z;$|`kgRLSc=evwwV9rhho4tZ2FAU$Wq~9w+;kXJ7#V@eU2 zIw0T-y^UQI0x6-t!u$_&9M(mB_;E^C;BSg_W$X>uqO-BS6Y`@z)}s)lvHl(si*7_SawAb(XY4wR7F*6vN>@Sz z2&fR0PfF9s?i{ps5(-$c#tDpqfAd9cfw89DM{8PCSifJW9?r#4o2`$TvY(Vg&F`{R zZa<(F)&uC(J!-hwx{O6~Z;gJMt}ioZq$^pYF`4vB!vpfo+CoqQ&e7QFyAV*A5_K$} z`Zd8plJo?)EC5wZNM=&>1o%#XpfDkoNzfB;!`>=CU(dS2<>zrJ{GLpz?RY>ujY)KX zCIe)%*DT${rA}z-u}aKw^6n+`lxC>1WM3oiAoS)y-+=xfN0%XThdU$dMwv2ozYd%0 z>U!`T2+k+~0s1Qo7)$K>5bmf^i3uq%i0_O%e=%zUcVW^a?u+FeB)RtmqMwpn0;%>i zu)yA3R9!MKHV#vIyi=q1lZel7dKijbE!MdZ*10CeYx&@h!E|EVjb~uN?|?l$lmD8P zY02z9h8?0D-6gR#2Rvi!p>13q?6TDdJd2#6O^UafWhm}s8B#)jgcYw)J(fv$;B6$~ zjpY&^cpOQ1W4VL}RtE|1Y3ulZPVljbKr1ok4K6&YMTvPc5gC-}<87s9U|(3iH+X>V z7dgjwAC}JqvQNrHg_tYzT&8xTl^xJH=zsPB_)P9}E5z741`DeRz6 z%=Ho{e(wiAE=i#POm}F}{@Y0)D(XWHJhv^S4N08YuHE0^s%`qr@x`|l&Xd;4JK{!N~5bka0xu11{uFjkLe&7_s=YZ@f z7tC(gMzXa_8Ty=b1;DqVZ}_pJXUvZVtQN^;=@#^lHzzVrNJsnsQf)hkPM{)BO$Z>0}~$Cxa_fZy}+Zq0CMB5Ck@5?-ym}#o7=%c8z#30 z#f}V=^Zu?6^R*}rF@uReOw71w%o{0O#+ZQ_VUaN$2^qspG6o4NxZ9g_j%;v_oUzkj z{Kr{aO#Cz2f}JwSGbf376Y`93PFqgi7L~QiE9bUl>OzLn-A<@O*tK`|);-x?i@ng| z9zNy%cmWtHon}`W9ZL>;uN1-{Ri=$Ad(XCOjb|~8j)9dI?36&exE*nNc zKz>{K0esnv_&W4+QQ)*}!kna}2TkBAX#YZK=?q4BI`M^pwm~q>q!T=tNPS zG>6^p3SM3Mp-rANr@NFHD1}nX#yw6ajAkG4Euc;Y#ZGpHj^S@gs6Dn9@a=1c?=f;J zqUY2Qr1KlVXTD62>q4P)@suNY*Wz69ls%MA2X17T&4%!(7U>2n107JuWe;C+;U zU5f7ZOg!Zb-YT9-4t*SJ75kjQ31VMzs1-g~ie{CzpDf+(l#6DeYzSxgNcggJyNwcR z>B0Lg^cbrfWAHn`WPHZ$d*gEzeTN{U=QeCQ%Q~M2ctEX;*ZdfEW&i68!R=}&Qwcjrj&>*4RI zKc=YUwCBe@W6u=oe&ATnE>vRV{FVA+it?PQ@AW&$c}uw66K-4hL{81y_ykL#hS)^4 zxKZ6mbw=E&3ho&;MW)*1;_b@xRNNYarx;qN_ChocsCkP5Bl8}Zce&zkm4>LkMh=Qn z+$2r6+i*?IyWQh$Tf7>&i;7*L%04A9>CgxZ7L48V$Z4G*U4y&&}F<1>uZ$DrUDEA z$etW`59=?LV12 z9DW@GD{i2}rKC`byo>@E7nBdk3LP|YWZi&JSuGI~V-rO5PLQI7D4>MH%HVIRcRojT z=ihDvDZ*<-=ye>$J&2T?ctoKxvTseK2wr|RU_618$bGQI-h_jioSKndn6sS(aQU#% z^mGZ4N`&Q|*n}(I)^U<|og7*v7dOT(iF=!|n8OUt<82lqKR_<*>#!@h-Uy z-9okh*Q#%2_6M@R2Jb*e4-b-y*QlWlJwWIt{V-Jx*LuPmgvjdz63h_&HMY%kn*#SW zeKnqjumd*<)Z*Ic;bb+mCha64)xQp1^_RyA)KEFDk4D_1MuytM4%|79A_tIdS;BiXRmew zdJFuJ+Yst^o3;TVJnUKANPAGYUc%}3_mKpX-_RWF@pr>837 zq!?Gpv+G#8g;J$y=jdbPdQr$lzg~Suc zC;QgLeyA>`nGQQu#ch{R*G8J}U{kk(*{Hr%Qiey}NI8&{sxGCEO2*A_JBNVz4Jgjg zKT6J<85}grRTydEKxQ4aM^AC^rd01bp*kP>b#Pp#-BY({2l5HkPbVXK8=^Jxsh&FO zT`&dMk;ARvl6i1rwpb3gMe^p$VO+}C4!;SP)5U+^cGzY@yVtBt5$s5i@WYu4nLu&K z72I9(x4~ByVNC9oy(?oEl^rFWiKi!6glUh($P;c3--R244wbm6Q0>1ibgXGoF_8V|3Gt?ICyIO`65^B38RLjz9v%y($bi`5{ZlKgnMy5^3gcJvrtVO0| zR-&2J#518{WNJeSWE)SYX;Cs5d#I_9%*y=j3(G)1l54DXoN#TfU3)OxIo(90kzAV&{!q z=7w0g&zs&-+}`4CZ@wrW84VlkLogjX#7xIvG}gAa7}o?2;nF=5&xr_`cy7n|Ks;ZI zxGA2$jR=Y7b@)9`#b#a1`GE9Wd%L0q+ zeg~ranq!Wtea!<)mqWgU+zNM2Qe12iJolie_C)EejQANl{1E zt$&~$h)@whoP1*r>MnW$XLP?peQ?EjmDxfC)y;1z;DC#+C;$iKj`MCO*O$jat-Cy4$=l~Bn^1PJyymTYI36JZJxqyZ|dd_j;Hw))$ z^b1#*Zu$i{%K`i<8@}VWXESC!I+RZxsxvxN@dsojQ%;E_amwRD9y-aSupMDqDZ4kr zNg&9VZn#hqN!Mqu2h#2J_{j`yCO>&KKTpc@kY4bghDz+5(!eJXeKONZd1fT zRM+n)NfHO+FMNPjHlYUN)Rd2j=)|YQ+PMXO7FfwxZ363`f+{#-yQApn0YtS|@CQ10 z1IIV2;sR6z%wDgGK^_`r;ysJoW8mvhmEC(mDAOE^jEG2<%t%X*h-_Dgk@_ceRB}Kc zDeWv)aOfv-hl_PcKYBFmaEoT4S~n~D zL1hv=TrmfT>DaMgyCS(DOpOe$EIELyE%(hK>MH*&;q1Kg6ZDY;Ftt+TNWcdiy7W0r ziy^LKUH2w)igrt#NLR9KY|`A$CUto(phPeW0mZlC&boE*FC9*Lkr!Ol@c51XY)J^{|fLJ&rRD=)~4%$jza8O&{ z0ZSYPp$2#(f`6Pc>$eset3R$;(T0Ys}uaJwE%e$$cP(+-lo+P-!Nb)|1~<9U`Jl`-egBsUZhO=l05HCIzyiKCiO~_;6L!R zG>JJ=9mu2VweO?b)E{w}iTQR63SpiQOS_v$sM?UnnJ&e^^Mg2L1D?r5^iE7|xe=ZM zF~&GVvem(Hh2cVZS1hfn0GvraYKBj( zA^e=2;1eo;1d29l?B|miAkadS12CZ!3$28ebvitu2oiqCYsqKYW%z{k*<3AN19I5# z>{sAvc50u5)ne*dX)5zKo5|LRLeIw~hqR9{j#wMmDuX5-CZrl`nZA&Hq1}v3i9DnF z=YboBoh4sr7gHXy{cl;@hu=aa(dMVx!_?-$g@UsXa!*C{KzFoP>WlkRM21z3*?1{8 z2X7hRKZW-W=f4!D|F`MsMttBeegD%4yv#5PJ6BesczCZEU zQ?v1)+GAO>L&2=sfh;^J@Yu|(xsN?OBRG4;V{;#RI_r_yGXsGq9(iKsQ^9#~Vm)Wh ztS26Mh+dn>dNMRGm^Ckil&7;E%KG6`vrC@JdibG7e)!nj*`cQ%&3f#iC!c(XcyiH0 zPhA(xdi05Tk32N@(X2=Czy)fUl|}CzWTBd(dyDvE8s9-){;0+5lB|bAfxyhUS%KMe zv+%4+*0r-9y)ld4hRVA3QK}Q~AIzZlmMnk)r*o4>zgC0>(oD+*;qwyrnxWYU@%k2@qF2L8lfD7_}7f_##oLrLklJtX;o%u2SVroW?uG0<7=8P zDT#PfM$#CBI7Q4dL$}>+lo)!C5&Di9$~Qxw+-pD;Gee^$8)>7>&^j};2_X*swNsOl zZeb8SixBUnh>(Y+twt!9h5m*RPzXqmBLu`D^ymANl5S<8SvalbWrGOuvhPnf(i#yO z!Sb~t#J{e5!1($)LL3&GiPK|u8U01EBupi6IO4-RM^h^0YVvYS$>JjVcm(qq< zhQkWsXGj@=&Lv=`b$n8aHN}nouIQIS!v3aIYaTird(dS~q1|f7U~5VMDGM&LraXg` zDiCR+^`9Z72LB1)02Kdzi&$H~ls_ZZ+^^I|q~u*;t!EcfUi!K<HSA(7|DNO577 zCsJNTN=?6%H<8i+K9^Zg2yqR-nBwn;MUSMP263K}Ne6hI*Jw>lZ@-|u2@)jlHk32qGe|C~K zB6tOkJw$1R$Vk^;y|ln;e8J1Ivy69ak#-LFlrOQx;h;PmdSce2EGsrtvu4iFahEis zX!7@`6pj1Nh+7iDToZcB0H9Ki|3p!JJ7paftX%)RZZC%7C6ur>39fA+}(gNjqLrL#0glR ze9qxu?~Kv8ZhaBSTc!%NbmM;jnK(9CgCBLm9602I?iV~?6}MA1k>nJ3TOlz*KPGhru!?_#K6L<)Q2ObpDTH$BHccioL0eli!B8VxEQuojdXRsl21?Xi_Qk zOW#VAYebDyZXJF_yoU55`D1t+^}~O7_xt(5>&%0<@^9b^{HN2MhD%uPbm7GxQSL0{ zE<4DM2jMojXeKOf9~D+daoPI$0?JsIDjqonpoAAbL{4}n=x_+D>u{PSZcdH%IwGSl z%ZEmlo#fy<5Xdee)?~@-JW3Utktm*mB3(so1G3VPsY@vbokhAaq||TH(3}sxe(D&bxY$8SicI4%S2>gncGq`gVX zMVz~AK#3|;Qn3;_-pXEY z3mk{qG=lZ*;rO5(q0&_x-oLOg<|m$28-`icEe-`nvx4`t6L^Rqx06U5oJ2$DMB#|{ zbL%L=i0t#|p-kK>{erm0W}({GV}n78x0~?}yGJCIp73%Fw6h`}*uxy|E_%`xTyuf? za`arBXRx`Rr#tM&TVei8vDZ2ODwK5+10@Sr-R!i^0VCKvW~mq-_VNOJgg$uEU{130+CGY8Tnal_Ts7Iq{FPwlR=ZPhF>&YVB)1(l z?CmATjM_=hY}8Bcae39vRP`WKEr#1tge7#Boo=SK!Ji8DKJeR8@&#BP$42oJ+{Y7h5MtKBdL zYKNT_p2UEQ;p{!AGP_0o7}ZI%{gOW!bmXtaZk^pS3Mssh5=i9?04!UT=#?# zQT||}zf-WwYz0rKd)(tS!+u#W^?$chbP? zBe^zDPswKnc)&Tw5!`~K0LRl{h9{vigcQ&R{9}XWm}kwV;35v&zlf_=;L6(s!ieOh zz_1$E;u*H!fg7fkXj^foa=OU$_}WU2gT}OUUCje>i$U(#Wjw^gHuvg96k zeSX)x7lHZhQrC2XTos8O=xtW>=Zq1`zaUcHt^NetPOP?DRd)mlFpF#zR(~M-Y891E z*x8BvAr=5*{{R_EPviC1t(br`yA&iapXDu)!nm+{3r?wEK&N_Z#~G1Ec|SA!!~>pG zeI(q;Ok~kWo$TFCcC#%fSF%e6i>|^r!(KzKS3@hQMFb2*DY#ZK2qKzmJH)b{?kZ3piDJzk$~gh7bD~2J2kq1hS#2o zYbWfC;q4#Yz!>L#p$6q*-m^!6Uzn;YzNX#bHgRT~fZNdF4LAdp8{s3fH8_G_VUE7d z?&bDgb14~fMt2{D-6|Y&N|#0^;81-7%^GiWXq&tZh@x_2al8QtQGZN51}P5<1S9`h^qx|!ewKF#i2-`En9$)y@kpVg2hUwNcD7-< z0TnPQ)Z_2rD6)sBy279_9{joB0EAii~Bd^pa*2i2b)eVg4s{-5Fl zxVa!cwqp9|9oNugq%f5_nrd{L$4C=JorZGE+UW?&vQFa?I3odH?VWhj+4iAM0`dXe z*=tY+tHrGqdlwC)0UKOR>oia_vY2Rqsz;yM{q5dsF6&PNmqqUCM*|;%2B_Qs8Yph| z;EsQJEvmX;pZ^YC5qTz6JetZ09aMlWZv>sdnPxLeQYQ%*?J^{R7Wz{Hi@k>dx8$bb z(wMt@Hjy}=*5?o+@1aFYZkkQnCZtux={dDVcz@7*KxV)iXEd4kPLgKA?v(B|m4(wu zt;rwvP^uWWBJ-Paj8U$tsRU!_^cNz4oO(|_n;3FSaeR$^ZjnbUG z1z7ZBm%x{JuPt~}<1y~5yJP-vSk{xhf!l_4yHlwCpu(4q7p8G9(bsiyB{GM0zfr1Z zF4+w_H!ejf5@(>`LoL*_{_M6y4Rd}x2Cr0|TxsN2s|Z4seTO3-FzIV)MiRf-D;_>2 zZo$<-dUEuNcn{vA0h6K^HyJC!$_UwNNg=!jismv%XKWn;q4U9*n;=%JOdBD zxOPXrN-B!egEvDQgZq8(m|pRau=^0>bMVa>Zhenfkm75_W5=-mh8PuYzD7vfDG4LJ zU7Zfgu{#C@uZLo9cKC94jX4 z&)%Nh;^7ora%G(pkEX!ZUB86622?=Z!kaezI(9kgAK15YBDu% zPN93Fs$V)D{1o!fuCn_m+P5Z%CVtq+)eWT|&%<{}{g&Q0_ zWhYPh04{MNlin-s^_0BFQ#MS+mLoAQ$zMIT6A(@--ls|DO?P-R<)WbK&A5RA3)H2r zQ>#l$@mF2ChK0-VH!?Yhi#PhkntJaFBqhc0_Dp!WEtsnoEg*6CI3_l2O^6$-zL$&( zSh9CH@GdMFjdWF{$|`C?b!un@8E*Z8^0Ibd?~`308GX6Uy1k-m+fa^VjukNIIk{2} zFH`+1*o`~*757$kpaNJ}5u`V$RJppAdVs4w5L;NX4eqix(wFQo{AR-?#>zTpI#|mJ z27E{rS&zk1DkZWWGa%WWP58sfj;b3e)plC;t&|(`t>B>&f{-pp0gr(1245y`U#>^< z;T53G|!b|Kr` z(YzIjFsNNRld*!MhF_BN_@z0c*6<24^{XM&0~+7Ty3s-V< zx+||H40u=Yo)o-`81N4M2Z)98@n9MVoe|1EMLI%f;bah@2-`0M3TAq?5Di_x^b9DV zId?IE;#~n>9(B$UV1g?(a+-0TA?=S3qN^?fNH=7|Kx#*6eTVF?x83j+ZHH+X>YM_a z9xBrVRTg~q@4>|WwP+q_yEv2IqW-qky)OT;@ zxkLri`~>xA+juq+$|u+vq7nlQi~xf<*1Q>%_gv)t0sS&cVGj(N;+FAj{t#R%EO5pC z0=)7&4q_*}w;ghm$DxIA^B=UdjwHNyRqV3f9=7aj7_ZT}h`-6RdEO-XW4fT%c!Reo z=Hk;zZqz4CqHgRv7*qqB!^KtzBasX|MA;N^-|YEt?k3EFibeo#Xl4=*)C#1Gze2p<*tU((YM}9V_uB9xv7Q18$e&ss! z+C>+$4LTke$2ycPQV|W08^q;P5;KrB5YLt{+(_olhEmz86-=jYjVFMOxth2-EKYbF zq|JwovZ3>o%{msWIio1@Fly89&7G5s+h?f7NM?IVkn(#}?a9|dGYrs#3c3?!X|UrD zkj0J4BmTqIsS8p*%t^W3Amt;BltI}pTcaS~4^*(1Evdqjgh#!ju@|9xpSM6Gufp{0 z77G$s&nL{v;^aU8GRIR@^^Bk>ZfK@q_f3%TB$~F?F6ze(u`z~~be*os?k<`G4e>Ur zCxfXqxB{H1oB4~0aCNe)=Q!6lLr|!o`yylIQ&2W9S%P9hb%UC#mux^hGCBo^7%YM5 zsq6GZ43Q2gaI0s@Ge85gkgYSc&U2BnflLjwNnp)}WD-nOpIw0a0AC}Nq*+j+bpQfR zktDe6K`ge{pfT;Q7$LZ|QHK%rDX1?YbKz#cOD%eQl{55^F`H@?wxZ~wnkzEt)zaSN zk^nVHYr8Q*JQwa!Frsv=8CdoBBG8Bs9`lRrB7 zTJS}&!6g?x9$P~547#IxY?1Ly+vm=SBLSH)Re|o z^5d!zjX|)gCBlqA?`7N#?Y|7+B_lkzj+N5e#(0=zCiC^E-{e-sp};h@K_;~H?T2d6@iA{MvQR$kabvJMPik~=1-!Z1o<1vC0`t;UfpM^%oNA z2s3of#c846ig2DJY8BmLr1b;%uc3wWYF;{$ky2+*Djk&s-?2!My8usq>4>CIuLmkv z0t3%4mo6aP)8A1;WUMVGp4|o48WC?h@B`Koxe{JMpsAs@)AhC)3=Hkcjbt(id1p zAM;ZCnNAgrmUOOJfoy4M&sxVzmb}(Xk<={@ZAtQ<) zJxIhkst$4jk;CUSL_K3m?;u*J58B33nSLX=nW&J?_v(`fei;|47r1h2-lE8fzx3?9 zQy!lfP+ZESA?7gQuX3i+7oXQbq*hK7{HO_s!V#cWPG$==8)L}N;) z5(Mn?mUKf@?N`?8e*D}z^0K_e$(w2@}X1JcYP`zdO}KKd_;_o(FE zuXvA0-hGPq6Up1Ec-tlKUd4M@^6tSw<2_^Uwd{4DH`{L4U~ zj0M3m|EPV!4B>SdI13SM8{(+fM(hYw8@bPh6GqOLoXmKF?G^LGZ{+>BW|G%RX-=9E-)?)AM+(c@lfq0^~6OLm#NN6_%W_Qc4M0QnVj( zS}=OsVEuNtl}>b@OkuXF!h;ADBV!pm8=@183Vw*AUp%&X5zgzn3(}lI1qpAFF`U8W zam5BPoM(u2(p~`2K;Z!e6K5r~X5$S#Vjy~Mf|t<@;*TCDnn4Dkq5^4=+?(rCk}&>4 zIcY8A-9@+x6Y7l=xyi@dAT$vvvMCd6l5Z7WsFZxaSH{5w$!khJ{Ls7_DN0u0;L+E> zKGm~Nb?npoN>Q5RJ)jf~Dh(e<3f)DI{=A6h80KI}LGb!HyaX#`i10wSEczHF@!YIy zS~nkG)M*Qj#9w>xKk*kQvM&JkJZES{>?Ud<$5Mv)UB9{?>59j3v|m9t<{}dY%f1z* z&kjcSM^pE=Rq_5qM#gGG2Lw8DbznK>%EurtHx+n*?v578LnT66TFlGJ2S<7K&+8^g z9@hKnU1sgBWoT4<@w&CM=$O1)tKj|f?4P^20FJ2^zJ}(rpfZ9q1=soQ_<@au?*M)? z@cX_}+z>sS85s&sgueRd!F2Mc>WzQnMG2`GwPcZ#u9c{PIn|sZ;%6G zGQ}pr!CZjPmxeWk)FfC_j?$V^9wKv^F&${ZwCyD)7 z9uAt-F^u=TOxOfgZzpsc61L%*s@_Q}ldhhY`224ht1g)Qi#)=jC+} zrS8BSyACbLXY@H1nQVh-{oH5Br4+%ReXF>|p0gG2aJ(FixFY~JNj{a`?C_?)(sLRL zk_xgz!KAz$SNN_FmOv7RkXDMbUkhN^QxRt*$4gl3u%1=yS`;h|x5Dp2C+dR{MYu8M ztP;22j`yYP<=kg&Harc3nKGHbr2DLc;*;PuXR?!LNM;F6B&6_!RF(ke$CF(=A&n)t z;L&Z+NMBRvH{_}#5m~_qAI!dP2wv;h4$!APmag*hgYEbEKWKR{%Kw@*d$@^n*mMGO8$Jl(A*3LsahK`$hO$@O&UtzKA5gUwne{ z-eb!?p>Gwz^GJ!zHi^`In%0=!AlHs*pJ4kFhE-P+o{?WdT9E9I#kfPLEJHAo0Xiic z-J7FFGSiO3p`9&yB%KAw|8v@LvdDUgD%*kTGpHF`6Tq;h zgNSD$W1W;|2=c`CKyTMil1zM`#p}RM3kadwdB&1%0C(~z0nhw+n(G?&542q{*EJCoLZrK!enGmw z!>`x?7oU$C&UCQYy@o`*R*karZ-(0iG<&bA4B5_uz!=g$Ge%@vRzb7#QO;w zNQjd}T!4Wm`#-TR=d=$?p)J`MJmh&4F64{g8sGCvs%`O`@)?!YOYl=2L`GYWpdHK$ zwSu)xYnn;2tRchg7IXB6Z=^Qo=T5Ztr^EJ=NUSg5*?1*7A}skWDn_=z$hnsZA}PnH zwOR|dAUg!)lFPJRoJQ&M<<`&GLx=QYRwQdRiTvXRM3Pfn-0j84o*V0^5PAItGYyjne{4We~$AH+ytdZyFY*K+k z;x*r;U+@}|m%+aTJa%xc4GoVI%7-CIj5~wZ5o!L!LSP0%zWOlnG_EkwWoDwJ2>crk z5SuA^K$=N&Er)0=4ON4lEa#9B>=mnhM{Rfkmr2;RdZGMxs0BJES8zyV$q1Zk-QEE< zBrI8palz|yR zLrD7x8bYqw4-TOrbYckMYg#D(EwMi(+<)SLG@eqB>bHCpO0hz zF=H10{mzcL!kg7*v_~B!HZ+hVz$36!D83_-uTk+GEeki5j)0ndi5-wJHd6yGgU32C zUu_K_jYe#6Z4I~cO#4tN4jOSBUe>#!l8VuB+JI(c@4AlMHeztT_UJ*(fBz@ZL+Q4i z2pna9k3f)*WDEg^8&I<2>;c%Q``aadt>XJc@gI@=+ZF#&$=^^GZX^icDYXP{SZf)e zTiN~^dkcR9t9Co8we2iBO&Lpu;KbPWfevLQ4Lc3Yo0fs0xS>~m2kkO(pAwf3$drk~ zG@8qh$ufeBp1*0yYuJWR9rs$(cVN$`)8%bQ*A6D)Kcx6hGj1I%pb2W;9R3C#0`AccMap^^rU#={j_3K;QrEXzx=wM-5Qe_{0fyEKaby5| zdOz*fe%6}(ti`z^BIu_c;{Bw^fO|2%fg@oC~(p>l&w@9zmWwAAeh*S73{`i;M;O-vOpF|sO~%8rei4-vDMtZGXhziBz#7u?Rm z)3G?-l-X@WePtS5^e#KiKHdR^@=fD@WPBWs2iI>}aKwmy6X%gPt-%d-UehIIpGlXZ zXq<`)m2^9WMkHx48J0sSrJ z{<+ovL?yV#mfynO1PAlaYGDs}Bb3=vL6sns-ojq8qosiw96=50JLncXs7Zyq5-&lO z^AgmUQDTavL@b?awiAC@Cv>v1w}PyGhXZL!{A2*_5v(+I_w7ZdMaYEu^IJZ|-w`c; z!{6a8+wu4MmTmZ()$#%UW-`rqIzq-Grqd^@YT>Y9{KPp6uA?E<48<)3{J;ut4TPHv zGFxUc&N>J_ka1|gXH?Tc6)-8&kQJECjP-oyFmljBLngxdIS&NTe;`$irv-;m2dnwe zvC2$NkIotUc;s4R)=!2FD;kvt&Hlnvh5!(@ZEAOsu*%-HyTg@Fea2kIX3Tv#sU zdHVI;0Fm*{IhKB)b2t~q;4_O6E|dKR-?dATrt?ji;tn4Fm+@D+2yR@Ze)!A8{(Rud zT+{MD#$Om!K(_jShreC_1b+_n(~7^?zk)vp=#J>`Zu}~2V*p2$LV2c1j;<_teMgKX zlQvj9WGB~oHDcSBVoeH;YncqY^gKxZL30Ah7*i0UE8;x_IwBQ^p&_AEK5P0ZKF|;w zw98Qku#6YEY12YieNW>HiDZAqFKG7=R}mj374e0i8aI8}o|im1{pDJ^kU&L+8x*(! zZ6|5zoEE9^wm!~$W)jYw37TC*af^)WqqzRw)IeZwL#0T=83^gPKVcon<7rmCH+$%u zJyir8D&9lbwjq;xUj{iZE~hh6*eC@&AIu$zeHwou9xlz{Mm`+~(c3u0Qs9p;AgjEI z(dqOwJ2`gIjJ~X~^j{l|4x&9{-kr0@nTL`@H-DmEAmmy6>ii3Cm@5zy<2KH}zKhNB z!1Tj0*X|zm5*zRV;Zxn#sS;{@s{=;iII$dvO*jfqcHo7R*$C`XwqXJJzt8 zR$IQ6(a-O7mKFL^wUV|3H_X|=;@kf1$Hu(GiN==-d@3fAS#K(!& z3A+W)+MGoCl}I=4j8eX1M3X;Ee7EkKR52Hu8d}0A=M0qm4bWxXJpscSDJ%J$nP6@6 z241H@Gl{jX&U-Ye&U*y^Kf(WY__@WYNN@(x&keu?(GQ(Far$u~mW)(G6~)dK;DeMj z6Q24|GPce0M-X&-ENvS^(y=?iawyM2OP<)Tq0eMIsQtgkgO;LF@SxvwXXnrpRsvYE zeh?P|CQ`zQVHP+diHlg^s3evm5Mdbzo7T;;u_zLJf40DEnB4hsjwfC6w46dK+9Gv_kS{E#+qzq=Am(r}Q+1$`Kx%O}%(&UoR) ze7G1#*S8^w0MCO;VBnOE#48Bf>Rw zb6_?;vB9aJONjdTbR66XBC*2mDnb7@2D@HHbcL|_rbioOICQz@VI2r2d zae?CbW}KZxM#6^-5<)XfcEUX9r&kHoi=^|!24TRWL$=1$4izMnJPM%c0E3KcP0#6g zrIi&&&)gBCkNwDky{96^;pAXB3Zg<6&Ih0fHWti|rbZy+LO{^*{J_Peil_BkOn!ni z?Jjhl)7FnH!)Wcp3bdsS=k!SFQ!V*457Mius=RaO!kg)%Gas4#D0y6cWcHJD=FXfq z5AH~VGZzHmXY8)AS)r%q!6hq_;Ady%V{ln&^~?I5K}q+*7wY2=&C3eTo}KmNLr*=O z#oU-8n)T4ES+n7obtXz?JvsBq*>j)%4$yJu{~_*c0HUhWzh_{8QK_L~i;Qa8tTbH% zwGyKZ!BI>pOeiZ^LItHz2xh`ebZ|iD&W)ngTKjf4ch}lJY%{afEl>l$w(ui^1ivD6 z8Y@!6uU6jQbIv{I-eGXt|Gxiy-zmAj^PJ~A=Q-c!o_o%7gnid3dDHB9)ACB3g^%Ui zVVK4V+0MsH^1-tWC2;~@WwVfft-y3w0L;kQYdM>NK}ik{IfQmV7(u zPHDNDn+4_-%3e}hJQX#Tn0ex;b__N>kY8GCFUp@a-8sWRm-!&dOJ)IzN)LXXdZ0yR zU}Skac2*f`12;!(sD))tp){`ngL_Pr)4>vT7n%-hAXI-vJXCrjEYclX#OLQdk4`;F z*0QstC~s=M-8nYHp;g#XE^byih)8v^v^0OJ)4-`^bC1a@OB*@fG*)Z4 zrDe?SbpE3*Zs=O;C$ndvFp8(oDx8BX2=Zj?KcfT5F6+5o&KNr}OX@}rVsX>M}TtQR@ZCe0U5xWCIb6E4=BO3_dhG6~Pj>kyeT< zE5v}u$1c}YF^cq9mkZOuYMbqpvwQjSZv>2lgsmQg^Wjjkrsd`Qt5B9OQYqo9>~*6^O4RTJf=`4a5~1^9`cGs z_j7qwKKu6T3I^HBA7_tJ?kXi$Z_{+{n$G>EaMu*>CvwNwu!={IE|X~@hcP?#Tw^}n zb4@3TTum{Bqf{y&&KoilulA!oNt?DI@L1EOSkFOsj}X@bp_2z{2I6t- z2jX$uj(64jScn>l{szSPJ^^}w`FPTQaY-9;sR%m)=-13QABcyY zCw&(J-NJm|lD>67T;6S$iBg>cbT8xk8xWVW1&H%S#fjK#Ks@DrfrhgXgQag05SMZ% zP!jXa1LE>#15IMIYM>!Nk*1HNZwC<1jZ;8eO7!J|77N7VeGq5_mjc9Fz;i&n1$+#| z>uwVeZ%5|7Ldw+=-2n6elk!_hdjW{&0RqNX2*g`s6%bF+?|>#T-+CZk z=3fBa&S;%LJVob#xa9uvSh-}rVbv}H9%ZmqeQJhTyi@Q&*u}8_LHPVUnTfrfp}i^2jcREOWzdfn<;6NByBnn z5AlTbT_}D30mM^u7>K9nBoI&0ZLsLVedhu36g>&V<-I7;J3u@|nPND#3YFx0^+{U0dZa40OGosu7N!Y6ZK6oKs>fMARb48q|FB6IzJ1nQlKe7T;9V#T!Y7ecq(58N@XG5l(cm~Jj6yIuE8!zYX#y`PDz^ST0#3I5D$B! zqz#j_WJ$}Ev`LcoHV{wSW+0xnRv@0XS^b3M$AP#8FG<>RAg*bXq%}*v>#q}%9{}R| z%>d$3%7J)pTy#C|$zr*26%gkeDABDF{YIi9ATGrN#HIM8Z~P4+9SJ}@9kYSBWH%5G zyG+tn0P%FZFKJCcqnK7-N?N-_mtn{l!+Zw;@m#wDh{yH`kc0Ua55WD$3_Ss)X)4i6 zKwPWkKwN`0(zj0fZUW*u_q$O@83x3|CIfNb@sgG$X|sXGG7a3)*DHNrm9#%g+G!x3 zwmt(z+O7cNX*&Uw&g6w7dM-H@i0cxM2Tw`9OVXxEv_K*s5RYS>q-_M^ zaqI))njQz@nqG?GbsW?5Mj)oO6D$2%Q} z$NQ1w+XFP7X%GO)VCX05YZ)puhy~)3fKs>f9hKY3C1jN%(AZc?X?TMR(rXC<3cA2EDkTkk`i>GK85YOj!Njoa} zev-84TSSO`5*-HOacsO*_*M=V=tCgx`!Ntt>G>vA;) z`1?&X|62;g|`E13d%8N1==DLdrA!1Z^y4C|X`Y z0vzab=1Sz2s7fNQM0C=HhlrQRE>S;;`b#uOq6CS0zT=GDtuhr+$)80-W)tpdGD~t0 zK=RppGvi@Cn9#8nu2XISWd{D~6q;A845B;;7i~w^c^(Gkr69_DQ07{VJkNoWd4ZAg zXW~KW=yLuJ%8?+-PEhCxet`&YmAf`piH~gNO>HTS`@vmp%0X!Hy9}|g0d2`Hl629P+~Dl z(J6liWkwL?Q&3*QTtMg92g)vt<~pSVlqKjAbc&fWZ-kL@F(@hMjdh-DL2;vJ)hV=7 zYz-QYPH}*8G{s1{7nG`0K?%LlZ2KsFHxJ_1exWy-p#gUL4W3d~CP-A~w28I*Z*VF5 zAj-&8_ruL}H&1kTHq&%yD1IEeLMYWC6tc@CejNTWgz`=ZWv!&pU1>evR`z8u556@O z;gcJWi$c-w+aMmIoDHGSB^mt3<8qcxEqUBPAs8RTLzH15lyM=H$sv@Y5XzhoN>vEu zw;_~eA(Xd6C?AJV{t-fH385Sgq5Kd+=?bA-Koy7mM9yCkLb)k~LhHD}p(cb-aziLH zLnu!KQF04Pusy+95G?t3K|JL5#}LZO5DK&M%>;>b?Fix7A4K^UE_O%QbX-;Df*!d; zhvtzzQJw)|4saiRq+ zo;js(R=&WwM{u1T_VVP;!UhP=rf=-xUZ&icWzz@WJY3&4uv2N z`YsrZV(53v>Hqwz`np43H0GANCx{DW#nLA za2SEEMaTVdQ#n6#l~HXmxE~Mpe%#>Cb_eC=7S1fm#ouD>^2MLIu8&t1aXB3#XPxdn z_;#(uN}sWvxu_#t3GBCGZmMaVLQbtB@cN})1gI5%UYYRa>^wq4ji>OmXA9RsvrJ%a zRz-5@_C05@RxydL*A#N;)r4Gn9l>rF?4UGU^~ZwB8pFNy$n>hCUjs-X^a?{Ry|$1` zuPVaT{Z>Q0?hpsLx^w82i8%C{L@vD=k&EgOi!vAOj>*!s*Q=8uPg!rlW&tcqal7PH z7Y(L*Ig(ht;)(L_joS&~Bkm@&+Y^V}nlLPBXu_>G+wBQ<`tiTm$#Bapx4=K))%s__tW2%?fBca^a%cvloVJN=}ngF0+u%1cIDY< zeegH@#z7L70!gL^B7Uf0E`b>6=H**k4#~TIr&&F9i7-J``>_}F8 zb=~Z^+ZNOzJPvvPb{(EI7Pp!a>m9!!M!UHHcZon)U)Zzo95kz5y3^2e;9M`vLKXBqYE8ymlKJfCj4gTe!5kaXnyGcq6@MxtGq|=YsNDP%6Tp)(9Ejv z(*s;CBF>41VHF6yqk50?Hg)kS2tyXzla4v#v00qWvGKH~P$ZLa+Dp4TPI-@Ub~>Xf z$5~BoHNu$?l1GWSRr+5KL)8)9H?-Q7N4Nh`uFZRfi16o)8kQQJ_& z9qL*;GN8sX0;Ydau;PFR4E`WA?rP`<-|9|S{jpWO4MI)w$GD~gw>@O+r>h>CRh1Z+ zi8eZ#)NYGIf&Z1V>7A|*3fonTQiQ>e`%Uu2uk z*4peP;J2y0mGn`*do13}bWge!0mUg65)0El6;>oT7Mw9PnGbNizQ8>a=~nx1a*el< z#LGMa|D(vDnXqvkYjPGF^9VhM$Rj<2sQ8k(4IX9D3FHnU8_xq@k+?&_)mF-;0yX*G z0wp;!)%HPJY*N$wZD=gWX17f2-%{6n0jbs;v6Or(juohmW2<2H$I;O;vt!ST6miSUV-#=8cP*R0^zYm6 zZg;p(q`1ZjJ+h$(?yO{Lpp3ai&_xI*E&xC(UjO9Jqj@T3|Fdg8NelF0ykZ=oOD}b6 zKB&Yj6Ek8|TxeMlM;CICRd74ImyV8~s*e6>>8fK8Oe0fD>F5@vlx~@&iyhgs)8?H; z?k=0R08dXvD~=aWW~dqH9)@-Sr8Cq7M29M?>ulaz@Wf?rdmQ`QB9_T~L$2AXhLV?y zc^xFvt|0X%QUxP@rIE-Q>>fvJTf64IoVlCZzSi8oVD4RQhcx#k%-z(My|V3ljYO+j zdmP)^vg?S{wwFak8|#(F@dktmVZg>G?y;i?w*Ro`$J`7ncCFIaU&p zs#I%5UCWD9$55aaVId6FVmU|(RSRZwOsk({4IuCvVf8kUC9DGk?i4h}ku2!UHQ4Av z_^Z0PFEqN*ejL%wJ;jawjNPmZQ=Zf`+8mhp*xMZa+Z+jPj^S;Nl(wAxZI1M|oFi11 zE=0#c_fTAlCk*+D61ogdS$uuTAMMz0D@4ZKRLHa=KykUmChT}syGXeAYI zD*M%uGrXxWxHiwT0T&sx{9YUyyg$mAn< zdFrf6>M-@5;r071JVkV|w3uw8XH`ZHCj-!!rPDVOrKSFW1vAmzn4`m@Ge&fgM7(-p zsD6q@Jk*6oM=K>I&>v}~{3s!^&fGknDNUG0jiU3~(xO0q=v zJE8utC44r&CRTN|AOB-lNQPWec zfoE&iAkSn?V7aYd`px_Tf5GK_C_q+9!x~2>fZr5Uj#?^F<57stx3vnEf&<4H{3Nkn zhaj7^Wtzof6(J)IZJEu`aIdeOF72-9r@%-npP^;!r=gTAPEf^r1W%Ul%1K^U^wx&A zFlO+48*bp$)YzshSOyJIoiaArs%}RpYLLnc%R!_m&Vm&HxQW;6TSdUp>Rs?Y027T@ zxu26w^+1#TEg-!RwbT83c>AR7+q~NlTInjSWWj7zpWq4RMvE7KrV39jz!O)&;_A-q zroe@@>aZ6`-?XHh)_K!whP_N|YVr$)8mF8@M-skjv(K#U0laz;eQP~Q-O2Z!mH*5I4 z(DK##YDX;Q+u;kSV;40>@2)T*r$#{^@sNw?c72TRfJOc5E(AcPE}&;f57^qs=OSuIu4TdwTEerN)!U4@N3}-FGOd?IpBko;S$DZ&fsR+`+r95a z2anE)wIXQ9x_Muk#hYqjy)Sy3_9S#;Pd|>sm?$`ZhCDiC%o|$X+k?!gi6% zZ2n18v(VB(o7MA|zuTbkP|iYn95p9;!)d1`vI!#TO{R{X=z1v%v=HjP-U8I_O;Ju# zPsfr=Lk(Z>z&n!G0lx=MwnSv;p!uyTNQ3By8Lx9H)&BkHX^t;P_Zy9X%z{D;Nuc!~ zh!^&d(FZQx20D#Li#HM=E2X5c&(Z8<7s&Cq<``Ndf&`H>l!NHnMZ~CfPRb^z5qjGN1*RS6~w#u~0W&1`$%MxR)`KGOJscMpVTx4(eIhCh+- z#&rbbE-EbLGWCv>%aNo{MlAJJXFHNixO1FX=(FfPer`h z8I8XYxXGy^K5||RvCcEFf(q+N+aVt)jPcT~PvCW33gJ=nS%{Z{LfFk*PLqMEX7oc6 z*-a~*V+v!O7plLb6;LFk`X#1(e{}x8>Rd!bi?g?IL|aLU*EX5xP@oTXiOU zl%cfDJJI5E#Cg-=eA)5diI@8_`gzCo^=0(;j=RE_VfT)UXBMc)G7Q#ZJJ-XU2yF&w zNV_upW9o0;4fh;GbTDU|cBL;ZPB{(Bv1wO{Y+V2j+|IV}1w4fb*#;#oTHLwJ*G)R0 zvd|7Cs!YbPMOt5GNWLa<;eDDPeK8kd{Hc7LqcEEcviu#IwZ}BpHbkVgP~OZgQh(RX z?4TL%jr0G8kJBXUgfWgqJPrzrV01G#ZpV$Y+Md209{zOvVOCIP7;@VGA`e5d;*9jW zIh~gTrIu9{3X+nc0~#=7k?2L4eOC;Z7>{-hEa*k#^k&L(aJu7nl#NW z$O4#gC6ZEz=7?A~8odq<=DNuUis60H{Kh3B6KTEfuf@LkFgX!LsU^m^Cr zjc$5fy?zc!rdQM|Hz9g4HJu?uFQZ2ojb2U?TtuUcc<38Kl)R-Q2+^x$$z|v>wnSKw zUF;J=ZDt;Z+qFZVLLs|?mbil_pXks$!aC=PlX*o7DN zjxxI+kj?Bn_#j0m8;f?8KcX(Vr!1lBgL78zT{dtVQtplqpdn z>@al8T;5`dY`p|+w?r@W7PMs&eIikdMBhsk(MN>1LZX`_8ZA*c2HYE29y~3PABg8r z{|iK(z63Og<-yxP+_w&hhusRq)7IxgLGu7{zPEvR$uvpdJwRG+*aTlZMq*niAJTmr=Tu936> zlJ>Bql}efw!#@uj1H{AHC9S`tB}>{UphTuimZVLVe9I(lg{1A0v{oP<_Nb(tkhD2* zB8PlHLs=Z z(?gYkGAM}hBq+3stMjY?Wm*vBLr~m7lx?8U`=lPK9h8+pl+&PW3!;z}L)z7#hw2ZC zJBZ={Wfl5coo6B_S;#h>k_Spv5QU65z8OTR0HryIqJrW@?a<}C3JTde)G2R)vMq>G z4+@=#(0M)s4sJsMI%$k{|8n?7llQc!y_C`!|Dkc=ogfmg&@OYisbP zRec{b@#;HKMMyn0Y)&t$L-5|z^X(4}*$As|a5Zce6`MbqaN@|-caCa%Woch1ELqMf z6FWnHZeQron-hoF*^l;xqC3U!;@&0`ju7EzF&ldcqRc>_M%b>)?nhy_BGNj;(KLB1s=+-FbZi#G%})$k zSeh!+iy+Jt*u>X`HTmcWgW|*fQR#+icBU`;{*1L_TGw*Vwwhc|sFN(%mi378#mRl1 z!{JH$9t%_U(dzoUh(T#e+>AInV^T&Yoi06=s>>Y4UaUHGyE=+M9sXv6j9nNcN zl1C)&P+hc6eKPiUsY%C5PlY==!ZSM5?2e@Dqs|KwcXYmRW zO}7?Qp0-$>H_{`>0K318f;Nt?<# zY^!5@v6pybQlQdtc&?>yQ-OovK`92ll|mEv|#`JrvkcD`|6jTU;Nw=g@5} zlMuCXylRh4*$pwC)8@xgYf2*5f{O27xZuwh+w8s6m(^_c-fPAq%zJMb9^u}5!|||q z@3r6&;k`G)(-4`KwAIz5oKY(}8dCct)L6#iI@MH5Lu&7EX0RF-$u+fY)wHdXtIDs#emU~4UXrYHoj(g4YnD3mix3ndImp@bnRlrSWP5*Eo579|qaQvR9$ zmym!okd_Za%UIH~pwel-wCFl721jP67Rj>9VlZ4|57t$C{jo9B6atM;U+^0 z-!Ael4ta;1V^*>e`VE#Jv6HlDehmB$`ct}h)s%$mB?VoOeiF^gieliRx4OO#yoNBm z&a=9OYSp! zHEDbKH-R0*H-`8&fp24Cr!UTzY4OH*Cs}-x%)ZPBZ>HHhDPlA}q$mAQelYL{aJ`b) z2|d9VMtouL3y0r#frao}ApCli5lJ%q526sXJ`+8ZlKBu@(w>HID&EX|ZBHb%>Xe6M z-*%q9H8rGfwfEGwvd-Rw!2|iH^|6v9`q_1`5N>j()Y+Fkv_GacvngR^Nr%;&zN!C; z8AsxlPHG;$X7(vd)u@gAmQQPsU6QqH*ed6V=qJZ-8}w$;(fF4pw;F`6=+fuz-F?gI$2u>3 z>aI@*zdh@_t6urd-d}$-@0_`EWc@Y2&pU9@GZVHazWeA8y_B(=2fSYBzx?_8TarF} z{B%UMBU9x!M z&Y|y>9q*%#+dA+sj|8rG@xeW}t$pHb)S@wsH~e|};mdw^-xs%jP=3<(^xdD`^iJ{j zSHGIO?~ae>cbQV$bupQ>P4m*JF{R7dBja?{mAaFZk1;TOM28+51l4mc9?X@a2sUzwyn8Ie$BI z;ayLCdev`U**kdF+u!|q-bd%c(>xn4nYei8wNqdFYG~Pe$D_t9YP{^e-+ghz^gkcI zwfuvVea5Lx5V}vHY#hHvuermRU3D;pNROybvHY*^Ig@?{_*`!KL7g1$V;!kW%RuT zk1c%ePpcbtAL@*{?1o#%+&8^^(eM8JLE{&PPg>*p4^N*oW43qciZz>>kDTgt`GBOc z_ZL2{JpcNKn_K*+d-uI@#GMa3JjeIK8-LsK5 zD0%$kqPb7L^ya#4tw(>l;L2a!o{=-NqUPnd{{D})Z~uAWRfB(h*KcOcd+L?9Kl*g< zcjs(Z-*m^_xyAFJe)XM?Kil_xS0#qBzUajxO)pDC=Y%<}$F&MRznqFd@`u-F_G9mw zGzRtXy9hMA3>)4@uZF9C5G4VwQ9+bcxM+2PNyd}g+?X3gnF-gjAW8*XG&t*_o&kYA zS?QENgJKV&tOF%@&0{MlbUH>4)eOp{Ac`Lp`hm!1!|Y2LbLy06$`kz4DYS9=%^*2L zK#2}ob)a3^yMibWg3=L0DF@{zNiojW;eq${e9Xc5tR7DG>*1X~m;qe>&gpfs2OwW_ zrc5u@9cATtCAzC5Z|WoXI2B9?W+|IdSfHI^WN%mEdqOTdniv!qYx+g`-Qvn+CNlL1 z@FJX#le;}rXBN*Y=BzlZ%Q>Y}*9v~5HzyR&%AZnFLfDx%1*W5O3yNK(!4zkCaWDbz zVYv`OcGyes#;Pj~Vo+wWH*eOY@Lgvno$J)pW5<~3O<(scaT-#dH*K1hM8x&j)Y56< zmG5WI0uC8I+|GacJ0HE%VaXG}h>&+aM(*~f$9KMNJmgIIpPU6mKILmN&UKkg)6F7f zdS??_!$TwOp@xSr{W~?BdNpWJURW%%_Gj}pamY}dwxpka&hix6ITq{i3w@s+hE}u+ zK5pt7@S`5`zmm5GTN4z|Qv5qYU4-F>vZ8aAbaE1t%?0D(jeRl^o4fWG)M|4yu~#XZ zHZ;&S%W+xQK5?%yaXdKF6c2?_(=y>0+?bY0vS~vHJ;l}uY+f2p&Kzue5Sy21Ud%Q( zVUG(FLD~gAXiOWwhQM+@2WBTaF-6RR^l0o0lxJ}?-T2u*7mn1#sH3xJFBNunu}h*T zowT7!+g_ct!5IfNXxL!Ki|AT*){8Se*d^^WS4CQ}{m!apjz_j))o)9DelJCkMKYp<3K9Zu{MUsZi6BH-;aPjs6*uQtu5+i=u_=m-2 zjO{u2i$!MC!fBGW5QtiQr0Hpi_5;y3g;-Mne|cD11>xvX(72ShfM`6AHPPBVmZpJd z^+Q8FwPR{UdNW1{v^?{L6HlF9E=oJT?`b0g__&Ma>EH1UkhY` z*=n>`mB6__Z&z;{q zB!Mq5>iuE=!T4^(QWDx9T2Q>yA6l>HNv+4@|3!b8iORSJasQS+uHr}aPU{c(YLj|r zY-N2BmH`VCt9ob5NN;+WdS|pZJzTvL?~E4pPK!4^LcQ3V8Oh!`(SM-F!M4W>X_x;3 z+Cs?aiFLtl#)oyzqA+?duBD{w;fan#CD7|a=w?RWXr$A5a;s8HTO18C*lRC#=+kTW zWI;EazxJH7I@!KTh?2duXIxQ?@*XuR?Ep0N3<_hLf2HSK)Vx6y`ZjP|mG@}+ta0gombpu z+0Bo<;dq;KJD6J{MnO#LmX?TgdTzievx-9nYQ-Vt^!r#X&S-C$*}f-df6L56*!Qfe zBpF9^&5*PA^xpM2NoMp$gz%%7=0AtyPT@F67h+Xc0MHLo=D>Z8kV*79iYiFKEBD`P+=80 zlxnPr|7o25&1a#0MeFvUD{U1Ib%Mr=CYAMyhdL*%L##uPKos(lby$s-k<<%XQcd{A z(m3Dm--_GJ>EHz4KYavgfpH1yW$_^?qcwnvMGhPp>%wC6{2%;_z|ZH}{0s#3^qn5Q zF+aj{Dg|dJ>ul9eL5ywnde5n-$9j94yo;}cjKDQr{i0ECo(g}^khP#6)AZhkOY*lUWs;Zlvhs#ByG_m|m z1#OKE-v_h45m=3f+>`X!4%4)U<#E_ zFeQc>6*5C;&znIog*Ch&9%^F2JT$HaQ>ZI2Qfgc)6xWguV@QRQ%HHFDR41mWWuw%z zbj7hu^^7NW$MS*?i^6bjVc+pLl!++{yj{zbvUJt49Ix=;csEAbr@EFL|D$K)T>ed0 z;%Ag?g0`xnEs8iezWE3h$Dpcq zgs9$(8JX*DGU$?pd)9I2j`|MmRUPvy{O}>WALZQDC}SKbL~%bYawN&7D9 z;(nx!p&QceFGWbVO#h|IMuY0n)fJf8d<7A5aSIJG#urbf^%~4HQJt1J@isVKu^4%FgWqY_n5fK7VOVqxIFBFx!JcD<-o z=qco?iz=sjctV_G5Wqi>mltj#rvzhor1u^Ej#Wn~(i)5ZQO>8bO6}PnPOno{)PdqV zIjzgdT7|io9Nq{z^#P}c*%pNneT9fC%5%zM ztNISpvA`0}8|6|tuf?`#H|Tykk6Nqw;rtVk3Rs?KaoVciA=*8RruR#*F@+ak82##W z#wYGkEibV8z^zG*K!CKQz35}g4~b4ff5#leuNoKGgLA6Yb@N~}Y#S1$^$oR{L|m0f zb5qMlqMm(?>E9U6m2{^35DwKcs|ow(?-Wt+K15qHt)jKgv z&5ZU=495{K??j7=ukjNjRFgL?Ql9w~=}hK^mpVt!KsGL>N{Lf!@pyKo^}?<6c|hv8 z1Wa(AQlNbz&e_8*fYJ~c2wkXs)69yxP_2Je(}p)%h9h^n5NfoiF(&ELicApAr_>nF z8Poi2w(1>}3#0ncfI`n`dO}ZDEmJI%86ome;<~)KD{<^x_0%C48jw?6OX~zR7I%$h zQBq^sH0Z@-s-zArfP>X!E?~+9N0M~-0te*ITa4uT%%{1(Zi0Rld;k2 z7%Lvups(~k9 zZL3GeBZ7E5ufQ`7&%SuZ;(0lqF?hz|8Lf_{g0QNQ_-heIJ=M|H6=qxYUdZX(Xth;$ zFo5%{;ix1lkOKPlu)<=izKbf&!a8`PfXdWYWC3}SHk3_8pFjtsHQjjmOw`IJ(lxL% zO)sA@tbCXykZ3iHmyaT)%kqM{VL@&7w0kzz>){Gw2O*V3~>aXBvS@;ryL#gDJg-baa*0PYsBG3l4 zEUe|IU(3QLIf`#t=;bK3Wg(69;EQfq=;lZ&;m?L}x!+9d3s~`>2EL41idsf#*SQFdH2&h=Jxv6ub-T7;EExo-|cg-7?*hT%& zUga#>fx3{!fAcAd&CqwGQTOu-1(@Ha9H&l$cVzUTLUd$%l?{RZR3p0gW20q1c2@!u zw6$WqI@-{WRecIEsjjaO_-DGXP*HQ=#|A1xFD6zGWkW$vR{Bf-3dG>)xeu~=RCoq; zR_N$<@Q!Y)=U}AgOqgp!_rC70=kMzR&#`g+-|UrHl2CQJ)VmT`tAR~Z))#I-ZAeBn zaihejR`|b0C8`PT)hh3rVM58GKKO5djDlJ+BFHPu+-?b}0K!pa#|W{X(b{=98pom$Un_SS#h^+nzv5|`&0@vtBx@!mco-S|QQ$(oMxv=# zw$`LQ(4FINm@63aEvCEw{qTp)#!F4kA^1WtalCnb=fx>hAW7@zcc6^?8DOA#??p)% zlIpjEp18w5nB-%QKywXcLxY=^yRq+$=6`0jmM;`zj>wiU3mX5^B_lo?Ve2hyl}eba z`fsjMrK8sJv6J4#O301~6+(7A3eM7KVQ(N*%Jf!CuU!g~EN3^4<&ExX$gz}E8xEz< z&=6jP1qZzX&=wjs+fEgM?2|C*aU`8yhs8Vz#vhnJl^jhpyZOUj3F)BbEXVvT5MEH5 z;){(O5o>n#t{hiH`+j_}W^7aRtJ%vtQ)giuq4y4at-*jh0w08YVIv|ayse6QM*2d8 zNk0|$DyUqOvqDZyG0YjX0*94?5$Dk!IJ1`vTO>RsrK{K=>vto+%09`+BRVjQvJ z8LK^6FWIAg75ZR?B7Oy`>-*^Eq5v>IQ~M^?1uUq0DZc2)5nhsItFFV}s?DyWA;uVL|}FbR5H zK5D4TwBLiq*cx7{gHS&_8;jWVy2r4~4Pmud9(y71VU264e-f&d$OBqS)bq?b)WY+Q zwM`__wZxbJ(NvMU=S`&KN#m(WlP!~JB+50!m!(znT|;UlZl=Cwq%UR!l?STl>-d|3 zj^-$N8GFkO|9@)YBp5RiHBrw~Q4d+G@uwK_p1qr+3c6xWV#S-1_$`vi zCQ`_VV<)=0PBz$C(l_Dn$%YjCb@uKYW5qO-cBGtaKp=!7L$r{9zqab17$*`Ot8 z*+8jiRZjA?1MHtyEg!Ic4gp?2+SN5$TRYfYYFs;@&nruWOtzvU9g)Zv>7XSM>BuxX zZiT~G`=Fy#lCAm6U?4}HDg8z4JnlWBhYGV@19lkxZQ9VP}o}-Ziih8X;s8N z<#DppfM6l~<+!3AM+NQ4x7&vfd8DTx=MVGi+wDVczNN=7X~i>3aFnr(Y{&2@NTDhD zWC{gzSZ%@HD4cJjqzGFT*qQ`m6|mXiDlII76&Ecn(jP|}?HUi++0aZ?B$(3jX5D~` z*{4mjXO{>DenULF*n@V-7JQQ$dM?69(U6M?Cp?rA39N67R-&U4os;MeYPF2-RUj^9g+wcXcq*?zYv#UB1Mv`_NOW4F zYkLXbR3IMWP9QF&K+Vua)?t7&~H%T;7qKOja zOH?kABGHQyy(Q74J|@!uroj_HH!}2^L=8Y(gZ_9O8OVG`15IS86zEqB)k)L=#Pj8p zcW`GL#E6j-gs0uFF!OiHv5yT(pl{B>EH3c;@>d(7g=p0lJ%^a2$Nf zVCY()yBN9==mwxj)58+Y2ja2$fbL;@&ja1h(C;PR>ymGkQY_fH_6 ze*P6?GiB$xfz zE`P+=)6Wj#aQxHH2HXVKLqQbkNoEI83gM~^qAY@IMG$2fTFP9qO`$9J0A4d z&w(;Kh;lhx)1r(#13+1cQCAN|vm-0UKAmzeC_e>Jrh{U^$fonq2DN22BV{2dtwEIE zfs%r8Ne@M(=?$WM49a+nFgnj3P?p3BN^aKRAvYskZ^m&-I53v#NY3SghbWOK;WyDk z>2j_Hl#fCvO(B%SA(Wp&D1CWBA|XQOAt99X zAWH7^na)C7XUcyfR9+Ad`8^s!afeW7-p+qQ&ax27$`DFj2&E~6vOk2<5kjH0rr_9P zLMS(cP=<$4XzzcpoJk=RvV$DVGdqOh4WTRzp{xj@tO=oP3Zb-xQ0OLIT_0TTneTjf zW{FNA)D_H=HwBhuIR~#TJ>MMNE5gV_I5vdRKZJ5y2<7e&N?r(MW(Z|Y2<5pD%3ne# z^&ym5OOoin)~9hf#8 z?II^F3ux@P_)1zp28p%v0B6f@YSkZtX7%CnBx%Yce64kGBjAZkZj}^9Mkd@>KH8e!C0NV zg_tXYi>s&6v3M*D8ntF?srv2JI4jTD$cpr@6I^p*C9jiUI~*gePscWEB8mTY9# zZ=u$*zfj8^?$nLCakp-CPGgssM{~DsAWrj79h+s0PB%%%{dMzr8o#^*S@U;H(hBc9 zw>5LNsbuWi7>|C*wF^- zbEvnXZpheIutjT0>Cq5ga5d!V4U*4EtW}W3!)`_pxoRR#<1N!c7WPOvS+#mFMWLCQ z&<#rP0BA=cwkLF364WS&Pd7C|t{{sLXcj+f;v&ST1~;Jr>E+Z`{@v5L!x9qtpq^}TsMM~rt&FZ}JC-rGB-Pjb{_4~h#lqLeYX!jT82 zooJUS*&W#0`wwM9;*P}54{1`PR2;>9ULDHbz{R!Rs4D;82b_vrf zT+{1ok3TGMSZPqssuf2)r(uBZ8~V`qgSU_W0Da_xwS{`Ot?F}N)zRUN^KYfke3IYd z+U5U{^NDg8kI&~gnB_~ix=&-b*gi8}dRCu4*+{Ppw(4d$ed)bytADVqejr@Q*`*vG zh(9^)jgD>b!XD~%#MtO)BA4ed_746Cq`I~#u66Fy*x$bubQPP49cz54;mO!T)(ZjL zr?Ew>4xqtN2SwM=?w))W4tJfcQ!92U728hkOYBq~>jpZuDUMZY_PUc_D%mS>Gc3~R zvkYyp3^gTHtg}7!DuU65N5@7rdzG58QpspSs0PO-=glDf%Gq#yCnv~DXU))x)!uAxMz3@d3^=53UuA9FFp?n!lJG*$WYcuM2 z$iPPTX>328#8h1eqlAiU4ONNPSsrY}UmVemRx0XH&W??VJ5C}oP%Nj;7oFytoMu)> zJ=?BkJ&Rj|wo!7LlA3H!bs$jv0jq8GPV;u#2b*z!ma<`B&NihH8L&giSxI%-wFzlB z)N8kzvq?F<^K7p#v5P%SITnr!WL-^W*UIn;T&}e;JY!qZr*n5GO$GHw(7ZOP8FgOE zt&0~~`jY$=2Y>VjAvbg6|lxtr@v7(gCN=`GCaM>vuQKRkD`5%BT z?$h{~Pe%q&5wiWqh(8DU8mHvc(eC#NU_mXYh{jH3G&p3ZFZ$L7%dIAsk&}^;UuyX{ zZz|4ZC>a}-^#i_C>QA;P8QWML$XOK_T&w0#9r#MgS>wxC!%Fg2WLS1tXZ;Kp~aSOkpE^p4NO5%k^V-}dKL8- zCFD9n>#Hy>07IrbsDDW}_qX;>4@)&SBauG@$f7Fvo%4xzU8AD|Yp}%qF3do>j$+sB z>hv(ygfqi?ZMUsXsK@@2)tTmAy9az)c?e@0I;c!b{Xr0CNAx-~U`ypeA}T-B`>kFp zI`4F|vYl``iZLP$c36{gj+VdSznk)QEwwR!9w2siIXY;l2vk8I(SOq}8XTgVtBxyC zww$adGcK<30_?E&z6@3(n9+}~2kxv#@4O$ta{wm=+~|Ef*JB^dIDnJzw}R~}bZmsf zfFA_zT#sGh%=Ya;yYq6xfuYI`5G%Kyh(j@I+GOl{T)=nbrqV{o8g>$lc2r_BN>>w8 zl9W@XB0(zKNQ{lXN1;>-?M|s-XP(5yK$#?@pz7BY;9qi5`l{?;^Lfaeu-9>z^Q-UC zI&I}4Hp@6ivkY7HX&MAG&9>F9!=7`f2z!wUo^uF)9l%|s0AuBN=y6k^5KQCVJ|FzntkJ81vKL@9^u~c%xS?h3^qZ-eHn)V(b&Ey z{~Vj#?=A7uwmFJhr5vw$6i0el+>XP^i2Apn@u*LuBa=~ofuySZP#rpsz3}3ee6uRU zJF_Y+WPkU#igay+4`kPPDk&qdMXtwOs6L780k@C(${snOg^4(Fxjd;yIO)Oe4X5KH z_mUnvln(SM#y-POopY@Wqe2xu+XhpZI^_oiw<+%RUGAG;_Kghl;!n7DB>q~wBg1?n zBfKNSeIp~iBQ3s>QC>LjkMvH6^3+?q9Q$vp*k9hr3J~Kv%M!)4pSsiSB)K!Oi_bDK zR-RS9pgHE%V-okgYr(LwUz=lQC73-2Z95P4+KE1KKTR?ZBG1@7lT{-=*Yv;5(;gJZ zOp0UkM{Z;fPF!I3StItaUQoOJ+{mO1h+hJ_d#(*r=&)WLo^$5;hrD5_iFJ%W(ArJk zYlOaR=Beq6c_-61lJtG-G9S}5T+_9kCZ30&t8xbChjUsn_jJbNy1OtmQvVKYQI~X! z(<11!HC}1-G`L-#2fn9zC#%tG*tLq{+lTRwDlJ*ErMiqtOU7*Rv`_`+wRd;<9!z)d zEAh`lAT8f1(*9(D$!kJCgKma1x4D=P3duU4DfM{igCpG=JLzoA&$P z`ldqSd_t&6tb{%vLU}uc@^J`--Xr*r#q6#--)W8SH0Dh`^I>v@3AG5%W{0t~=RF(e zUn6W!H$Vpn^`-Y=bHREz*?TE{>BcD=Op*cU{O}cc6Y_52!#!U7Rm-zrHQ~0~qz$%( z*Mmu^S7RB?yj{sSs^)aq-uY6=*^f7H+dGc-8cURNHejg@&*?~NcJ@;CDGgW{IKJGR zeKZ{R=4Konustc`NIBT8Dx@Akl)iC&lnphb`gRS(dET9P@i~rJtrA8r)C)gB+~OE| zJ?z~pBeCoetG!*Qcyl@utY9_iTG5f%xt2P6O;IKLXy9t<%^|qM+cyNyp0iQ5Y8BG`X;48FcW@S_!iTFt{k9Xv@HD0a~2cOzhjD~bkNF?St`RSssAX(Br)rc zho5crd;O8$IN>&s9`9h(kD52H{=0D7JMV3Ro}-Os4iq-sM3o0Snb27w4h!$+TjGU{ zhe&4QVZ7?u1_=r?ilMR#k`>P`O1r^gg?6aV;|5(^Dyv29X^4Uzqy2NJoYh}|0U=3Z z&8V=hf$VFUvK`g>2Q3DTgR~Cipm+ldu>ydjCSprFSuQ#PI;L}9C_fy3L)xb4TyJ;H z@f=KXO`tP=^mf{#Nt>S#7KaY}5$9u|RT-Qq&~nSq7SwvO*K>;TX;yRsYLAhfU_1uv zJd+WtZlj<`*`Vy^y<1}{#$v3jq@uf|2TeIlY$?v1eG$LXA=$a5s7jwVlyi&KAvIbSoc>I7Oey`&_+mp23<7u=gbE2V>;#fxOf_?<8KOCl=3lT9u0IuGxiGH6Vr%QR4;Zk15vTjMF zXps6jR{t6P=9A9X>U70!(-kv_rc|-U%#H~P50)yd=&}5$u5+~r#Vcn2@8_|fmYFd_ zr4m3H+1~k-$BXG{fwD=Qed?ZB9pL`I&n#M+E~p*QVE!SngxeUwwjF+$j8`4xt3Mez z%Fc`S;J1$a=p9g0kD7|rIOLCvR5F(G%7?RDqA{x(OG)4$^lzcMW3XgJO@(+fo8c=% zlufwNLu5hizYat1%6eOyj0I#|!`_JGpziH)UMy~--^XsF|LktpHKg(l@TCz~JGO}T zty98+0nTL6rS&xMM)O0B(9jX1;C>og)mGFdUwBoWGfSyhg%2Eoi!i1o&v#zvjZ7QO zJccJ0SsX6L^xwa_AaH zsp%#F{=DD78kjMcby2*|vGIl<_oER0Tump|BJ}L1|)ocBO}x} z{{m6BaD2HRM&t%ZhtlBqA+y18?5+mK@i7gK6Bjf%e(c@g=t8P zKoeDgno+;#UFjY@&;j=rqc2bY|O5QxqJhMg7NwE6$sJf}Szn>>ufA^=9{^k(N}UXwb0! zFZ?_k?ffnrF$ZGj2VJpBNBxmFFXqX3#&{iH)6?p898x;40w^M>slXQry~hz`vK&s$ zO^a4M&*P0`VtMmMEc{*%rLoE!6BIadMlM)VP}wv( zm3)Y9$uw_4d&`Mcv*SEx!krJpde~^&2lr!k>ZMiKznXU*Oxjs7U-^>NhlAdnuOOGU z2AgWK4~nz!B%9*C25}4X6}7ON;mjo^=$a0(CMSjW#bp#oOa|LXpww@KI4!#`!K)j z&FV_4+T$EbF*X|n2c9IGI(WwAUm@Y)ENxrJGYZ*5F+McG9Rm#5l@8guy_<~6& zhR|k0Rzh36Ia`(E^?^7qJ}u%I$Trk;BudImU4ti5ibK=Z9 zE6?(HXgr|&f|w?HLdr`48fUqxp8S&nXJqW@WS{XoWZ47{6uP@u~ z&E8j8(T^gSe_3Tke+FQ&yMK6gKOW0GX63KhP`LsLRGcXW3fj56YM>DG-$O5xr!J*? z1*33PhH#?d5&caAJ@BcT-H$1~p8+U+fB`6d(3jBoYyFcn5 z)fqd~sL9^cy^bA#$yNUh)G_pt6DyA{2N%YSHb-=uBeu;E-{$Do<`~qL<8E^dYkQd{ zm~D>aww$^)$EdcPHL%y*uGy8Q3sT!6>=>t7{?YceMx=DW)U@ECD^**zN#8$_v%a~W z3_^b?>{HXlLoJ(IFGwIs5pvf*Z(Cbr?-fD~l~{(30ucO2ld^!4{pk6GS)z8qW^NgG?hM;i6PNArFVU z`5(<2rA{r_Kp=Aeh^Cca)9M?qBhXqyk?q~kW15d@0lw7&eCKt1-{z>3syPz@d1*Kk z+8k?Iwvv*sln-v%LRICJ@|!^1ThH+ge(KEHn)!c$IEgNl$U=xUIlK>xNqV3h{U>K> z*&G;LP}|lfU3Q>Wa=|AS^gV>(C1D2dw~)c^$`FGf*UwTdy7GnRN0l$oAN|!6-hh)(y`Fc>yDbVVJ>WXf{ZtWf-x2IlH|%U;DB@M~}(A>wkodF$Lm% z_lIM|o-kr5#Zf*MoNLjj`3nm+u{a;}O|Xz{!Vye~^8Vheo7-tDui@rvSrq|4b^VY3 zXqcyv$Db(gyG=S89A8+)+NW|nu!_%HD~~=2AvAB!j#D$@F}FjT$6Q>kh^0v-W`bm? z&awdlYg`*(eniQxRWg>a`lx2tsu@eD)5j~Q&gOVcaa4)e#S87pV{cW{mYOx2W zie7KA&qdk7#+I+>iJ_&Po)}ra_GTPHto+3x`zypib7HT9M=N|tFX%2m`*)u%clW1o z$ZAtfMUWkGK{if$eU2snhr2J2hw}R#pJB2yDoRl)S|~+IltM)+QlUj83W<<4ifE8A zO_3HY?`WsRnx#lcC@NdFWJ@xsRFtLSckc7dJTub!{rP-;-_Q5=$8TOQp7Wf$oqO)N z=ef(d_h6LLfo$5BAsApAK_&48Kce)SMPd)w=WQxhY$QYkp zuon`1yM~5z!3>U|Sst~CS}x6Bjzm3`%UnqYtHNxCaVFD9NCYgI;KC}n=@Qk1X8?{? zL*zm#0@UEKhHjpVtY#S6Q5f&ka`6nc%yT*UQBITf3zjc2m-DIzJ2Y&b1ltS%z(lD9 z17N1q8g5pjRiM2n^$_UTYenc$p)ScmvZjM&R4E;RkFw8SC z5r+8~PjU!EssjlHZ~pp{7}c;oDw)>@RM%htP+c2t3^U(4xcUi;0QHl?BD}%?h|mzO zFBPW$8XI>uVgtq|L?Ud}f?fUufK=Q@Vm&aO#yFT>y z0hk~Rt0vZb>tRLdGrb<#Zb2qP?mo=JHDFdbA5#F99JYYjBUn6QqB=Z)tqYPE`gd1p z`O6);5B8nVRd`wqILKZoz~`RLZ0T-c&ppwggwtLl+ncl01>ZA>L_s!xJbAMw^Xx-t zBSoe!26wmyj6-qzkRF7Nr(cB=sb2-!tx*3B7<#tB-&^==Cle)my^o%?OnN)wV=ml6v$f&Iux9@s=|;GN7wuYAF^tPRRpC=M2ZSA6-i(co^h>e45sCp; z_Ba;T+h9a*UIm*4u55PV>&<_f+j81z*vJb1>~Y4290dyfL+uHx8_fk!tFA*jgWc~q zQQ#}cMBi9;_B^MVT|>Hl?w>o^zuQpY7^Q-tpX({8OAXlrGQ(VfeZl}D zv0H(+2!w{%yzK)w8#7GBm{KR0QtRPN2xe+Q_bQ+dg0ave7Mky(x@GVq;e*LZHH?Gd zre;3&Yi*c*9lTQ5uV}FhUIo~%4KN6XS0VN*S{Z}h1+%1TL;=IRfU|(|XDscJ2wYXo zqy&~X^RE(uTjMnY4?)9)V7@FEAeOL}ha|EF9uyds!vpph5Ivj{5j~wpVXW&_FiiaZ zQ3-;HF5dQdPiHF>c7t$^k-&ZxG$ywd>E_w&=!m;8!_MZFVHVm7=Ft_Heg|_fFUjvK zc2m6O1ZM3(10*kn@bTb~3R&(@Y3Q^M+EYg&*M>xnvs3hUn@(Tx1zNU*A-^}6sx>eE zvxIT7V?Q~viHd_#iQ+=Q@m8_tOwf)BsFip}EWf`)#9=!7PfLuPV%XGSq`@Z;w$wS_ zYkFQ#3#vD*-;H`?2>1pT#ney%w3fgqMT8lb1@#ZQ zC9CLV_ohH@$lhp{d1<(QY1k?HiL^F|rAx;iY=1z9k+mJ$Hp*)|I0gb* zP~)K1;V4%a0EEQBJ7E{n$hMn7A~?)r&taH34YQ-+v9IZjE5ZtfjKJZC8+?6Gp5d6g z7u_)I0Y>^qd{Glbp%#O)jkAHVXfX?{lyDQUVj5To9#a4m#$c>f^pK5I_f3xWwvRCM zoXWL-c?daSJ&i4atjSOS^i|yEhwaUXirpg3sc#W2780Q!H&1Fh<}irf5B$+X2N{l} zKsX#5WN2d+I=BrPbEV+WYzl^e#^{B!n7C1y6gv)*EX@83k3+A9Sl@9IF|`WVSlkOE zm`m_^_$!Q|2zA7U68JhQ+Xe;kg~ZwhO$&7V(E}4$q;uBfsEHVVaJNHxn2A>eJL9pC z0|!2aV3^Ag{-R)2X9bvDq4OTP^cDL-C^`ihru(5iJcxeFR#ZSMkK3p-KpZcx8H`}S zz$h#4?*wK8n5F-nz+gpsF*!cvJjbvv!^eaJH}^x@Y9f-kD0I4UIURd2XzSqxD5GfQ zdrYBW9)TVq!iVv22R^R)-DePIP6z8sT161o~G2G#$SG$fB$ptnI;cWrz;$Ji$KHQ;19( zJQN^&AC1eDzS677y>Qr}!3TE4ngg@?014gXi4c_NpA8v-Nn<%^a3&n5GA?GMBK^e- zAk+P8vGphLNdURi{M&@Rso)+})VLUITH&OR7%Gwu{%XTlQpsT}CCE@jo6lEzAH%uViylQEM6m$gl$UC53?Fk_0=5T1T8BRb(giBGC z&4kEdQWAPhsR`iQ)#oGlEM-_VgIwa2(YzB$?gVADQI0IEC%(x7*L`IhXl3?S+LWpKi@l(_~N4+hO`s43^con*)g2|Bq|Ch%5-T-Fh8NhQyE z#LzDb1EPW0OsrjN5y5=)N90C~^Hsokt4xgTa6mVg41+jyOjpal!P^43?4Jv!Rj~32 zxx(oeJ%)c7Q%VaM?7fJZ4!MHET`;qyGNs0r5A@bEtnTtji8B04!=$M2IiL-IFkzfg zs-)MGtF^p}JsvR3bD=zDv%nC_SXO+QNxmfJK&a=)0rEg zn+9fKju|{PY5w3TT(3|QgC9A+}CYQx8d zNr8opCBCK%$7`YU9l``Ucph|LXb13XQvsO~RDJ*|v36+2+M$?{g-N>!Gyoh4ZbNg? zhe)u$gJ>h6%mo_4;XqHA*&<+k1)B$mAAG=wayaqR=F@~pXf7ltdli$t%0NQty@>7l z=m>5x9k!dT(1{}hpqME&8S#92xYQzL$QDE^OiG=aUXPlR-CgVHmE<}&n&j~U4N0tW z3EJa8hL#v-QxD5RXQk`cLPh1NAzh%E2{B}NHJ~aSfXZX_%Y;Mp#V~`0lhs(i8%6VP z5bz!ii{--ooQ|v_jCJHf@R5xAvIJQfWG)Q)G^R2>flYN5>P(;xaJilZdYz?!N#N*-Rw)voP z{oBa?&1C;FvVSSPA37~HbO#6nB+}1jGj%#RSao1nf!Rb^I7MU@QWRknQ9Wo1CPht4 zA5x(2JHx7!nl2{_=dvOFs3J~unx@8mX|;a0gW|ut5V>n8I@f29_gA{ zl}OWIJ@q{hgh@*k*{hk%k(Nc^4i?t!U;uB`2B+YmJ6cMTfjVls7})E=T?xH)d}8CE zvSDIlmovo{BZUqXZo>(I24GzVQ9ykLlWAx#x^XtE1~n9nz3{%lVnLMNMyM8D3HnNJ zE#}$)!h4%oXpjmgzCkr%4eDRZ+KA^z2;gJXd0;Icwpvir=i*I|v7i`Z0h|lRTK+C3 zQt&x~>kO=#IhqzOH()E<987;T(!Hv171m8|!Wi=s+7DA;#h3!aKONN2tH5aBD0~31 zm3_L^?M_{w8QR_r<793)MFQI1zc`En+A5dUNA#t9dKp>23V5bvmFd2XD;M4-p#P}p z+EhCD8P`w3HK6%jYPy*S8SWUM_bJul0y>!*}mHZqZEKq=#qs{NlJ`c5Ui-VSNCN=mf6o)!h zGjuBGNOUXs;$eM~LRF?np#H?9jE2tS^9iI9(@AA4H%LRxK(f#beJQU?BX#D$0~?EJ?3SB+EkL)I7So+%U)^?HSufSC!io7=s+|cY6RtqRTXGJ`vKGp*vYD; zCcfa(aO60&AvLi#uSEn7Y>;7Klg*+5ivA_21v{f|+?@AGB&Z!@ihlu&zj^3jGi4+l zhyt7%4jmw!I4^KIRtr!Qzd(UOgE%M9rEfVHAA*MS0SOM#C>S4BavKFM`ao?BjUqs_ z2_I?`oFjkJCa|(u%;CpA%I|G*5oUG|F-qQm;R5(|`hq@#FMcCp6_*I88EOn5f;}d~ zWrO@rvQdj<14NK38+^ahu@mUHhtW|E9059zjDl|9kx`5tJTl6qghxjIr*wRPkxr3* zGe$`yoZSW)rDmW3;PC$PJ1xan)8r2CFId~4n_~aAzd*muCHl*VwvpnYr4`(R04+?z zQP}BcCo~{KD+{20nvwb`rH0xA<3J1NvG~w3Lks-RrUv&zL{L9g#h`mY@h}dikm>zu zb-m?5EtuLV!T!I)l+O>fI?y0=qf|0zpDK5_6$GsC%lQ4X;rqsq#^}1`mn=r3Vo`rs({XLq=Q6o9RweA7#F}LHJA>nWi=qSqI!TDJptU|(A~rS?EV#-oxq2xmLDynG{ZeG7y+xgaRSOR-Ho&rM{R?BGpt(i>TR@^RivMZ^@;n?cq5cHSXRLNdLBOLhg1535xQFXm|oyR zWixR7B<cLC}=_V5HmGz`%U1Q8T~+Yagb?`Iq9_u@uG)53$l*LA7j3=$-=zf+1Vrilm8^Of$x&TR; z>p(g|QmVi+4$BHgVp?8huo?(PP^=>`wt|yep+8a34`2qm>nGF`a$?0n#NP_dWQ9Wm zQWLB5nnmD%CR1CIbpg`Ap$Zj94;KnSO`&^2FJp-Tbw&EM7y@Q}wJdiag#LmZ2jq#h z7m`5AFd&2N$`^VL>jD(bepQ3fM;j{$N!k!g1bBj7O9e`_8Iuy2C}p!ufPRod)*~PT z&ER3q?O%*?&wv2#`XIL60S6uYCBe!ETwjYJRRn7$weaEMtO;Y5InrU{1st2mCDXU7sdgQNtiLd4N<6HL=HF34L6qxi$bCnt`El> z3d3k<7b{%9D2#^I_re&+pLHQ^2mB||vGbnvEF>sk_454+T6Ybjq06Sh#dhdgh{L(8 zq>zrCVx*^{(=}mHX!S6hhDS$J4EAA)8unp|TJ~XzI&_$#p5BL<+Pp$fFvV#=PcXE3 z4c9&BH-fo!I8dqIj5hMaj9U?<`fqs5K47!=ojCA}z1iCa3)h566$g!2idvk*QqJ@5 z!Vz8^;xqkgc-O=^XkOf~ec?YDA#lnVMi=cQA_sm&v}hb4(a&E12w(XEL;fj&S=jcX zC%70#tp!(}Il!Y3J7p`B03pX|m64-@)f);JXog zlJ5pW@b%a!xJY+EN)k&9j{`l2&r<~JKOvu>chUUib*Uk3043|P-opcZC-uSVu!u#1 z6tD)3YRnn~48rz{fAaJ-);T;r&gQ<9KGsQ?o!Cdv{G}wRp-&+lFoq(-o5BiGpl~72 zaVVCjB#NQS6QdC82mGuB5D{X4Uw4?7=}Q@cUu17r6nO_vWR?WP!pa+#-(8+4czzUC z8%&;lFE?yNJU&)7JDyjReFUDC%!&gX&;Yy*#(2wFf1N{rgk1-=h~Y)sTQDB+~C)2gug${)=)`-E{_d@n5 z=ixgJ?ixHo$`wWq`4Q-NFtiBh2c9xI@4|W6+mJuZ-Ex)kJ<;wT*OGuBg$IjKht9Zi z_-cf&YlAT^GV53llK-2{N9tqv3KgP2>}(9O!=i?uGc#y~7R3j%URZSr*$g1uleCGC z40~JHnTCHdo?yZ!iOn_h0*ok-H%w6?xkD`DXhP2O@4~_0qj04v8D_As2nd_IuxVHU zn}%FQup6Xc1WI29eV>j)S;JK2Kkd@8X~whs-R6VXlSfr3=Ftb7-CKlj~CU-H#k+*Y}@!w&0(5Ho)fD zz@K=A0uj$p;Q!Y=(-%W}ArC1HSeQVcT<-DG19=?1aS162WSK+_-i|7VQiUlt57=t)L!}^Fh zI`|Bx&(z?3Kt2rVjHwwL!R!DtcHkH@!}zjA%lmcBXzKq6rm+N=KS~ z>LVB`u#GTa&1X3ub{>cRJj@uG?Er#8FJd3)tO+x21|xpJaSVNsD#FL0LSC}L@L59h z1k3?y$OM4kW z5414ly|iU-=lk7 z-F@YKc7xwac{g|0opv6`VS%`JKCM+--Iu_ok}*r>oB20<|N-O=OPF zD47S`D+cZ*-62zNa0`j~zT{>_a<;SC^{=9V<4$)Q+?%H(xOV)f94-D-FAkmT`tAkC zrpS+_n!JkqA}ucU9*FMM?7AV>3Q&^WPDgu3L^hP`33u2-Y;@B-H=c{vUR$U*unoI= z&CSN$&c#!Hr>nE8JNT&Oq=)zpF0SsVqBfqMc6;407qQrV@bc&iemq-wS1(T$S9=w> z#LWSGxI&TOkOEvIxOwjWhxBS1DiDn~8=u|a7nMkgTy1KyeZ=yV=!5)`+JJ{pXSdxp zhzTw(;IM96Vy8lQqmkz9Me?#ps8vc<= z4{*+Wfg{^Xfqw&2iya%v$$7TtT!X!Kt2*i$fE~1gn-WG zvda#WHsnWOShI0x59%8yXLSN;Qq7Rbl%jx;h1LZxzAH;|FFmKKyO7?)*?2xiOxdh?quc)iw3`Z>FmWjJq;kNJac!;TZ3{Kg@!-u;8=G7y^;}PY}#=G4= zO z=(I^BH+V+FUkCd=7oHaIC!>e|abWc1{Gl)o{HG@hAJP8EvkANX|MnXP?adQyc>nPN zSH^fCKf3yl-!AKT;vvx(Enee1eCf6AgIic>issa!mYD(a? z5jbZ8=Skom6S!vt?hQbA&W9yAIfny;=X{dDT_A9`30yKji!iFP0a}Z3vXls|0tnBg zjlg{%aH~ecWdm5+zW~B(^p1c&5|GLmPG}+lA>Yk-3Z=0eNJokTtpW%y_b7ooN8pkO zTpB<)^|=7y)RUw+xd;J-=VCJyyGP*i0NRA5Ehj?j0NRYoRAzRg$zJ29Du$hPvB+& zgx5%u2-O7$uhC`#asmi1H+B*VT z4hKH)cpCv)hLvVP;A{cHOLHee{Q$yCizJ|H0O7gR6VNz$4sHfOI#|wg37iH%c+Lhy z=sJM#oM}Wn#i^WJ767D6LanMz;8p^J=VC^LS^|XU5=cN%0O9mi5Ks$1xUBsI2lF@9!6gufg>q!=#vBp50wE3&)JB8b^?T#ag~5F z0m4hm1&A&81g;h!{JXEE$cd*15FU>X5T4&zfR6lQQj=L3Xuaw9-^yxm0TZGiB4+yw}yxswR}0niGJKK_}U{6qo5>5~Nr z4^;pN&v_XEtpfz;0YErzFF<%MfdJvTNP|$}&~$+GNl2@x5V(Z^;k?%;LX82! zbMYXcP=N4U3JK^XKzO+w0O9rc3=qyg)XX?e2p}BiP2hqETn9jS&V2wGVDup}ahwo9 zIDIkz;i2*X;q)ycptS(uDFO-TCO|j^X#n9A$Uzo(yg2}^!b)2};Isk4OEV%u%>cqn zb0VNa0O7gZC7=b68O{wFKzL{rK!#Wu=Ly^ufbcR>iO?*7@G{B?s0|=I7cyjlhe`v4 zJZ6}}sfbd-A zt>HlK0O95O0fd(uM&Kd{Tr7c$BXG&0oLp{#RxtrerAWwPLOlg-6o(U0=i2;nFN$gK)D1|KtOY0 zRmcwNi++PcB$5M}@c6M4$KwAf>=!Z#yq%DFL%8rb0B6A;76(Jmg#SoGaxq%)wtE-` z=}lFB-Z=Jv`3VK0R1g3^U-;WC#2e=*U@8E2{3Xnf8=5YQL14W3E+Svl{XGL{<#I_Uffg*0P{hb7lW=5`~Xbi#zChbb7goj zy8x33V{L96v<`C{M#fxBFkl*B9LvR=15DXuUd&CvbWGvJ+y~4_d0xy@z!*;B#nc1l zg90z+JzzX%@L~o469~=BEnSiiHXD_BF|z=Z1bvDdM+Y#m@SWyjOaP;*hhy+ob^%P- za^5%rfY}0?nVaeuV2*-D^<}lQP`}=SC7vl9YgL(`< z8Tpxk2LA1r0~B(8IQV=7reOr8a|Gt+2#f&EN-T3cP;vxDZUkn=2n_0xoFAUg;t`mY zBQWbmV783F*p9$BkHC13zyyxKgpa_S9D%tw0uwg^lQII6JpxlW0#im{Kp&EKH2v#gQI?!8h?y7$@g> zBjPL_fmt;IvuOmzaRkP97$y|nFke_6Hr{sDUceY@b+&tW3^M|OMN!ird}iTJvx)5p z9FHS^^V;qS`^46qy$?LzPUQdHnzP-E(ZNnS+|4?+t7{FrX1v+s$Xzy`HY2fE(Ie2j z2(()~>>ajwdEe0nB6y;QUDn^Ryzgj(aM(NS`SHGw@RRCvtqZ>e1G>TGTTf;Sx7bmQT+J$OX-*lq3Z>cblg--EK-H4^W#3utr(g96^@s|{Cf z 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 z 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 A%K!iX literal 0 HcmV?d00001 diff --git a/extlibs/libs-vc2005/jpeg.lib b/extlibs/libs-vc2005/jpeg.lib new file mode 100644 index 0000000000000000000000000000000000000000..121f2e0721b1ede7fa4786d3751ed841b3122798 GIT binary patch literal 216126 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 literal 0 HcmV?d00001 diff --git a/extlibs/libs-vc2005/png.lib b/extlibs/libs-vc2005/png.lib new file mode 100644 index 0000000000000000000000000000000000000000..5d7a9679858b3ec0d40aac0f0972c519e3ca4d21 GIT binary patch literal 353400 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%0Aq69_Qmbk>DF^vt++@darXkV zp--LBc_3#Lo(wjlr94|4)9djm?n1`PF}FT-#77H*6|}Wo3(r zDvLo>xH_z^uc@qRu7qV;IqLqi)z=6!t%X9t)3+weL5qLRWOdWsk`puE`d6_t$L+^kGxy;j(p zSA4m`m~Lr)w%_m54LV{o80Oo#8*H+Q{b1PK3so6b8FOLvusF9YuPnR7&Z@SE%IReQ*vwCPu)Mge*qR@?znzt7 zsA*)#^c%q3aJQ1)2(V3DS&#DpWwD}n6#C5%MWg9q7k92|eZ86GK6)i=b2jUf1dP!Z zVCQ{uqC$ zX70pfX_O1|%O*ag|Ug(>mfhj3zlaGV4F4DUM4&u5oV>;83{{rZl!Hv$Ec+=SBcR|yICm4XI8tQ3KCHP_+LGEQJ({>!i3Wns?ER>Y7C} znrj!-&%inHLadjY#oL$}Q)(78&R8@DOP$Oa7>H*~s)47NX83K#)TON5&TIJ3?1bRL zv@4cf!rxWE4yUVUZyl@7Fpswh@#1%q$>N7Sv4SbViusO-@+TO$Q9pi*`fZN!`yTxV z2I|KNLjLj+G)XgwO_m=n@OJ_+-xNd+#!n7hJ!dg_3jyNg?=++SDZJAT!U0i#N%z35 z{t}Y%Qaf<&XdBb$9=uijWlUsQPz!lQcJM0{He&g^4vG0#kZew#xrv*-Y`Tf!mNoZ? zQpBBFZs#V7yS$`G6nAH2?2UNm7HFcl)y7TmL~#&|9S=Ys;K_}SMC}VaxnY;0{R2;K z_$6wG3|ub0TX?~tY-&k~I5x+P4Y(o*VRZ-^xn04(suznpKJs1e_b@dEWLpGk#Gt>= zmam#i-KBElUE0p0#_}!^H=pHQB1)5YiMUNWP@BdN9dCY9Q$v%+bN=S41#EX*_23H5 zD6e-C9a4#-eyod>!>ZbadWJ@6+0tq}t{WhaAob2}z$FJ8E$>FiL0P!F0{6Uy|BYw* z96#;BYKNP}>~wJKWMjDN7dNOA1ajzukhu@Wf|J3EJtgbNN?Ox->9D)^qRr@owmt)p z23(eLmWeqXY^0WC@y0L>|GoGhzw5>Ac&CHE=4%>zfyrcvQ3WB+X_@ZIAlUr2mcv$|j zq2qH@bv?@mC_d?{!u9&+g0Oz4mhFSOar|FN}CW(LgZ8*85gvG#ckHO5xR(AV0h zT1J`AKGr@f5lcH5*1$E$|BkgliCPQf|3_VuP_%H{Ilr6t$%(gL)^*{NOAZZa&42!^`)dAr+$~ez%6vTh&m%ia zUq0^-3qC*PmzVFk_?c_|<&5NRI`h|aK0Nkklix`HWAi_bh!wv$;`di{pZtsIyT(6t z^>+iWFW5Tlw{!n~!mZQZx!{S#2Rt{Fzk2?|4PTyiSLORz&tBW3`C2w42Uox5optx# zw8lsFx$;(QPMLD^o2k|Jev}dV(>Lxw`wK%Zy=~|4y8AyKcjdZ+NhK>^8am^S-6QKC z{A|L~r@wb(FW-3d#2a^z+Gi(oL_QG5c448PoLG*NOhN zEyq`^dHd|z-~4UtqP6=67jd=at@BP!}H$VDjz;S0~=1;8&x88E!|@8Z(S7hKc%%RfBx@}AHCb=0Y&E-9P2aM`LmA6oy)dtdz9bK3b?<&_QB z-f-8$&%XNpmp%N(iUb-R`ezm2#gEX(wR1HUb`AT&!uWBj9T8QDA-oUZnEUboa~ z7~isvtnTK4!oY&Vh|~G`-3U&1?C9v~<)G{+gpgJ#MDm}B7cE5b3G28h+$0RLFb&4T zlZ3L~(1LLkHYFUj(e_bb2@hHxs0U8#9=Lo~{k1T3(b3M8fiPabrG-YZT=+?UvQn^V zpu{EU%1il4)Q|R|VBha!2-B7qHR6dMwI@m25h7a&GF#L~yt~bJsO{B7@*B4!+r44~ zjI0#8@SAyjvn~pCB=3J+IxP6a5&nA91XsAKWeMC)oMF9r%iyJDoL9O z+T`&0f_BkxN(Al3PZD6T0Q9iP)&uE5m?{73zrzhfSnbK}0a%YopfUb0Y^I|``F8{dwS4Pt&Winyh`f*A*z}cMILcrA_MUbIk~*fkA&Ni4PMH?F zMvHBUy%IXEShdge|oWI6e`|h{pC63{MPg zpL#^}8rLUW7J~4^*a3@&66O+F{M@ALo(qX1MUlEX{RxZ8dKITAD6?=r>OK!b&q3kb zn~DTr4KRp)gCgoXw|hHXS;%X$%&SA@EaYmbaepVxQnLSd1l{|egLT2TATQ`U?Ir*uN6kzmTe^E%YzZsBZ;@PR-qj*jKWAEc7nbAK{Oqp3*a0 zw=J3j1>m&90pY&@7xUwU0}s*tVVN=D>~J$RS7bvXx%Z0H!smhW9E0=lJZ{Cqky{4l zm*Zo{l+>hXU{(igp|uCA+XFRfz!UMlS(~_g<-SphM#CQbAWzgT1;kylM6DVScdF#4 zA8`y|5rKRR`a7@ZG3f8TjB2yvJI4a-jAao;(g1 zsO`m*Wjj#YhbK!Nb2F4=c|t!xUIG30eJXZBzCBn!!&skAhhEJ)?oVXFsi2pwpb8@Y9XZ2k%__4oPLux1#VnO)$rA+&PCk`z3zDBe@ti z8UNGp-^5hoEoj3m!ds&a(~7s%Hq1SEd&Gu$6mP5@Q}SkD(rlQW!1!z!?obD97?iEp zR5Rrq1I#`f&1ra}J#dqT>8!S4Xd};uPhgW~BDqBAvJ4sM4JK${I`CH6u&`!!V5LBvz>d|k3{26IQuw5?S1Bn`#8MI)ay8x3Dx#GQ^jqZ z-bboTzBex3i3x?p9j?Z^C^7S*oT%6k*pxTjlE@=xTwv6_nlOo87aGj#eRJa@8$8QsC+MBjoiudE{V!)j5(zfA)2fc?lvP>IWUO z@L3$4uTP&F-}IC2`+m~7&ed}u|N4^qPB*EabSeFyOGZ*dJ|<(|5UK^+O&>3gYPE z$167FP(SF{Kkn)W9T(b9_JfY?^zDAoVanD1-4D7mKsS=amcagoDg6I#)~K5`SUCM> zrw-V(bZMb8@v%%}_9x?mItiPh!Jot?x}w3EwXs6%kGj3J(ZFoAYlmIL)@_~@qwr}W zOj6Rxg%>YfU+lrfmz_Ika(I9z_8k^6Kn&UWxe}9Q=Su!v!%rnr-ps!*cCF!7A!66ufxj{bySJ;qo4Q{77+6`J+oHm$ z=gv(!%DWRN7t%FR!-;a6sNFAjy$pNQL_83%YDa1rJ!wmYKJu-IJMBv}uv(px*IQxw2 zGNkV6gVT&aOI?&0Tq^sj6@2y_Da` zKo8#olj%FVR8OQ!4j@MwZTtW#8;CU76VXFHl86l16M@(v5#!hs_iqMby+llqy%31s zON3AFi9oT%OMNiKb$bgaqEE6_a%`#G`D*l0w#b>$vs0NoiBCW&fd54#je}g z`*v>cx}Cbbx2@}T_C7RXv|-faF4jD%XsB7&A0wUw(!8;I6UrCXq7mfzj3q|xQu0Eg z8^(hda+sjUQKT%RZR#(MvRbkt9i$P5!-}MFhqT}69 zV9Fl}v%vGNlBUOv>y0xFuf=-$SLo?ip}jqqXOhP+=e-I|T`$*=yYvyp}_QsH7CXO;t>3dfE3dBkW&k7cMZDd)B7Vc$t9lWpu z?5>c)>bM1?%N+s*uKxyA*$0ns2bQvEBq}Rqa`zExM_pKizLhMsv7yLw_2YHS`~Z7oHCd6)qXzj=|Nst9LPsf0%pA zi{0bzqGjzxy=rJVeK}pb*uDHa{*8}a*3)xZZ!DWS{kEMEIhYVSC34Ue8WK6^4jmgg znB4n*D|8#)x@)N?@|^>Rm){M5zliS=m-W&i@|_d5#h0e0y00D5of`Qrfut@$8a__o zuj$RPG<9Uc(s*PVyyV&2%ro3mY;C9uoe+7JyKr#?$V>)S9GC3BUTo5ZQsCJn>;Xp@ zN+cjt-zD~zNpZcBY5C3xL0)!JoCBmr{jLrSRPFwg@F%0)e=`1zj2_iqF{FLwiS7QO zp(FNhN(d!x@t@-CcH!x`92T*shg>ZHJN&2Y|8)5w7JR$^)J220`jeoxh9)rqM_n75 zlB9>Cs6PoP!%LBTRh=DwP;6LFr9vsLr-ni?8n;ef9uQ9CqJe6hQ=~+Lb?t$Av7llr za?@c04IZrCl%flj&FiEPHG621PB!*N2jku>AJ)zuCXZCM2yN6htzHSfrJ zonxxZV(bQrin<<+-AbU-^%x2xGERfnf)X&MJQ~xc>L$c#0zPRx?AR}TU^%QKK&$09 zu)DY5zbL0V0HzN~fikO8)#rJtKF{Jjgc?j@eflsh-L@CZTnG3G>e!i#F%gSxeRu>oUkgUB=M>45xhC+T3?{^G zC92akUB5XH6Eu;{X;D9%dfdfnbh#MzC>n#HyEZyAWqSPhC-pyB<^Nd77T*VXxG8}T zgM{`#z?xgV{U5LBkJ8J^jm8xi2~uM`-2!cm@st%JXF9aYl;vf@@uqagSuw5MKT_na z?gktm=%vtzqocapF2ZBhr+B1=@%Xp}5A9n#RuDS-DuZ0jxieBHL^ivOmox)X(<~is z8n___lx#q51r1GAdPFt{>}6);?=xh{$lrT-VNV~zp8gtMP^@080iOpL+hlL%Q_ecjc-L2~wlPsOSuWvX;9P=~|} zcX7#52xgSYdSbAIkGVIwLjJ4*L&XF+F($(!2CD=OCHl~2$cWzg5}(2gUHcklM+lSc z{WJGumH`|*cvifPR;K5AJ7FZjYb!oEyh)S$0+IigB1l1Cb5xXl};F zy)LDb9OH7wg-@8OF9Y1@q3gh}O-JOWjem3LybGsuQUiro_lrcNBy1>R5AHtl)bj<7^(+y1}zz52&p5 z6)QhD;yIj_f9w%sQY;H=y^~t9w9s*#(;Pfy9~jx{z@3`|BfgCu)$LC2*_wz6pO>A6 zc1}6prH@i#Ecd%SD^6u3-Fi*@ULV3@e%BV)a4lBm!bsNI)0uaUBMN7dM{{0@4W2ep z4)chMRk*jfPSB#ul2Ev@qd1wMD4n_EqHcJ-jRsw@GIulpI4K%TisYs_x{skAqFv}h z+`w>&M2DMLgJa2;!gBDe{0Cf0qUh5%h;rBez64#d9}qfQb@)^N%q3gv#JVtjHYQcX zMn@Yb;Cj%YAX4_>j*ZbjT2PSs7`Mo_mb!=op4aHRb^IQXwU3|FOpadP&MNYksOc@T zIaLj0V1X8?oOWAx#oW=dAUs}1E2h-Od>GyQmxc#C1x^lj$(LiaJ6?=-!ox^%EV2_Z zXpf;(uX77^9AY*?)eEEWFBO*F7mT*Z&j5HWijh0^vp4Z%o726WMu<=?8EfdxDdYD= z1rDV;)U)a?GGQEu{gLd>Q0mawKsL00VxluA;O8-S(<_ehJIG8%ITM*Yz1HJXHSE>GpWV7&AH9+S}1%W zDnaR=vwZ&*{XGdit6K16@{z4cD&^(KAoE0R%I$&u&LYf{Fec$dbIcBKuBmOHX{Ky*1t^>|f-;VgFF z$RQ`z+5XfDPp`A&; znAn;3xaQoaJUMZ2+=VN4%ed$m(vCIrfJnC^ydS!Hm*0>AQC$2*AEwag_0&b)n=-0G z0HEfrBH@uH+D>DX(bYrn)XPVfU+7{E74WG=KUoJMxpjlcW9XRiTSG@-7WJuFG_n~k zzyv{0WoRI0(H1lTT^LfN9Jlnfh3pSDe9dqiP71=?)FY5CnxS+&6>Wn6I36b&MHX#a z0l*?qwx^?6L6A3ySvj!d^nhDWQsl4QhaBzS=m-sfTjcPOQSmOHn_@ens~N2rNRRU5 zE!3p;_6rdaT|L2!7Pl~wh=`B2^NTmSn%}#Y^b8L_BClAG%H;@(1{%umIUR%D!?%zh zp0p)uw_?~BBA~kf@sdoUc0V95pcIW`xrAOZpbre_YXjnaNlC{hAfdAih^}6FB?dp7 z1jL^lrf3xguGYXc8Mx~V+$sZiw}Im>wv@Ntz->2hyA9l@2JTw}mx$H;Q9_qwKvI{X z2JTz~H^IR94cw&$ZnlB@3J}jC6Sd`N_^ARKK0wzm4UkMD50Ff^$iRgF$y#U!#6y@w zZM6}*#)$nDAX!Hb0Frg|Fd#2DQnYP=cp8%*K+6O)8qn1O8V?9cK$qJA$=38+K)(>Ne*h%&@rDumcR;rZ zj?VzyD(Jp8=n~PzWR8vlBy;|AKvMGW0ZHC12HndB?h}LVIwUGN?gAv`J#Rp+WZjVm zt|=+~?gS)L`yC)z&d&g96q=rPv@UNnp!;2$YpH4Km<+#VMUII6$_W_Fj63|nU zOFK@`Utqi^i1*Qo9+Qy>=cvD`7&QHIwf_EPBUVc7ZKxue#WRjPkSx)lubGm?L;W@Vr?-EO@qNdHMNn0eOMDM?k#z z`YQqX0R2WlK|l`)XcnM{1=I+LY2$J>phpF?8qi|`x*O0R1@s7@KM809pvMLD8lbfT z+6(9j0qp~{PC#r(PYS4T?!ty9`d+A#rWbU>3kz%J!d%Fr8t_4- zgCAX@X&dm_`+oLhWieuI)q(|87pG|@^A<>N5duMd4beKOp}awIRZUZaR=BV^Tw9Br z)GQ3aoydZQrX|8_3oSk(pRma(e8G&;g37l`^SrBSylEr7f`B$LVO@ysI-0MT*VtH7 zJqi+0B5(#%YxTWCZyv(lOYSupxM+#a4r_Td2{PR)POZ_ zQXQrR&?YFH_cXym0&Z}#Ui)q-CSCK75QSm9?8j&t!%dA1%{8Og^7s0kZ;CEaanxJ< z>-*rUkN9`ix>MzQdiomzpPv4q`n!pL_fA~*kobG)345~oQrlA4v>?lpM{7l*{UH{e zVw5&-%B3OILFhrraBVY+{*5dhiKba~A4tf2c{t>4sMQHnm2)gWPowo)DY7@+;yS3O zH;_K452H7HAi-M_Jv99fTZ7@f^53FnQii!|@J9uGmUU{qe+DnSMftLDXB+cOsYW+9pzQ29S2M!7BBI2!S#okuLsiK#zH{X z@Ej$FGmf_Vba*SQUuo+JQ?i1 zkS|Kcb%q)uNn_{Ymw?l85}php}OLTyz7?KpHz2bu;_LjEoo2v~>-)D=yO5xrPd^VR$k$SKqka*sq`AAS^lNG%f+m;01=E1vI8-A7WMkGYjLISw43Fv)YDvKuMNz z`t}*bT}v;9VpGm$V1hQx>%cS`7;DL&0Zq)=A$#)sTg}q=LZwa`dug0$<2tr#2R;sE zJ~1C-d}1Jtohua>Gp&O5Gd?uAPE}l_v2(G0O|G*dHE3dbT4NO#Y3y8Q+qg!3nciY@ z(YF-?Y3y9XfHBkB(-p2XxoQ;`Y3y8Vwd7I(J!K}RO>vNHcQDNjg+$n z7#}8Fv(4WNjOqOcgfQHI2d2*Wv_>Jq^rbcM0e|S6#0wx)gvdQHb3=Ae*6GPYbX*SFVU|MXL5@24lVJ-(|pAFLpj2ErhluRf0 zJ{#tjz|1l*))8s6D2+4lWVn9&gBZzW&S6;$Tnwa1&_2SOVFlWBgu&kj3wI^DrSg1V zVPSEgFyCM1(>I4;j#=&~Sxg1$`!a_yG*}L^{{-F?H} zf9<%jRi>$aojxP2I-_>n?9993ZVq(X5?^_Fu%tZ4U*yww#B}1!5R77rO|h(uap@N0l&m)ct3Cb<<1qus;g@K$>pYZ^$HbYH}8rm**Gc=UIGG$ZbEvaf9%d6UUkNUv{^n=Q_`q zmseg6r!rRGA691yc8v{V=eaq){L(;CX-PTV>nQ&j#*SdTx&~t&d^Z%7<`e|Vi_GE? zJB8@P*ec8#jjcXm@t!6>v0G?x!YfU2u+SeYC=K?_*>~CG6#L4vi_1&O(29-vu%^*x zUF2o^ii-l}CFSLXKC#m%{Tje^FkB;Wvr#oP-AzKM!K!DlIKRB82z|{+P;4>k4XV!+ za|6E8oTAc#U~#F>My<9avog6SNyiM_l!Q8}Y1<6S=EAo^zCT!szlGebq!$HjlSG()M07J0m=eN9Y&t38n{Z*Iw~|8i-lFUxKdRsdIvrW)k*LWiid?_XUzSr83>0I~ zw(NKI>aBe+=KBf)+2uufsJ$O$#6GB*Vu7#7pO2!?W#OAUtbL~#hN{Ng(`-0#68R5Y zro1Zf&2*lm+{l<*IfYX!GA0$|*x%$}2#eBkHq!_3+Ukt7^o+6kq@oYv>9y6FX*HQ+ z^=ZPy*JNB!RWmw6MVR<%F~#T%7JNEGJble!@N*7>uaXm3e7e=6FUTBc>aQC+5iZ2^ zc2njnDa_9f_zUt5QyH8^)TXW3qJ`rkT||k`?}wk3oC3HE>a#xk6u~;e9KJGP(*XFE%l3LVaPA@m6qg}6lIr{ z`{*;vHXU)(nmwZ)=S=YD(K`*bR}GI;fK2x|$Z>8#F~$S9Jom58?V&S*j1Xa)LR(H!ig)TI4!5Y9G(f+^8i!f5N9eA z7R@T<%PC=jhN?!?M3p!SAhfQsp*E!TS~T=ZIx<8%_RX-^ZB!i}xP=UF9CAWWrngg-i}Ah<=i*RPZN#%&G`t34(JCASW1R6qLg?6+Pz??is;RGC zYAWljfv9B-exCG~2K9N1ihMqQf!}uypX8SXXw$0JVz=tFDO261>s$8|PEVgK7--*` zHr}`9pSNRkI~#YL2i>iDJ$mn!3kyQD4WVX9d04VahY?aj8Xg!7Vl&PrAI+Wa}q0}prcXewkYVvfo?|>bTrHRP84)kfbJhr z(9!rgp$<3GHJDv!z9%~hIvV(4_jt=Sm^?~HLlkrv&?}KB=*ENY-YDqE&fQVaQPDUW z1s%<3eG>&872PZAaWh?m*@fn<)1#oHnd)E^bX1O(M?r@P7<}1@o9P-%KL^6^i-L~Q z`yWxzrGxJADCnr(_$UfGO0Tm4H`6s(I!HfH6m*my)1ss+i-L~wZFv-Ql#cI3K}YF$ zC<;1C$5T<#{V@tUO2^-#r2AJCbo7?z!tdZ_x(3TPig$bzbd=uQDCo$}^P{9&7X=;p z^Sx2fQM@ljK}Y#}EDAcZ%QsQbkzK|#;%2(eX6K1f(9wIOKooTJo)L$^S+2q2CA+MP zf{yHRZxnQt-d{yYw<`)dvhy2J(9ul$7g5krJALUY+)USCc1cCJHwrqkOGA`&Em6>s z{r)3Lx+kNcBl{hQf{ywde~W^S{Ay?jH`6tk{pcO-#Zl0a{ia4iM|LTQf{xO=I10LJ zLHFG#=%}9jMHF-t?|(-@N9lb%3OY*f$5GHx`HczVX1WH;57O__DCnr&zaa`big#`l zbQgjy6a^jW*A@jG+2yBE(2=}nqoAX7ycPxBg`oQ^3Ob6{u^KniHCTR7IxdNVj^s^^ zf{yeniGq&eT@nQy+2y-Y(2;)kM?pvWJrM;R>Gwhubfn)~QP7coUqwMjt3yVu!Oe6H zmTy#VTo)x>MHF@KII8Dy+$6o7B|!7 z9b}(c8t=OX&<)(Dk;a2lqo5=E-4X>|BIxR)pd&xn90eWO@3&FVk$wlFprd?yCknbm z(4C2bj`~d(ti#Q84d(aPApE8%=&1d`f#sHKFnMH`)+p#G-iM>4I}imO%}0C@1>G3X zU4;2T^EFsH$p0oqK{pn3bE2T5cA2+j*1^qr`V0OX~S^9XX3%g`-$$O+9^R@9M-6F=e*ycb)cK z0B~|lzMUWF)-69V7a#Ed-_YauCL8|qZPgH1ZIwtHA@G^LIP(X)7tE;;TTjW~$nM0- z1-F`1;E&r+@&=jiisxsH><&=trI5L^O!7p#wPfC^}97hu+LM3(U6X57bpgq(Uru58i z^RE?K5nu%xzH@Gy6B64Ev~AspXZ7E%jr8fiINqhhA6jA4ca6c$8Q3W%Gz{C*xmq%y zpUN!Q(n6qUTODjiRH^o+9J6odSZCX`jQ~__ucEQgB3|17p@tNYwux8odyL|LDdmr4 zGdmm^B37g*X;zus9U}3VN+g>|wEB9=!H%LBTiG0JUE@9qj3VRk(B2+0UToVnSagYy zoH$#P40?~GXW=Qll+7D|M5>=Y6TYB>y*|ifaO&i;-fJSK{|)?owDaanfyZV-!QPP_TM1PrP}ux; zraYrNt^<;d-7i}D)Lx{k5P5hM(dhX%7WomcEvp^V7d1|6&mz=hpeAUjtJ||;fVvE*i#5~*?OAr9 z;(&4jHFEl*Rp()cDkmA@7~QDai5!n_Uhhfj!(-SFWfIz(N5Hh^y$YN6A+Yy6*W(OC zx`tv0!=T!H99S?U(WXLj>zg?2#z7mxBw!yI5`%qc)hC$nU<5npeQc}1Ca=H)a&4qf zRU#k9gi6#ViUAu6C3hdQw{)prJ=NseRDmi2l|eiWz7|H-a6NY~jC%y;S3SPI(*X17g&+$!aSJMw;WB@EaPrgWe^ieL{5%{u6sI ze2x$Zr#78_6aR%zH?a-Z>#j|-uP$o5B&2413nYZDaCOGEA9(HPGsKf};14br#?5CU z@4D0jhu*#7vf+nYFUu(RBw*jkJvQ}qY}eK6u%njXO~$4{KzO)Rq}Oo}+uB?M4+uZ} z?OG?KeFDa$SWQEiMSQ4vlX?SvAxrPN<)WrLCmC-J*Wd z|3v+S|AG3naF`4Xm!S3=6v-d7$nrb#B9)jwj$!3ig-sxHkR`O&)Dm{w6hj3HK7W8tdv@Jz_St zZ+raXHaM*MXYzGy_2ucf13OpI7BB4bcR&ca{L1c6?HzObT#tX_di-ts5&KsyU1S^* z<=QkKa_6AxNS~!uJ2|x9Aog?Gkfa`+gE}N#Z?57}zKMKd3x7izN zI-pO2C@z59R4#g_LQv#=TjYg4`yuT$K~Z_V*su;E5zd}1%{yLy2rVJ~YXOnq4tuZ%BSFAEPt z&m$r78I>*Uv4)bLXbZoX@p^a!Ql5avBvIW8HIi5XK!g{ao2=qnXvp)-~!fGAG^stj3K8H#Kw)s{tboL4)*TP>=rvDh1?zCKF;N#kq?JLXEzl*u7DD$ zi1toI=CcWgK1(5y4~FjKqKS+rYM>NZwz;UILx+q(&=d-CZMp;Zehy%3*}ox^6K=;w zhtIIMm!IX5{&o9dr2KDJj2ZqKa(@ixzFVd{QKb82%6ZKL$RRWjNJK1C3=aSeykJUW zgi8tx(w;S9y0Z;uhITbNc}LzCdWX3le?hcvm2Fv$`Cy*1z-W+DMJJtd4s9lOP3Aq; zH~$K`+2`R>grH=#0izA?2odqn?$dVrzKlJt$d4$`52n1Da-uy(;j=1nFegqg{9IQ5 zU`STKL;L8BPuq{mWz%iMu^wCPCQMV}`8-Km#>EDOxk8_JW2)j-=p|a zUZn;UhfE$7^?!Tpt49$d8ei=0hpOT;Y~#M^d=mZ!AIIqG9PR2HYTxx>%C3W_LAY1a zV$ZX`>DtlWzoa3eQBRX0RSYPyMqo!qE!KUA_0!cCs(tO3Dwk1gkaHC2L(h2%w(8vU zL*zTv?7g(ZS0XYY$<=wItMgK9I0y$xbal?g2BzvO*!wPJ7uZt{z;Qry$8h!Nskdm$ z#9jxY#U}Uau{&Z;y=CuS7jx<`REp1d=}u?HzB?W2UwUIRj@}ugzD5}jlVLYPDh8x% zST!ZYQ$wDpcj%^|FTBUbd$>i=ciBdP{V&lI6L;R+G0xHn#9pvXJFkRE(MPA&;H1AH z1_$46dJ!-kj1F6$NB52#XJ6W(Q=hkOdKFK-aq3p0XxmCpuFg%=)~MU5!(#7Jx8R3? z*Hc)fj-27l+rE`P%x(G#gF2ke@GfW?N21f@dVF6;maT2mUxDb&z*D4qD9{FOoVxWe z!h}*H7C3~^q-{INY1>N7(1RkFr7mc|mev)a^P6^xqmPHsMo@}+ruic!9$l%0?OSQ1 z#wP69cOmVXzUd-7VJz9l+9y-1FG97iH)(GvG zGkf;zQ^(X@-A6C8?^0iDeqU(e1)JrS}mNZSwTt{->fB;d$LgOIq&XH+dO<%>j?$J}>X*w2r^2o*e zIR;4Ty&&xnc1d^rco$mp$oua`c6rrZmDHxjE4PMl;%Z5it8>m$*W(8=_HBq!yE|qN zjl6#vqSbxtot#YvsFpb(az_*$ctw^rU}@VFL}L-@!qCVW*-82JP1`2wjA%Q!%R!1$ zWF|6D4kqp+Vw9zs*v1)~{T;;<{bQ5TT5n``;)4153k_45}aES5KO)^*=$mOn&K266gsT(0G&3`UrfY7ZT{knk zKXTen)9ov|eI42DZl;!3?(MH9%hid#74cq9ycnF6d#>#Mz-d29w_|ksSR4+}-+72< z9PwO5JRVo)JkQmXWrXLAdRsS9WrmJeeCsCK*wEG49XTB<_Gxb0{vwRidLLB^ty~4P zKC}=tYp&56!9AOqSo6d>kWf>=^tzPaJ+#f6XJd z@KE-Q-bs%*LZWpLMpid^Xx~JAHX(jN^KN49c_gNPc8iK6Qc@E`J7HRcY+)gq){))1 zkP7v`Jv4dN+()x|Yewz(^{;;Qt5Y8x{J0}wrn)y}S11LQt8m#+;!#Rdh0Oc-N~sCs zQCo<*^Rrp%8{NH^+23e+b3@kbj`g0=YVQg=oDj1XOo<0{5;Z481}C={d9Gj-Oz9rO=bjj9TJ;%QUhQQdr@wupUiW{hpw-l_7K(b zt1lF4OXaHD7+pQBa`fs^{evn;->RpE@`vX?Ia?}1jz=8YX&5r)PMSl7nG+Fdzb!v? z%~0U=(){9!WukuKd_K<xkL2_B!)Hal&`kas0LY_xy5;lB^ zNh*9)7I64cjM!8xZg%?0i z%&wGs&~2k?!qxdA72Gjeb-}dux}kRehJEt#m5DL)>2YDGHX= z>XTvh%S;l~TseCVAy7;GVE$ls&&7m9=sN6)4)&`>Nw7#MHeO0dDe4{Zkv_Mj)R{_x zh>6QWK(>=q7RogjKu*siYc7D}YhGVzw3GZEWMLT)bL^+tIxMMHlLT)F5%X#^W_U^C z>U_!GO$J>f-vi-D3ww8SUsJkGac$lQ51Apr=Kyvjq&I*4lT8$|9gk=%=W;0xps%&w zQ^T>LmepoKIo`Q5=cqyrq+p>KZE#aAq!t(vWKsli>CIn>2vYIL5?})eUx>)&i3oB$ zK_LghMV`5+*t7`BJqzWrQRpj(2wp^+tfinEpeceU@o0)*E+Qx&JOcGJX|P@d4va)S z+&0g%)U`PW0-Mi>XsNq^H!CwlTCT+tYKwVlZrmv^*E~mfIP};3NA@2n_k<8O7pG>G zdl~?h;~cGWPc5JzPSz^-)Bq~NSzG0v^?(A0Uk0=m(89y79Kp*dKuh0#HSnnNAxDSx_08bt zxsVWS?pBC`x!3r?Q`Ed`$5x$Z3U~rTTE|Kr4{FfsQIjUY@HZ*Soe9lnS}(wJT=SW^ zSWx5I+J^F7Lxo(_#7A;G4eAVfMxBX=P~>-&p(3DHNW zB7O~lTLc{q67bX{o=Ct00wgRAw-JFRK(I!3C(9-stXjd29QPv5bg=wHaHk%535et) zFXHY#@<-egj~u`~{>XmZoe(OE;}+Ify@$0`Mf9^O%G52MM<8k@0;uO7M92>OmZ`;Y zGlP0Js9~TgCMy|%vg$AgI%T6aSYZ6Q0`*~pc+?8*sb-WO!AP=bUMXJzta}VQu(;G8Qky>ox$z? zbtYQ%t|=(4;1F-s25J2v#^Ku7iOf{_?8q56twy|C?gwJV`5OS*a;P9B%TEBwi!n;0eRHzN^? zRPLOv@^O+g)_w@w#2JB4flF5TM9CRk@-Chs3ZBY?!WmrphR&eE*Z-WdS^8l+aeQV6 zbvIuuqYhf!AP!*k549ZR?(b2g5JrlxH1$P9I4lPrp}pv@qRNgYNzU#7V4uZjzIEXB zwI=`YY%Tlc?+QJalOffmJBM@rt>Eu)r0l^2Oa{g>Uxb{PGlLnzr}3L{qVZyl)|9=_ z8AB!Twa0>HV^^r(;e3<3(5NJqrF?-&fv(wj1B!MbnNy2eF;zXPc4KUivM1y7H8q&~ zY+RCdsC~+Wj<^Y~&hNyuV{OIz&JlkGY-b?j)m2xiyHI)Z;LVMbOf<*U57%)EWmdnb zVFuIm96_9Qe8XHU7bVq4MOeH%7E3IUA+srSlRHXnWdfxht3v()r66kGkgW~t!_&PhJm$M zOQS)U_a>;f)YZ8F3t>LOLYOm5xdAi_?2$b&I+C~s!9qfREOE81jm6@coA9s8#mpDb zaQc|YuHhM^^pbTtbK`91alpo|3RlaUV8*C98KjZE7}v%YJe!Cs zj(v>~cvhMTiDq&r zm&5clMoQ3>uRu*AN5RzRPNo4W-n0~XuB}G(P%RcCjjwLIZ!1I+MGD18(Y0;e#;79C zb+nd>mFPApv5AgN?ya6~ceVTsnqW>YrvD6q>*@RG&6B2J#@DXRG@prC781NU3>dS& z=DCB4-a69W82raoxAAPX(F;Mr3D1OJn%(Hwx&?PEAfo12A8jRIB5F{RTXQLuSf$Iv zgMm~9t2K|!4jDNf_b^f_<|Cbam?O<-BnlrKXA+M}OZeb)JAClh;Nj(C$7n_s&UUSd z6q%iD@iffz>a%EZa-bZZ@JLM9!iKVCXpaP2+3579+u;jvPq%Ah10Zvh@B?iu#!XQ_ zUX1A?AH_sovDy2mI#14cCzNdB)`#8km@Vob@7a9M$Up8SIbdpOpztahYPW91XisrH zotsdN(fr0kFcjSXV0Ff;t1mZ24#N%-D+ZG4)&%f(IJ~aT1S}+kL*IyJhzOv1+B%(N zW0oE0n*jE%CTk)v#}kixk!Pf~TCloplb6`qHW3GYNJwuMl?$Ge<=KQ$rjnDOMMM-A z7$rx5er{2)4DgCnV zxmtb!8mpOHPjkl%C-?oghu(Xu?;PySIP7Yn4r=omQ39_3oYvR!=IU&2Ur-B~<|nCs zlJk>PB_+dBdX>Z#MA7>3^llOF49+y-j9*!nP(ocT^a6|PAtSNJ_5nArswL$t1z?MZ z5~>$NvH`mIVM`6Yh0|my0E4knF`!fKPz=1TjmH3)jD%4U#ce4Gg9$OQ7*iyuFUb6u zSd*F8yqh&OWjhKhnxM$e;p zeJjt25_FJo@j7nQOe!@OqPel-bhC2L7=rfkW0`JfI&+YUh$+#!h5s+@OCuwb0seRG zdn(UKWh=DJ6vO{lO&mGS3#F69h|J3=5(6aZuX8$P>0_o7Kx)VSRa;3H+*%pgok0Ef zOHBc&QpTG`@k9X>d@1yE8nn^d!~Zmslb_1i<5{2_M9N=dkVaBQ>O)MYra(vBrF(1& z#%8qoLEVD^LYJ*69V4}lU|hz5HRd6r&Ks}sq9H*~IcRrv&K)w_)mdZXS9`!Z`1Kxw zV!Qw5w7&tsDT9U*=16;B7>Be6hex_bY~0^kgh^<$z%*6}4{iDy@2GljY5EGUzM8(a zhZB2C=-oNPalP5}QvZskuN|RulPL`4u+Eh&(e#z0Q4BkTh43CJ6~^=+OOQbIL@169 zPREdd2d1vhT{NP!ciFr23=rcHcldHRYl3EHQW z6-Z2y<8%npQ;;ZWP4$D5s@izrztc@JH2+N+=)d8?eAhXM@5=cfSO!_(x%652dv4!#_RQv*x1+??G5*rBJ-JxuMBix9Bqc30?D8|EnB?$pD^!z>{K+A;q$C6vfYzjauaGhISPZ)4$+Pv1g+>F~jK z-aWZH>$~Yk_8)$OKwD^{Yv<@A`>F7vM%HE~XIgVLvfCq-dF#kqM=a6wcW3=zL)1S; z`^i%aZfZo`7;4zUMJz+_b5K9X5sHoMbGG?wDA&hF`i6!Un27Wyg(n=*5a~@yLQl(^ zp`G+X4lR1<_a+|lRHH%VMdfC;6+_WsO4M3UJRl?F+Y-GuM2+JtYWT)dJ9rUFW+G|; z?nsWtT*D}C9Z?@pM-=b55OzM$F7BLO2=Q@cT6c5SoN8L0b(FFlZ>gv>VdB`7h!@5B z53){$WmE-Eu$TwdN$kk8X$eygBfRC!@F-Kdfr0EEx#&awTAKXO`FhLA#CX>rCc$Q_ zy`l5CzInk$b1~sl8An5QEGNT3)U3VyqQU$cR+q)^%6iln_726MrLV2h(N^!o>C7Zg zKS391Ph4TEC`;Kjr!6mzWg_iI8PK!Yjp4a@Y)R#T5~WuU|8KFEdM0!p*PrN2H)W!H zW}KcaUl~VU>f=;F`QA%iJL_pNAJQcz40Y$nNx6G%R4>9`lFCxfR8X~w_eJBG7iL!v zGem~R@x9@586GYMucvNT5==bP-ZQ6dBIQD!v#nH^xk+2z3O=c?nVbmzM| zC%ZbYN%=CIiRE&R>zO&x8Ii_zJXtY_y&Fn;xm5>^9_-bQ@ zIda+_8WVY*&aG9nVy%;&%BxkH$XZxIprHCmpabMB=f{UU>014Yb`};+#k%<^!WlM` zNOZeksRH7iS<&|@RRvvl21x~Z?mSSW0)2jjH7CqkgV^*5ae7N0hiN{l31?y@C8{i* z^h*pHO`f&QP9$%p^|k4mJn*CfXRglND5qt-+AID!$_v}}zvHfMqI<@sS8;cJuMhfb zt37AoW0qH#fR`$5B{l6Y1Xo~&XD{>MS-z-`?~N7f;hK1zr>*@VTJG6&W~eK|FHP>- z2U=I>8GB#KJ@_yKv2NiXJI-l8>&j2Dq;Matn$i}0+Fzo@r(!8*_&RL~>SmUA7v0ki z(IV7SpGS7SOOImxr)%Rf)Ow`L_bx-~PWo%zu9l-vkIbumV77fD$U7EZ^-DQ5QrZt8fzLS|$=O%+#&fI9ikl~1@8htf_J$N)d3pMQbK@)ln5Xp zg+9#@9KY6aPOQOjGROIVuHo1&0+h_qWI!S|IyYJH76KZ_9A$t+918)7IJN*1^6u7g zPXY2U#~%S*&d}R{=q!_1R$Vjh&~ z{D1`AHbA2|^Z`Klg9bZvT$hg94+x7x5c(ycTUp8(Kyw)v2N41{3Xrh#6hOkJvjHt< zj#~kVcvk?bW?X}g+Xx7Mh~xYCfp9<%0;*u>MLfJAKH2eguL_v^S_fT*#JRrUcAar_m~M#jCb(;WvS;y8b_ zICC#nNdP1`E(7#)=C}%wh%FV6;K&5@Fo)*qp-TZh#JCkYE(}O;sDS>HL+OM+A@2b_ z^f!Qn4W0!gY_LlYJpV4N z!I2I~a1;W1gG0;o&^kbWVO&VZZ2%-V?gjKG4*gF(^rw30Gk`>j_5czoI;rFAXcPo) zDIio{uy`Gy5e(g-<2LKK7j)b!I__;9cT~q+jfO(VO9dq4`E*>dj@t%Eg1`|ktV%g_(?&|d?>L;!N@w}3<( z&*-810QGR_%X;Xa_0SIhb#Z8~9{PnI8gnVWXyi~QAR##(kjSI!0G;B{G(f@+ZUXdA z#^nGK9HoE+$9zDabLbL1^bSCuGA^RywgM6yKLgaup^xgJPw1h$0SP}i2uS4l5k2$^ zKu4MPD?mb*%Py1U_bNaFHwDlKOm`z7kuy1fwEO@ha?s(H94y03KT8$d%?vg2~8%f*0V7SO5pfP}oC>Chv9 zzCmcLvK^2}+fF^S2hbS~-LHq90Cbg&I8Fi*78-ViOwk2^M2ap3BvN!GAd#X;fP@A) zfav9EtWp3-#5-H3`<_m>84wN0VwDb^u162u2Z)AhvC7MO=rKUFvr4S;nU0ISQua1S z0~*btNq|JWF&^|}fJ;z@0TTKp=+F&-rmzj>0h-Rdivfw0w*i{QxVr!ec@F`)o^e0d zaZdsgHh2NhRL+k#0i`kBdpg}`I$g|Fl5R90Vbd!C37gjIxbNz?zXPH*8L`U8fP^lI zS3^_AT?$Cxt^*`$y-Ywtt3`n51A+u43`pqL42Zs;j8!%h#5&&#NN_x=)9nT%Ec7m* zAai^ONLXmZIP^ssHxiJLk_1Rd84pOrmJO(Y=>j_4ES+wNPPYM29@A~q>F(0$eyr2| zH=rD*+ojX(*XiEW>3RVP>z)E6tlOv4O-ojkES8c9NN8UMNa#EQ2wIkqpj-k-;BEjU ztg#T#BId0IB&_i$AQ4+9AQ9VpfP^(p16siHhFyz3CiA)g0ZnlL5_GA6L~LF_w=kVw zrz_X#mg#gYgkw5Yr+ZMRdrYU>0jQkmcItF5=yY%BbpHe-QW>9u9nP3zG$4`6@qlPn zC03aXNN7I|kkGyWkkGyY&~m1muhZ4&bZd1w6;L(PeP5^hp-%UhPWK!jVci3Ogmn+; zbQ8v78~`Z^N+uwoK{+6ijs`&VeM+pd8jwiG7C^T%?ruOL9S;H$>G%~OA?0a6Ynbji zoo=5_cUY(U6i|ri{;AXT>2xkcD&)BViF8~CNTg#bAQA8P0euHj5|p0;5*%HC?q|t+ z0O1dzNANS5pQ36y^Jj8xBa|E(9dvNCQL*+G3SydT5RwS`J9)HxH1| zZ>b)NquaGw^kG0MOZg=r5yy5t^rngU8i+%40Ey5-K$BSKg@9T(v|10n50FUFV>;b$ z0ez3@p4RCuO2ynWa0$xgfP}p9Iy4=S&?*~{h__e|ovTAlfSzQ@n*a%$J_tx?@Jm3C zbLejX2`OEG9%I}d9d{6ru<2)j9_7$4^-xkygvJ9BHcbRHl5ODDLni>jA5v6`pZ{Vh zO9B0Yp%s9H20ze4e-7xU9Qv3ZdIHc7flE+M0m2`k5lGH|GTjA$gp`W_iO?y4MENKM zL=(xe%4|Tw8X-W>GVXRjg0~rvNYUMZgm*py=xL_guG2lE)9u&k-T*X;wfYFqNQOQG zB;@(i6yI!1SB|K03`G~07&q@3P?!)0?@lG*#?B5yAV(X zOSu{lltsMFfC?D;9iUP`vC1C+-NcY%nw)(b4k*aD5FjC?8IZ`C-vOG#q0a&mHrNm7 zBx`U;r+X97NYEuHM*#`D)ZU2Qb~)vZfCTS$KtggSAi;3}5F8Y|#{m6@P!52Ene97kv`#qzJ$CsT)&SGAR z5H{sJ#<$x=3SyP3DdTv~jDBP2hU;Gd9Qd^>b`DR$LmZxM$~b=hCnBcsAK{14@E30VaC;XZ?*2HeXS zYQlXnL)&mC{7~g5xNl(S3EUrGs0;U}7n!2KPDC}TckXtp?e&V4(M z)N{)XU6u2&VAJ?H=hQlqi$TjyT94(AHu(XAa&TSYb!_MV^wOY+>|x>d`U)xlbHM(Z-jsSk(T_0{giMRm)n zCJa}6GkwBT$P_-a)=h`ZYNp4jfkfL-yJ$%j^Ot09Dt! zLpUK(OH6H5-Lg>4;IsqDWW3rbiCWaUEpUQjt|k{rTh_Q}-Kr%xPtlFUDLLVW+T~CO zPdb&J4n{4iCfnubWR)w$%U7);y*Yi0tKf}-jlEGMBtN$#$C`$cdN-fRN@hhyR4I?W zFzyCEHrYMHoqW~OiIez%%xi`lnP=FAjzf0CsNpL2nwqLQ_bMC`>R!GId9|wEO|Df{ z7c%&mnqA(#W_hT_&9Tf#HK}K!&`fL?zz9<;xn{ykLo@1I3_~=gm{;MjQ>$T&n2j)N z%qF~ynNi;oGtuaINT*=KcFU2&4fXI~Yd|C1dJyz79PwN?SioY+3Bj;z?To9c$GexU z{)a*!un-9Ik~90^=v29x2Q_ulwe~$6*4!S>51Z2 zRlC%^QY*F9jrC|2e7>NRy{xXjk&1Ij)JRmrQ7FzwB@w9E^sK6@ucK3s^`=8_rBJ3# z5{nnrqE1*T1&JgWZf>Hq6fhHBrk7FQl3t=w=y+JIST$CCC%hb0f~eZVOJu8QrlDHD zw!Ute8Aq)FH5ZyM;gn)65r%BtWf=7>dJ&Ccs-$sBF1IafU>B~I7S%S?EP~RD>guX$ zm0QTLB5qR)FsS#EP*aU<#G&iQD3gBqdZ96hWkLt5%{c~xX>nnmtj(9#Ev;HBs$#?@ z-P=SkpePz)gC>T8b-kI^r1xODX$&%II;URC`2kTIVS`3Z!Ftq8`z=v3gW<>xIN(|q zBCW}1lu3$VB7^u`h9@dh*3yCE{bFF$pfMQ4=Zb;PC`V&#>Pph#;cgr{zG&sD3Cip` z^hD~H)uG~8>PAsQ7e)3(soTl4)=J4>M>n)_757dpjJl1Pk`Kx?8Id9%M4%~&gJ~OX zY^YyVH9^l;b6!steHbm3L1(FS zO=xRQnexb>8Qk+IT!E%_^=mM|YFr*dpSo7drrfomMpXA0uF+5kg^LS<6-#Okg4T#9 zC^;yaf}be)Fc9-7Np!GTfR_j-EMGcq&q}2auXpW=w;E@OPe@J0pi{$4SW1JA)m2n1 z2y3_PBG7V~&%efy6*L`|aC(@)F$y%#U)V0wXnqoN?*zo98lYbTank8jbOT={Y48|ALF~0sJq-zk#_K zPfZrgGCYZk;-c$z@rb*`v;n612t&>Tcp|fE8a5i{h((CqCbdgn@MNBtkpWuSPB&ac zgLIj=h5}=^VOa=Y_Xjq7Y;XbOi)e&~S0ZM4S>^EDjg991=sJ0#5qH6ZIbDs5Xsler zfU(=ic68-0c{*rt(YrXhh{nn_92mQeW{Tm~BY&gmzmp3BdK}(3cvd6y%l0MKl6jaaK7rQ)#!2 zBO$mBq+In~$%AhNG%lhM;C71~;*fKa!hb3;z^}z9n?eka+OKm-Ie*nLZb+^~ld+^> zonX?_ehM^QC^&{6o<{|XFXA#=gXZV#HkyZ{YuuJzuZ#(6a5XNX5z*56UN;JtA$cBQ z;3@`Yl^&PmY6d0O6DbnDq~r`8BWVf;U})vCyo8+Fbc~eK4op0z z`-Pp&8qzxeyUn8sIDGd<{~=?-8$3-8(Fn1t{JzFYEOot4H#G}hP?fw9}J!ksSHnKf@4Tr)K;qOo#~1;%cp zw9xhBlXJ5Tu6B)!Xslcp0b{q3G`gAn=9cAG4s>pyt-A5t!ABaMq_L|lK?M7gx@JYEJcTG`OZvw*r?N|5mQcfiZeS1#5d|8(b?j zE~2q=UBO(kM>O=g)?XT2k7`^*W97P%xuhQ!|LAShD8f35@~*~3G*&JTb4fqExNhA( zgUdx7A6!IZ<)SiTcyG+l_x#l0@@ZT|W97PnR<0E0k~SQ^=C=`p>miMcXoRFg zgaPqDi&4#N)FhKC3jLA?D+e?=L}QH|1s+^fbJ7(){wuG+HHNybxQNEeMZE|ku9__$ zeQj{%Yg|NQ<(kM`(yC?U*P85ehsH%TBBf7g7^804ZNZpxIh7?#Z~5Y~Utq*2Eq_Sk zA{whc)MOiV=F0VrCf~RUJukY5#>$042rgM~JhAzoe>dV#aAbIG`>KKL=}TWR?X8W+(B+>^k#QOO%ENRLJ%a@m}xWMR9FS|7Up z@WIE(M=ALojf-fk`b-1HZc88*T#LWR`IEtQ<@o|jG*+$~fiXPc_nu9tR%Kje8W+)6 zxiXkb=FZ(e+JDC2YSp-i#>zFFxnwEWT~}u_xSrOyh{noAYYU9rS$pqfQ||O?Tts8# zx{0}D?gVyhf5C|BQW~J(A{vp_nZUT+GIz{*kqH{REd_VF0%z`r;iY|+XmW_g8oL)5 zW0bV_mCx@sxPGK@5si@aXALvZ6S7zim0!BrUYz_d$%8(>#zi#N*t3B#%FeBqTwP^w zCB>5@MIjn1mk$_&t8B|w6j_x5y}IsZgDYkf0&x+Im8%FC!_Hq`yW&oRi@x-vi)e(MYk)~b zw`yR!Tnrk!?OGzobx-QQHcK9i1vNQDBjh}#VFs3h63`ee_1^0vFuC;1ZjFm*tf?qv zF6k|HPw~qJ*B2TW(O9{H%q45KK9|?THBK9V5{;FsjJc$pM|~2v&4_D`#ziz%u9?h* zV#e1aOAFpNxY{%>qOo$#0>;Rlz3Vrja+22Q(zu95;ONWOuB&D4P((wd!z%86lFL~# ziVR;D|NF7oQVLdrX*COVU z{@i!oMhKRv_*CN}8Y|ag=8~5G^}kA28eCV6K_D)o5t42OCOF=l_7xhd zbIG)Cs=sBe!8KA-foMehxxhSeojL7uq?!Y2q-8AmV%+I^D&=jHK1($&qOs~z1B}t` zOxW0YyNny(NN8L{W93?I;fm>d`J}=1y2eE`R<0Gyr8OtY;_<(pYH*#enS^MpT(>co z^yh!y{+AaGt{XKjqOo$-GM6+~$`yI*4X))H7tvU`;E1L?{qe`YuQ#}UsBsaEm8*`q zv|wey&wg>j;Cfv{6OG8zVd%~@q{=)s_n#3NVwd(=bpH?EmOR)I1YC3xjgaHlFat{g zs%*${61jd!e=gU!h{l?V?*L=GrSk9k=W!VmzGBn3h{np*$Xr+9PS*o7?|swY`Y(-( zXhi(<^|`#Pa#jItl-z$MO`R=yuySAHA{r}Kh`D4gAGz-?6W7IBQ6L&CSD3kEUu)U% zNk25=qOaZQA{r~#YG8~Sd+U)QPa9mDH7=qNDg6U5sgq?c1FgKM(G1M5H7xl;BEr@7 zor=4q6zngcaS@GGpS8dkeTk;g-7bS`m{uhdjg@O1b4iQ6^Su)&+|oC^8W+(BTnLzj zX)+aNU%j2>pgYBvcXi);k_YqdnjE4La&~H%focCPXzVt02Kd_f>k+R=9_%5YaS@F* z73+a9=2u7T3z)c^mk3!zW97Poxnw!@Z@3ygahZ0X#ziy&w+5JPQwB@>29_grUR?e? zvZ5YwT!-O(}isvq+P{)va+6jg<>T;2MWJT|MpL!v@zGjjIVER<34Xj8VYk z8Q(+2FEyNUDFSg3jg{+rz!>jA{xov$9D}P`<02X>SA@BwRo^=C6pE>g>n9o)(Fok1 z2y?x(Dq!WPMl;YiHX_tWMNVVaA}Iv{ml3bnheb%9q+x^{3Jd5M$u|?2)N~oU*`HfL zZ?}ymHe5fM{@dpy58iQTa)`#7_D#ST8rD4WcaulmuW=ELm20zw>-5F7Zy9mz)3}Jn z%GJtTS{Gb-ef>f-deY8cYg|NQz(GErc_eUvZ_#J7%Q$T(>3Tu1q;W|l zKHgZWJuRwT5~f81mB0%W1y=GZ6OMuC`LhlY+FutXGqcj?txWZ0dy9QJ*#$+pg zrG$yESM=y}vb_G1;w)d#m*dSrFye1)q!^di4a#dU`n8#Oo0nHoTI??kL@ktD zNMx?e#(+21m+#BU_WzG$RAVi_Pzoy>YwMR(l5WVQ%2icM!dR)cu5w9z{cX#u6t5Xo zQ?=waEx%%C=_0^eE=?f-JNvcY!5!Hea|;TMq-x)14VGG; z-|P1m1d0lBO}a|r`gDP>T{7|H7y=ga0zG2DKMW|FnlU1!XS=u9h>K9j5<7+)V8GdheP9Vn@DDZpv zOCV}3b4s|)%;$D9bCUR)4G#sG*IN>klkY9eFDWi8DS-{NPj4*#Na|)z<?2d zvlz{HNmg!FQ3)g%jDlLLRq3;m%&9^pD3q%6!tf>eS%DmXcDC8@7UsbW@Au{x`}~E0 zoC32~nc4bzRY7iUz+Y6HJD{kZgC|%T%rD4B-s*LMAU=mH`h2DN{yccmSzM6?2v@AE zt__8;+*(vcnuGACaniG48#Ji-#W1T;D-gw?KB>EvMFu<~E5ESVkB*9|_?d?W;K;6)W!RG61b zo}<;(L_ofYuL(1!@@Ie+7taoOi%Ww3oIo)Za|;hXG#r$pz*|~e5(t!JQzlqA_#4DQ zc~FOyWas8(=MRX5K2Nl;=$S^E_pb{q$u0KgXZZ>X0;MS0Yq?aTA6%W8iek0S^0?R< zy4VzIE$~$KvV$eT+(40cjg@JQi3u?@T0>n-k0n6qK6X+stNh?*eqX^Kx^GOEBUPUmeP(NVXNs zYT?QE2J?J@V38j!pVb4-;osTWg~9AxG=6$Cq8l+V8ukEL`soWv-6iOINzq22-%?46 z>GgbxHyF&#E`eg`!0Oi0>sQq7-&);g=X!m)d8Gw`>?~u@MNv|nPala|OHQ%ZUz}A? zh^E|}KZ5?8`IGC<@f8M2Ev>(qt)H#^CH^dbQFhV5`iE5$QT5{q=4BNZW)%jE{1FkH zBY#SA3QBVe$X%rySo4Pka5U!p;V(M1`o~w~%?XwwoAdL$LGeXu=2ZHsmD+xM){0)Y z6ipwt(l|_V`nD?K2e;{UcY{A0LjQme7PwG4Cpa)WunV(LK1A|{B>k%jQxJYQ+)S({oGFdz&0<5#1Ip>L^YOD<+1inIK| z;w&#w>5Z)XZdVSb@Z~N~FX$PHq7*3b6&D7B#a2!pe9`B;*0NMcUFjlUQC_ZNy;ffyCF>~XwPNR0)JsiQT|zLEfz4qr2I{; z^zA}#0Y+e@fr2crWf+2wjK#1MUm2r?=KdgkXKZqAvmCV41qCI=r6qx4FMWWVIaM=> z91ro}#*$!6hvcIt?hoV`g<1?9WTndrS$O>3Kvq#vjz1rTS#C6;54i?Lf$E|dqxXDt zk94DoRG!tSXxBu_wJyHl-NoMGf>M8eFw4>pwJ;8r1XLGjma~Jo`DWXi*(_O6 zfQ~B2v-~ASimlnltQMYpRHQ|D{(L`%1JcPw1ZT|;^Z@*Re{Oz3ff0?h>Nlb>8U?A)`~t45?|`|$VSx=4PK)kwRu<~5Qj2SwW02K{C8h#zpePW`Dk&*43~coU z7QsB`wDOngdRqBOYU1}6WakG80%-kA6$+7@C9OH7!9X77OpUY(;&Y_6Bs-@R3D$E7XsoiS!1&A_9GBiNDmBPlF3t+)WYjNB$ZY ziP9O-&niR*BfGdHt3M-6>029TGzmUmac)+=WoAJ{GiZ0mmlY_;4g^i313`R_9L&zj zDa`XB2AVV)%x+>6fqsTV*(}W~@cS{xaJD?;m}%1<7=iRR&&2C2YuhD2bv=Q|G4T0)`N6a17)L!I$7n+YV<5;+GXMN&^9qY| zi!eiKs$qy^&>99!RaS0k0s6}3>cUJuXmtTo<`$P01@OYG|J=5jcc9|5Yl1B37{uk} z7x;WU4`OVjV7NTJiqJMOK$$mp1@XSFaGv zW&++$g5P-RvHQ>+$_{21WChRhmQPPIqBJ-I-oij2KR+8&D*DUR{)0hOu2ddLRh zmLnbDUwB7HTUZ!nLqmv{+pF}M+4q(tD&|Ygxj$ALjN6$tL@3m~okvWxj<*@3L=grN}EyW~ImbGAMFEWhQQL_TQ zp`e%j!zZRqo9Z@QlP2GgIwc+ND{e3$0pe}L_19nTcBiGLPsR_fg~N;Rjl(C2&lbj1 zi}PM+?Sgs74|?8(|9{yDGF`*tI z^Ijhm@<&L%4RqJvEa(p5$E^exn%A9B2(3h0v4|k!^2Von&AWhb2o`DF1G;;b2s$@@ zSU=OQ8Wb`K|9@Iaka4lResr`#a7dLwLy$M#>+P=}(VZ6s-9*q`IDii67$n}D0d#}M zTNEW-d6abXqNH0IC0%WlbaFQgvN2tQ*_m8#{Q!A`+plQ=-9Y=1yw(A91LYCjmMH1A zML~B3@BnBz-No#2~UKF+-w+jya-oG~taLh6L6si7!NI0G-|#(7JtR?k~i zy|Q-RVysrcf{a!CGtCvhpO`STgcKPCYGplN=7Old@haoJGSTYYUg&S$f z#Dx0AE7Fw<;uYk;Q006G9k)l^FV_v=PM&#eA8*4FI%pUif{zcdxD*Gi;-vd;aEL3Np6y(d+UIEjnWFk@uj)J1*LR)*M{4ue z_FmdtQcGJ{_g+{-;rj8y&DFJiU*OcgSCYtp5NlG^6?`u^S5*SudrtZgN= z3wlThD(wY5>YUo<_xo_>W%B_A>a@+FK#2NRU*Ccr98Vg}Mdt?7`LZpC5W6GnV#R_- zi516Z_B00?ngHTlayqcsIY(`1s8FZ1?MR0*>N-c;4m$9rT3zQn^1u{=+ID#H)4GlJ zLxR{u_3KmbT-?|E5h*|7o0dauYa1#TgodANqOF!=LL+-zPnX41XOua@=iwe39@-qJ zQBbY+7>7thKWGL;$cl^?&se1H70;35UL3~^)6b=I$;%_94c^FlPYsT$(N5-V+k67i zAw4*0_~eFo^)7mBbs*Dh8GF{BP-{I4Grm;kdFHydR>p#Gy=SR1hYq}jRoN76o67+j z0`8~BRtIv61$6lPGG4&hzwxduw6GYOEXDD=ke9Z-cPZX*HUCpU}7(aRb8*6)Od3zhH)oUSb5 zz2k0*jS~&3d7+xLlP#a%AmVt}R@&XYZJuXd@30O!ZU|!f)VoN1S7*YcjMvvEt9>}A z*49U|Uccj?$mMw*Q+(BGLahBnb=%1HIWb61d}~=u1cL36J+_Q5N$~n-kKGN)NZ==J zIO^TCwTVQ3!N+V1)gga4BRMguFkR;9MHbl_4H`O z=<1vkgXrk=+{M*UXJK{Q`S^)%g(mlN#>K%nA_qs(QPg|v8849z>o=$Ep9b}XKL3P1 zGR2(z_HN|Rcvq*A@q%m13kY>}uCjH+`4ACh#B?WRLLf%nm9hs)r9P;hNc%_1KU|%& zV$|-GT@R-1O4(&U0ohYrog>t}Dcy|u1Lds!L`E+T15cM3wV@o@I5)D_p~dg&te~=; z4k_wB08`Qqq#OX!ripcRjr}%`t)&Zc6I>f(&)kkFx4;(3_Afe?dZ^%+yE>OU)NPax zu1?3b89lC!FUfeF>xSU@Mtc4L&nJ6qA*cEholM^wtG)s);P45 zqL9U-SVwwoTw$Ozr?&=U!VA()P78VFZJ0yR^^TC)Me%Q=(x&d9*gM8gZlA5(nBWQz zho0lx6UMa8)(ASL<9PQm8Lx#$2u0fyMz)Tj3IkHt{{gi~xw?t`2O1@+J4sl(!`14z zQN2$~)<|_Hg|{bM)|!y6ZX#@Jl1;sjkYG=5jk^GDkqrG7W*puyP94^=pN!;cc@u3Q zFc%_(t7K{Atv{vXs8LqZJ^^Er>Ub3ANMF27O~py=Ay1NQ`_*Ihm|#M+tb>SoeP9E&9Al3Pxq+-b#YEf~qABD-QxuO*}W;VIeGS%7ks{f(=0RQEAE%$VAJ)PCwn_s0Z# zL70B(4RznCBkI4p1*d*3}>b0;pQjyFVH- zV!bCP?IhZhmq)w;r%G2}zcWUC4U(u{TnKoVeHUbt%a63@c#1N1-H}Mot&Wi(C|9?U z4XJzs0l!2pQyKWiy?#4_Yv{NP#fA##8t7>6j+}Nwg&NnE5>d>P5R{0Z1R0d%+H#8A zi+nBzMb+L7d&~n5O80*VzZ;Kql~|B?NFy^4%; zFI@#?A4{7?!PF8bZp4jepYKhS*){eZ8!KXj=t55#x( zCbH}32g2`Yzg1D5PrsN>(QQ(clzr80f4CN9FXffW1=Vel@c^saR64ojR-+3^_JKl9 zvJsSP3(Pgbxc`grQ(mdJGnCn0Hn!<&dw5KBWXDBFmg2g1S4YCV5URA6jqM#R(V^I; z185?~Hmyr^u5#?jN_1B5%^Hm?^ENbv#x*S(dqzB~+o-$TR(6ZJjk?QiWecj+ZC*gt zZDoroVmFR`yYNU8=j+YM>b5C}s_py#LVOg8Zf|Hf;)oA(9FXn}xmm@S(2%CDW5X9j zc93TaDko8mwS&sRT$*Mi$O{rjQ~uZ(dQcY9!=kbO7Kxqplr1#k%$;a%*UGdvIxb zS>h^tYguBuw<deFuv zj`r+fAdE~vI%mxW1Ke>=g?giFnx!O~m$RyU}Bk@D=3)3GLb_DEL@N&DCqeycav zB*-oW4dw0MQo14L8bgdNa(bv$j7^H68n-=rc>BJX{W1Gt72F=*i)v<1_AqB_!HBkO z2NeTQIU>j7XSLtrY&v6iZM+Z0KzVS_Rgg0T3*WK9 zK=B$Jld=aT*+V8n1(*0drMLG2S7(;p)p`4{l+#4|Jel}pk0XR0e7=KZrJyVH-|>;X zwzU0eT^V1wwo+k2`!lU*WBi@5ZMgRip(An>>gerVf3!N|bJxa`cqV2ZP@nJG{2@O# z;jYLr@k~d?L6|SuwP`=FYG1qa)niTX&2FXf99j1>QPIZtsJArPK z{sRW=%4=slCx-WsCv3(O^6S8%UbF~T9FBZuYhBP6{zR7mR@dX7rM=nm$?8hAC+*Ow zQ`95hV{0$EC;m`fU&dRF#|EQK6SUQ?&RADxiLJW(U1v2K4m3K~q z*W23TTSt=bVXX9-E&O?9yI=R1SIJ{W@A1Q3N=CHJaV($$2irQ@1J0(eV%7Lrb6hR& zK%1tu!8JH(^eX@zv*7{v*0EXu!-W3S z);co$#|5|c7@}fXlp5sWIU^{*3v75TO*1wBC>d^m~Waj8y&m2_FSj>#vC=Q zboV+pc2yvw6I?B+aEA6=RQKV=ljs{ZaZNcrw!?8lC@u1hZFOQt2|HSRdu1OS8nKg_ ziQ(SL)?i;p-1Q6g>$I(j8bdr722xLtceOO2`8CD- zf4KV=_^68O|GN*81)_Jsh`~l(H7XdyKmr1xX32{HN!SpQU=c!qgn)s>WEVscLpMpY zdr3;GrP^Ant+lqbLjP?O>w_jh38<|+s)G2y+FC+<+X9M`|M#4kd-rZ07(PY&`~5ED z?zv~qoH=vm%-oqXb7!iW>}$M*l=3*FjNWN6rc-U1Ern>rdrXJE}Sb+AceaQjc;@)s+kR1G^D`-(<`Xa>3g{!K2!1TqYfpDGmqP^+;KmwCg z9MbcFb;)6(Z9-EY6NJV2e#{}1%Vo&r5)E&^n>f+F6B&5&GDW1p5N`B-ar%DT6iuUd z1A+eu0BQm=8w2!9skc-w_UB@gonDe{35mfKCl3d z4`suJogL9l+H0UrCS_tImFq|;g!m;9kbAraj&xoKGQ=d!XWxpLzfl{k=9sJl$snXu zGRP2DD7u|1qpVfLxvldl2sRZB>TjihX}W+_LO|+u83KX@mxq~cPhtPsb&D?PZ%ESB zH=Cjh^8gcBZ1_1XS(4by>ultIL@5}8dKAnV;wW$&?<{W27&_H4pE{{g+)3TFFpyzi zfNtt8*-g!`FI=FP9W{0ScSfPxk)RC;&Vk1noocih4)mMsYTZ7#m(giPagE7WTkoZT zNuG;>aC6t*KG>nw&qe|HpD4#2z5;xSkB18J zuoVyWd(hQMM_iZMaEv%%G>iAM+H$`3D3M`cJes;A!Kl&H71?EJoEtY>Z5aXlwE)TM zH5}L}`x>+3F7S<*0+cT*nA;6|bT#HEU6X>q)5{ZYQ1lxPs9WGO@uNYs5QS}@+L8@^ zTVAm3(;7*}_G4-=dI%guG}MMi%mN39ORcZKh`KWs@(Fph_tb_-Qd-%*oDV6`m9apM zVL^HzK_MLt+og2FA>DAF1JaRX@w#NlPPk-3s$nb@l)9OWaeI zj64TdoDRa(()uCIaJ=VpsI7nQ+(_xQ-W(UFwl>Zq#tgouwsakMS8aVs+e#8?V;;v_ zQEjbQpkN>#hhC`Ka_YeQz-d#rsjX9s)h+O_B4~^aA)g}Tm_tiKNOU2J2CkC?+p+d{ zRkig+wROMR^3j3!v_{Gt$V8Dv{YGt#%0m{DU^Om3UbU9Su>>}rulqt=quIYUlnU%S z!oZ*r?IY1|MlM~w^kLEkN*k)_M<49E^9?FX?(_~~dC(_DU%M45Q@1>)ZmEciwf&hM zlaO=UpW8c;lRb@N$ri{UU`{TJubx^jh@38Jh$BL+ABFlN>I(T%jk@v#q&Mmccc9kA z#VBNYAH(zzJq86iN{k0lBeX_YUxo2u4f0; z1jY!oUQvW4UeH(lfQ|pj0z0O9!g(8IQR~US+*u&1$u6~Fwx}YQuL+{3;lUW0{)-w+ zUQbG!>I*Oz`0P`jHROzw=er zo~#K42oY%i&;UaB4^Y%if@18pPJjt;xpLeoO@E3AZI5|Rry0hV#jInQ`A(L*LCqWClF1AmM-Tu1=d7|#w%U+#N&zkF~fL# z{e?}_t&Lfy8?(A;kZ-d+i?N08y@ka)`W`DIvVMv8u@i;iq8@Ry<_JW^sdYbu7a-_% zJZdlSj+hFUNRX!S(WKPBtJbXtjOklEk)P>gg!-*fz~mPe>HdegXrkCdft;!8w;~a$ zw$xIJl7ioBqn?ZeMr}BXg$87CS||JrJK$+J8fSrDfF}ILlqF|5e3$%z2;-l9;;y^M zL7_c+#g4{^V6kKWTSE>uURuB3H-tIC(zB4KzDc|JKp56ae*LdW< zDXJbUm7%+Bdu)63d(b{v#(auno@zT90iiG5e`LtP`u&ZULS7O_%4Vhh)qboKJ*fn4(sK1!CBV}dGOS_M%+m+3lK%z!&Iz4U?rL$BXzC*%$r- z-7Z)ZQ~txn=_CJPiHQ6YYs`&sk9(AN3ME&jC$~@fI~~aKp|a!!4&R{QY)4lF`b@#7 zafbiwjm{(~=orB*0rbwYjr4|T?#M;P=pV|_gre9 z@MA|Cg`bG7Sn7zjL=9s!;RwVJ+Ezf+iqTl<;m$onM1I=w3&HfH!P|2h84)RZkYa&I zk;;Kn#3~67QY^IdXudFlip55m+}Y_PUg#CoA6M%>m$qM`^M|^TH7Xs$-!|`bFsmCW z9>5<8h?MxEC?KT22uLUX%B6bs5W6oESdW#0Y~hh2eDQE-*f{G&5EI#+J%}6|MGzJp z``M9=SyhQL$YYbs)GY`3EgZiWU;#?}K-q@vwHTIc2PbVWMhUjP z?VqB|Xi9Zz(C%!Epbj1PPB9yzbvhvpgbs<&x`KSByfG9AkKQ0OTO;M)Ss26z}CkJ?7j7-bd6sU@No zMr-$Pw_pq&E!vBj)E=c;%i7;W&UdS=?a*Df53Xt}l$(wg=qOE)Yw7h+h&`+87EqJb!L+(KZJK(NZtF;sRROg zWp#6V)ou&rZyHtS$zs}}LzqUlZ*ZA5?ensLwJV>p6Q#Cf4sL{%W;(i3Kz-}yxUD^1 z*8VnBazbsrle0m6%@3a9oE%iQoND^rjhvHRloOg0!mH>XywNeliopDr|P)7z0+aa-Tn!ZZih-y9cl5` zBvi=`*ojSQ{U0>+Sc^UZ+X?I+AS)5;#GpA+B9zA+AXXq$Grb$C395~`kYu{0F{1Nl zLTeb~%(OPk1oRWfYGWs z=VQp;?jlbaYA;zB`O%;SY91~VAT%m@E$3VTL|y(spjY66~%A&YSbqL9l!u?rbW{OsSCq+ z@U(N7O%Ll_3ZpNpKkiF|V3>iOL2pe7;)O=TG{WNTDIs()EE1%*s01TA$$O=?!WxBu zupC-QBZN%)Ey;-5ioxOwYU^sNXqw(vxBRsvspZ8;U zji`l!(}~?hHxb{yGutx}doS+b6eF1T$G9&=_2e6ImVBu_M;Xih!FKe#sEZJbAxSjV zml@C-wK6oZ_H}~kWlR0aX>edfqS1-n1XIY9?J4&!G14yE@F~pU0xj>80J>>f9-38; zweuZRkunU}(EAxk=b-ZsT%~S3g?9HdBy!WIdgF_B7^8f6S5O3Km-Qx@Fwx{7fIy#! zuFC<@MBHM9Q0kVK{>Ux$X}Ck09=nzc_Qm#NP8(c+70~@Lr@H06#;ViQBWuk^0lgef z1%k!|>Y=sfL(4C#t(fmux14VJ-4td8FN2d@4bH|YtM)NwUBICDtcsm4?X)^8l|Y)qBD1tN_rBP#i_LpUl zbSP%%F~rJ5^h99R5!* z_MeT1{O-6Wl4Pm_FWfj^D*Dw86M>iGYwpxXPp1AK)${1d7$5a`pb-;X7B9}nJdb~8 z6ecCrhJT?oQd_8n$IwM|CE(h9k~$KoVrtDR26hBCnm&=_&73B=28Q8+CbuB(4o$C*lVFL7%93np9>c1q_vUbUu>Xj#_K~_QH_8{D#GbBDm%H`|8n6Ju`JFZE$zs^7p1 z4>mo9G6S=Ap~Z^f8AH1-7lZM=YQtu*_V4Q6_a3_J)UDmU;mr?#(hjwsvJX8Jj7s(& zQMH5ZZ`p?)4BC@x-~0eBj3K)lhu}p>CGxzkFq&Y*628?lVC6wFa%sv&Db#-A^o;=l z?3Frd@aObl&nDY6isFpEJF`DAk5(c^)!yN-X&0#Vi7>-p8kPreea2@Rewsx_4-Rvi zYTYB0Z7c_y%ge#uq#SSeAF(u5Lld?(+rP2?Yk$+aYq9d@PY6Tv?u0+xy#DJlefbya zo*hGUyepg*->ba%t7#_IlG(tE7kps_7*>=S99OR)ZqlE{>&bZimzke6#IGv@Y{0Mm zJ)8ecvF^+EZ>;=c;Z~0!R=QZc{>#k95@G|z#Oz8N?AVny)Dg(H*WN*0?en1zbbjKL zrfg)ij{NE1o5V(p7SGv~KDK-HVzhrQ?HG&*1vf7FqjiIJDcxOz!7wfudnrxEj%$it zgEGC;%2Vp&pjC;m01OetUdoTSVVFzK$*m+54ANN~sKLxAM04#*b42V)8)7F>=iju0 zq?uz#Lc=CV(&doN=_X1#8cEL`VWnnNf8b<|=jaiXtTUAC9z9tk2%R{rNYDleC{3DO zzsZ=QMV_&q(BXdvYfk9Hq4AhYFN9U$)gM>C#~Y!xu61-pb)cd_b3CNw)ra8kQvJ(J z#`aGHLjbRjjg8mtcQh4t`~PNXKVr9a*!J7@tF60f4a4?*?>~v&xMDjMzZcC8`k+k} zm%<2X!ku60Es^ka97UZB?rwV%7195x9rHo3#r-Jku0b4`R{c>E;M>>vEO_10U7)tU z%tn{lP0iH$?kDk5Qrh3Q#_zSAvhA-wE)w|>kYS0~#Dc*gylhav`#+5^rD&tUoSxpU zt_91fV}TB42em&)iQ3EeL#BHQrpu|VzJXE-UW65u$7=s(IsVGU`|*t$qS7M90KA=Z{G(;?LBEQ z=njo6OMb%#3&slrW*iJ#KLC?_4J>x0I_$erhgds1p!2CtUlH2LRC`l)3|OXhug+3i z-`7s_`zG;la4mQwzvdeXjwoQ_I~aT!#27`er{xB{S3hhwCq)BYTAFhwe$hPtvfI?9&4d&dNU;?eyM!po-FOqcfABY6OrY>Ll6M&Sgul_qXqYI*DvHpG3Ryeg zJo$Aez2&HvLyI$dB>VvqewZ{W@~^fou+n7RsbJn`_?+WfJlp9RONCG4`C>dr&~tZi z7=7*0w~mIf+b@q78DUip`2hQTfQVGd5hmmhgAMuB`eovc7c0~ofs(Xa+pKLymvWd` zn}M26t6u&1b}_U-BbAre5RP9fH0O;Dsbi`&U%QyzA~E<7>SlVaZXn&f>%EgEkbP_F z55pj1wNF-Os4aMh-byolkkoS3NszT48HC3TZxcLpm#wY+Q=6^L|F_GAZV%c=HAd2W zTL*n#;G;o24ZqPV9?a6h5N!}2tlHFX-cPJ(>GKXL`As{fViue1n~de#_!YC+)YCYl zKu8fXg$V?4Y;6!IdK5myfgkOQ1*%qi2*ZMjjyWq9;@Nyxqjis~KkmJh^%MiK@HNP4 zlpJ~p<3tYu8UH|Ubqln2{C_`r=so{CN%`n{I}ScT^`eMAbx2pWoe`MtgD+8;wD}sK z)o&fb{ZIpa-eCG9!Z%!?4mMNVLq}i#u*-VrXgN(5zJ{4$<5Swi?mz<#sj-MA<}j8j z(~J{;znXBA0P(0b6UiaWQmU<3GWqHt3ObLz%th*IM_mx6+)UxoD|HBgrRi=#KiPHUB7aXL`c1-P(m6KO*7b$ zY==p%xsYpaq?C*GA#`EZV4#6k<3J$(y2Ll+(9we}q~ETHLk%Q!VmG8tIJ3$&6N|G` zSvEw=zDSBjL&JY8*m1n!YVfgouT)!_*8x&n8mMthZeNcsDjwF0hoRc;E_n2s@4{nZ zck&DC&wGMi#Dj0!zHizfKhf zT%y&Dv(Zw627RUTfa{q^1is(u!Jio)=n|}5WgYf;-QCr%bUp{k>JO7z)Mk2lh2#Uu ztlnl)FSW1%`yVtrcXRO>MEg-Yl%3eE9n^LR4V$&vQ;*zCh=MZo8Qw0CHlwxZZ$g!$ z{2kT}J1EDfnkZ&e#8IRos3rTN)1>Ql8g!D3_D85>CcV61Rz|z=0^%MzYC9|%4cp=T zP`iA)xA@56~XV73?#x56)f8_F<3* zk6vRI#w|4de`?|UVtv4bFBPK?@jDXVD~jLkhn^Mh)9kn?&+F|BqXIZQki_ZHzj$;C z4*qwh;=S*U%Tik&pw_=gTVHjegBuJo^L26AYTa(+1UNMEYTeU-@l}$~hxY+>33v$+ z7TQo3HGH8>nbzP2LD}-QZhTB9-~g|G#?uspbd~BPx3m>>y&8HL)&)m+UlEf0r)<8j zBjrhmu5FISy(!AwWFLm!x1%i3Ok4qaEM zY|g~J01@a#;j2(vH`7;9@EUs;iHak7I0vsnX2ZS;9dvt2;=5Q>it@frZQVw(w9SpU zZwlIn)U|mBPwn;&dIrx5dVtm~|Q*LNO9Rh|w1?0%!WJFvb=%dGl^;#vd^XTfmv z7nuDxUSMk7^O!7!;OJ<>9M#sxW56lcKnwq-TCpx|lyA1$%9+==e+4%u<_EV?{u=SB z#bYFXhao$ph@jotm>xG=bXO4O48}U((Zce?3qduab2S>xLq~~g_Q*IIskqyL==5w?uf>XAV%nI zy{k3{(1>acRJYOAZjyB{`BSxtnj5W|Y88B)wijwYh5zgVJmDMH=rX)~oG8%YnCm&+ z=;(|G9xcIO?QyYIm{#LNUyIqxea}#*D!vne&*2es$uG*a70+S~Ga6j1t=PwFE1uQ3 zTP+p`ofg#@v7)A+f$7%yhVi6n#0$@YX?GY?XTLm0NS+uCj~almj;;hTh=QP$?ID=@ z!21JPppjKDiq@dg>?IGhC>*0gbbi}x$)BqmH`2UY1YRV;X43Z)_)`uXK?A_uG`4BI z--33SnjmTy5KdK}EA<}Sv2zD67$C3j*Fb}C-_@@jGBqAl{dpXDu$dc=PY>-u!w`LF z&+8wdEu$9)dchtbv8sR!|8;_<>eU=Z(~qH2Z(4SP;625AfSPhLF4*N%{6&j;0|v5% z?7>Giq};x#3J3}LAD2W1#;SxNP!g%)3z0s`=2`I{t^hwMR zIlK(Nn1PUnv@ID>u0lre#SF6904V7ssESJOEE$L_$i~yt`Acx%clkpApj3L7V_6h8 zcxv-T3T?BR{q3l@+o9-tre}SjVMpgQ#Hnjj1Cxm*zD7a!fxgg3 z_kp@6Y74(3gRfs-(``?-L5Hg@7?u5Ka zG%|4ex6#@O#djUD9R~rl=D*|7lh=f;>B=c&PWOfM(}ap;xL#;DO(O>H+S+XnM6&tD z!Pr9`V`1=lS~KyU<3YDLuW2(4JLViEUjCiYSor4Wp0whZLjnHcB;oG9AjkM^PSUZ!m(qVsBT^I#5jPE!LB>YGhPk*LZd#hWjZG0CF$!=tb_ z(S!}_LFQI=HH<kzIFZSl=lMnoiF?cIpuWDhTF zy*FwNAAmiG=-w|or+=Fr1icgt9~dA?I#1ogfLvzOKt+vL%cO;g&r3Nb?TAL{UyQ#9B?))zYC~p{=;1)dG(8uED1!fS$me#+4Du zpK*6FbO3je?vEhpHF%0vUN@l4F#D?+_j^Dhbh`mr(YqG7t$@%(AufGpBw~DEK%X1X z5QiRG1W3eP0caG*^%*$Lz+H|n3IsnlpzA>wp=1FX!_Y!}N->F{rGP{}mLjuhjJpL; zDnlNqVj4qp0l68P2PlQ1n*rU(&>}!zXK3_gs9+4O12mhVT0prB)d8BtP$QrmhBg|w zO$Kz20o@BIo9Vg$Eo3Odr6@NubRMAj49!Cp7cg`)pg9aJ0#v}zQUg~GXfER_3|tkU ze8zbJeS@Lf0NupUIzaOnss%(=7NOJuDrBe;kVx$xfJzxRDN#{M7@7)b5kqc3OBqTx za9MyBGcMb}c>pb8-27y8-x#U~B+C2&KJ9Y7+D9|02S?gJ#^z5+yr`*ws4OLM<7XX^TxJp3xG2LoF_cBzNj(HA- z76KZ>&=Y``1BzB2$>u4Z2IF>*-z%NTfRkkVrQfkkHyngKo7!x6Yu`47#EjdU@;v zB>4Rukl-?Wrj8o}NZ>v+aCS6N0yhnih&$iFeb2x>YT#ZnaGeJ3qHI0xwSWY_c?Rwl z14oS{ttg04?0{%xV1(iT^gV{60Nulo6VTlZB?0;sLyG|YlA&dQe$G%epho~jE58L) z#?Ze2Eo0~sG|oR`$PEYz0o~1j9tISlECzG|<7y1tT0nx|!+^3lG&T?2Y=*q}DQ0Lh zAQ&F_?EqBH&|d*P1Smpz1(4wK37`i!^fEM@Xhaa>MnK67EdcZ*hVBA%KSRF+B+@+y z2t|w-p90EcC^lbFV93BF1NtFDI{-b#P+G~VYrL+d%WIaDR4;Yu=U=$!SO-_-Di;n( zca>IGS5}V&wW2)DcXV}?p$w7c>533P+(#hL($Di&hu(V_>Ld~v17CyWZ@4$~(4pK%iJ#FMpl!Fv2 zKc7M%<;A89=jT-jq;R_u&Ch!P)1~K^Y>FzJmt*7SgaKS9LcJ= zgdrF1S1^=-`;`p2agSrjgZpTP7U515kxCWr;~1*NeLO>(a8G3DLEMuV+KM~1>XAwt z?vokXi#zpaBb6h#lkAbo2e?xmiR6q@{epbRGFg12;sTV(5IJJ0W<)A(KvY{I6%Qb) z;gQNBKxp0oRRKZ;1XK%%YHp;m2~ZhB4+2`o&{jZHhan%J07H8L1sOU5=(`Mk0O$t{ zO{=QHAp_XiAJuB5ug2@D@d2~eRpR3FYFvv;mfW(ey3)65scTuu%9SO`5ALJu7kG8k z^+C#Vd4j8}(&u$mmbq{=z_LNIMR{s_uWpE zms9xw{Rq0MbavCk^AYiUq|)u=i^6MDn%@2WgC}-vm2uFW_3W5VXVfpPEMAIpIZLZu z)ulK;VO8l;S9Rr@#cRE#HD6CqB!yX`GR_Z9oMri{aFBh4l3S3SP0?J7ePv}}g)`jv z@v4fYV_a1wH8rlQmMU&KC1>pNrPu6Qsqnn7;w~#K@s3SMfI=n4d?E~CZIME- zZ3XR}tQi*SNrYcxskM_Rs$DjVOFkWXCSPx&fT5OvE~Zh;=fY5k%|a)`><4t<{6{Ad zowzQPzjnoidKZ_SOXjaoO{Z89gqcW~yUiG?82nB&Xc7rii9Z8F6@`2E24);3`>3R` zaat6OtX_Y#f4g7o8?*#gUhJpp^HN;1&fFfqTyUnmE>9*N<9G>iXFmG zR%602H{j`BiLoi>vv8;lvRSBUasdjzs_@u`KcPdj%&7N>#VQ3<@Ztyzr1aLU4j8(K zM&P#bv$zS&Zagfq=$t9!75r6&VcrL(HVo5EgnYRqXD7nLG33e%VTy6+6^=$SVF)C* zQNj>Cb#uNP2(?-0PS*zyWFFGs9u7_K|^Ol*r$V!eG!<9SDjG=0(Og3X!Ki8Qt z-Me5_nqX8O%;x@FJNQr%Iv?Z8Bc1RWyU0uR(}ZY22B!aqf@5E?~5C# z2+4~QO8o|;zKAipjpYKf6@($%SU?zv5W-Xd<3dMDV9fQDdU~Ojr0no(9g4JF%sn6$ zT|^V!{!srs6l?OmzxXs1>xVKH(S*mMzH%tmb8~OHFBI#yG8WN<$D)2|DArS(mR%T% z^_+}FG~uz-uvq(Ek2xBO^_Gl9G~uzFVX@}DJs*A?R5ZS*&rKK6gvS~NOi03m_fGhA zDAom3bhwBnJQf-O#FD|v>fisPDHJPSqKPIv)&(3(e_zymeIZI!moQnzBAW16(P3%f z0hb;tU&bODE6!C-n^9G{hAHR`EvS}&#+jkljq#d=W2A{rsjR*4Bo_%txCG+n~D?Ci;?B#JYgFnaHc>Q^h%=oqSl zzYN1rJ^fJ_hU)U|X3V(p#AvqQ%tjBcAx|Ngg#7 z*OV_W^M(%p#8H&RB}-_~C2(s>s#oEFH2oA%9Ne3lo;p2s`fN8mAt{q^%B%E+m=6Qx zLoO%K@tbMx5bMx@P3M-L>YkmRm6J9r)8jS`_i&mm#(OyRmj`?)6G~Dh@Q^QM0=N~I zRd{_hrAtG6={V%7;&BsuVoEBi%1c5>F%T2aD@!UWDwh;f<^-awy0p|B6pALsmh!;n z#IlmfrVHGQagJ$)JF%?Hbc}OCLMVFaZB-?!Ou|-`RFrzXr8ES^xGzLU#p8>U zC}>hBz&j^5pHMw=!}L9wm`0MtWf(ge2Rf&D+*ui^o*9{*RJT4XPMLslF>Ylk6L@5d zA7f~2Dm6Z*6$-B|rnB{GF!)?qTqd=~VIlPLRb`bzaEyC>tEw@8W0vofXCBqhN8P*!SKj*d?(C2PVtukz2p zm)&5{5}@Og#`Uy5-6})8!{`$xno5WxdntNu(v{^G|Wn{X;d^@N( z(zydjdUsOd(sPYtpwn<}@U)y6Ik{QW^_V6Fq)cF^Ps#-8^^tWCMkE?Gvz4=J85&x? zvZ}barm7mcEi>fHL>vrDawuO-aB(;UzWHq88Vb zF7e?c=e5O4Dl2bUUaGjwsPfV!x5xl@l5%}g(gc_3`l3^c$4#D`Ajs*IVh5j6`~cqI zvGNUN_DK-6FA2-170f=Z^_ zgWog+F6hP2?S^ju51jrwOP>Ck{-2%xy1eo~JNp$2MC{r$4;H21z?wLF_mOfc5`F!b zV+VcoLMzyuyy>kreXgf)g(XicR`c(4Chzi!#aiOPHhkGt%tx#k+gsp!8IJD=WX`2; zXOPgKK&GcFvLn+&Df!oDD_$2TTG)}9O(+bvgyY=!gu~gKPnQxWoB7z3BNnCp6p;0_tHug)2)ePcUbX950CFVp(49q#;PGhD>We)M?Bh{4} zoL7u%n0;n3R{gzC;f?wN>Glxs@Wl*(}sfQQNdF@VmVsTD`*Cpe51RQNfCf zFy?U#(b_Cjpme?YUPBPAlz31smA^!TSW8P6`{q?8FM z6O8JTGJ)%hl&HsOE+f^QJ9Ab>cJ{0s_Y7~!q#BI1FlghPiyWd7p$mapM4cR}MsD-~ zCMTLY0Io0U0gO+YG*NT`s0R?sJ%H)3y_aMu^wk6K>V_|AlsMI}guKd~n z=th9<`T@{g4!Vp1&=J3~0nouYudEvY9Tn@Zd(rjQ3)u^;EHhthFFo`}p5ci^Y`RE) z|2KNb*|LY6@t^gO(T4wLU1Zwc>qy;@GJCs43SD{$qlummz54CHJK6gH_<@ zSW%q=4dwU|q`pUqw#}QYH9Uq?SNNl68^K(8+{Ig(y zjYzbNhqauITET<(mO-SaLCPG+c5euC=RHpl8|?-EPFMWyC#i3M?c!oBQ)0Zf!G#sU z7%b$+Cra3%qf{{}OQ4HV6spEV@gR`wu&V$s7Z^+aH-@MwptdsAYgA*HQ zyxO*tYk4}k@bNf|i=0|D+)abEm8W6Kp66x7kM zm7)P;e1Mg(Vp2!LJ%q;9lCJpgKbfFM&r1PH5bZLESR`Ue16k4 zh@XrvQ8eC_0)^9D3kKR|N_qtfX>*;<4^M*cPHaQrjSwRu6oHoUXz{|tKhNht+7V_G zV)T2_I0>KKVy`wgpBR{}E#S5CO8nlSV^WmWH<(IbkMEL{jtp+DWm(zq_ z(^IiXcLlaUi;K<^6!_>Xc8&n^wWG{!g}q3R9mmJ={(<;vFVl95+W6#gzTtjs_d;8c z+i{3*%{xeX0X9d&ZpiT;`!eupFg`lLS2aLq8tAcR^z{b%A~PD>AmT%~@$nyc&#ynu zA1dD!>EGSmWle0u7V0q={nH6tF$Gd`sK0X@KIt=yxT$~nuvPQOKID_=p7Kd_Px*iz z7XMK{@?l>tmQR)*$@d+6*bBL1Lg$j#w`ni4#5kW0Wg%4i-%=`x>$Cf3mD7>ku_ncu zb$UjXj*kC#uOf$%2;GND34InS9Sq5=ojIR}mvR5{;GBr@eaIuxJ>`+;p7Qi>f@=Nt z&rqCc<&R=N>ne=CxxVRDMecj~1qCYYs%I^c=$;}F=!CyN5pcYV|jm zYW!K$1k1qXJ6HO%oXz{J0eW1p?Q_&;IV&4{?cd=t^82=55zmPl&(;j5oRx^@N{eS@iQoTMxEAGh zWnY0Z&(b_fZn-`1coYU=a{pwSUdHwi6>i^1>8Qdyv45xC@E182?%-67 z&}hsvn?uc`eX%{|aW~iv#`Y`rPLfyO>5&OT=?&IhIQH6YS3)4=H<3@m>wygfX+1_= zVU=1p3xM3Sg^x;2#sjiwHiJVUrBBZY-K1ikM(|F+$r8KnB( z$B&G7P`l8Mr#W4J(i;9w=)G6$tNqlj);&iL*kBL)_WurN&TM_i0fa|-5K%}b{(NXd z9Y^;?O>Uq>RKG^?dEQ;EtHQ`#J1+{DPCj2lq_n&CO&d;AE)}U@gI`e9ZCC43iTXnF zD$VILx#Jw&;&V*iOi9(m>B$V{WXNaV`7y@gk`71O(L-jry{AElO*OQJR}rHqKd`wL zzkvpF`82Kf7HHl6^|vWF_ZnLEZzHq8!&?;iI5}3}2hu%p>|=3BS>anT}@hKm#5ZD;wQIjo7wla-W$lgEpX9lTOju~E%!FVyIXi0%whCqqFrGzmSgx& zTD)W67Q*Hx8}iu{@e-|ss^aASi5cLdPhcXBI}hS7kV_~_#W`t~IOwQ)0TYBC?&WL7(PTlV&@!N&Q^ z0kMAxZ^;sL)a~)cYMZGDaqK8>ltWw06zOV<)*22XOl+$n=qOy*jen=}ctZkew%r?B zyKNExH`+gAx0jHzuscz)Z}16nKf4ugujau!2m8EOz1g+f;vjfLO^85NW3=4O6r@FC zMLsHyq2(wLkiRgc2SFFr8VXR$yAdIbp4Q6rM2ie-4fi4uG?AdVQ0KUr+70BGcamAS zEKNWq%U9;4%STtqInLsRo~pENPXxp&x~ zm+6I+bUKcsK)iCaUp^0i0d9bl9~eVcTHv&drad2Fx#-*Vmh zVkcu??==y}Gs+!aF^Oe}+GY3Wl+zi8VfuzWhiUr@?BPq+w_0Bc4=UuecHRu&OV(rm z9Z+99)z$jrQj?;8XlSy~fI3@xcrImo(Qo;mEB*D?x4#gLHP4B7WE0Ritfz$k)%lv< z_32iufDE(1Gs<_a^f&POzRz(s@|}}`(HR^cz4bTltmOOZ_4l2~|JnNc5KF!OC);1% zS;_a++uv`n+Twq*{)U~Ed|$o(Zngi<*55wc*~s_R>u=my$@gDq|1g#tc>Vb5_4gsh zX#+d%hfAy)qekVu1Y#k2o*~jm4_Usj+*N-8BQ?1($2daKZTxi4% za$4_I-$n!5tb)QK?+|0SOb0OEj8VNA!%MCtg{FC6@p3heb~lYar4Lv0zk{+g$UeY> zLADeR23fh8tRh6_-|0T#rxWC9)sok#-5ni@1%K;?pHf)&``z7=%EeUv#t^#@)f@0# zF|S7*;H3S_oQlKGoKE5J|U-f zuf)7RLFNddYcPs ztC^)Q^6kh>r>Neq6_MV{3HD$;Z+4vShsT;*#=;*jf@v)@bm7bPC&vj~wDuT@I`HWtQZ z)#xB{7oZ4DAy*>!IJF13;ys=YlgKl?%u(=PUb&*XTyeumCFC#2m!&p0ZW0vR0eVze z)R{Ao;s6dJB}%0rU+^JI6~cEwzi^6&PIK;AK4Nt>O=2xA5~@YvGLYEqK{>?))~9n3 z#LB4FD>C*mELK{l}xqypS8UYDy+zV(b)7=k#biNpx_HpYzvw1#m%2eg`TPXh8WM7!2_IdlaxvXc013M59E!4vaVdaAjAsE+{fbbEU=9@=x*X6gj5`5n1>*+8yp}WW z`+%rQM=QSow2W~#pa{wsHv>>9<6Z`|lyRMamN0G&jA}9C0)R>wchPy`+tz4hG@xR} zwE|kmbbA2N+Nua;{`q3pd9(+B<}>azpl>jp6NYgU;~oMuk8!^RRK&Ph=#>^SZUG?r zP8Yj=1DeY?+9WHVao+(nhjBjzl*hPaR7DTtasbU{-0OgH8TTO|Q64HPTMma_2*|~u zV*%aDxKtxF%LrWwD9Cho017Zv52%r2Xn?L^+7)XKtE#W zH-PFGdK!?Z6}th6TCoq1s1>gR@`5fxS%hYg+V=>h43LZC{sfSqYXNj0~m0(yv{^U)w~1Qe~@ zU_i?Zs1eZP9NKE&-UTEyKKNo? z5nc+bIP_{jD>+6hAkiZ20(1-Gits{N!E|MSmNV`IAkiX4xbzn3`+!7?^avo)BHeJg z-XdiJ5-rlpfJBS*HlPybx8@4HMQQ*fTBM7v)LW#h0WDyX*m2Gj^BfpOn6pr07f76W?Pfc6;BO9u3o0d)g{$v_8Jjn+BO zFrbYF^iu=IX5b>&LQ z^17?Wj!&owi?ybt279-!tXf`y4b_cU<$c65=SE~rEiJ98F2#29;7GfB z@opEi)7Yrd*i~k!tERltSFzN!7#ql!>PbV%xaL~eNvPPA!A^Squ`13GuqwP>kVg@O zw<;jS70q`+L!f<-K-d%u$Nzy0w@ZH1TGC}zA~<~M`8t1*9*tutz@~^Z2#`EqK=buG zkt{q|=kYU|cE0TL_ci>Ez@J@lG5=P;6h+U^BQo5=n*|9Q68ra1ixjE2aIa@50e6id zH|`r5^5Fg$LyK_#HA7XnZ(*nwcdAi1GXVD%h91P7WQbI@;=YHWHr$_OXfN*j7&?Oc zeui?E*VK^xc(UhapoFl~S*dGA`n0)<9xx*-eNI?_CwIE54AuiHs;>4`QK2th>zbCI zHe&`*wBaC`zmi+&b(OeuVr7PYpa8ZQt1bzdiLVNqyOd(1yRu4H3$_)kNH*`+zY1Jn zPPF4BnU|8mvB`+4OR=flQa(IHNoTVnOsL{f`lYKXeap&S%U6~xD;1P8R;@0nSiaO% zf_)@cR(WZ!BeGUbl6RSzTUqH^S+Z&^D*?MA@&0nk4Ca9P=0$M%a_~gNs_M!mNYbc8 z!tPN4MvYeHVpk-}liY{NW#oW#Wv<+OAOR$xGLZahXoth6hJiL8zE8a z5{l)0e!@MWSj#C2E}~(X=?$g4(P!$E1Dj$Df8Mu_hGG@SSVSW@ zZR$656sn2Ok@-)c51^+`M+4GDGy?aM!AHmZqZj7i2F4|0Md}O{9dl7H%yqpm}LXDRu~v_c@0H~%_3fI*vjVi zJC^EcW6&$pBAQUGEa;O@6!W1wU2f<1P&su`{~`ej4b>FdGTxAo4-+A$9bxECQ9jb6 z8+slj0ubf`A9F59ew!teqTyO;orSlY9$h~ciDnmGtmf%?g`5UMf#b6(P_3A7?+GiDeITu^Q?i< zX$~70ozFiEj81dh!00qa<7?=7nBE*CL6O$i42;fajDgWX1amVY4Qw=PP5p+ z=rk1uMyI*c!00sJGB7&Ly#_|7`H6wiX?|;9bed-jj85|x1EbR%G%z|%r-9LFJ~l8q zjovY(G7~yHUv^bP?doL)MyDBVV01oWlN?dyj6?I%biQyZ$XG-p z_yi0-I_7Qzqo+>pXZ;efXc?Kfbei40Foz6`&iO3^qsRJ}fzfGB8yKA?N`GY;mie_X zj5+VaAe7BQgFm`HIzrwwAu$GmG8WNShCy*3o9OvWM_!Rgy!sROOt z-wX3AU>2d9(YuwPzK6{+ouc7-^|wE`Q0EI5gXBXrBCV6XI1i&&G+!=Ba}_XKjkG8z z8JN9cm>EVao%1{cqw}fkh1u8(^KdUrOBlvn7Bon+Sw^s|a0XBP4g4W`Sv)6W5lwhm zKpluhc)H$N`+P+x)+rf_XwZhEV_kvK02B6l7f`yP)GL2Zht}$;kD{&zE}{{*n#xz{z||;Y5si2=QjaGE;!*R;$EGCGYxtrt40Y@dB7-5CNx(d6 z#_)kYtHLl7K$B%)@SyxOOlHFH`St`DHD!-MBPC3tv||03Ei0dlq(BUE)fhz>YGs>J+ zxugl@%i9an0L+nV&9NQ;=7TWIW4&T+>xKDqFU;XynD={OKI?@UN*zqTbp4F%g&Erm zb7L<|PA^PxFN`+~W7a(NMnXrGJ$$(FL0!ujd&yWtBQ#H=A#v$4zXZ(IF=nm42h0%z zV@``)zBWsmPV=N^&6t@w%`H8GDHF(Zrf&tyTiWV7;ikK@Q*+Whvu0?6XXnAe@#d6O1e@$M&}+#>V~W)7@!lx!F0h zGE>9PCrO#G9DC(rPh8=-#3s9NU1C4|Rc?`dk9~H*XZG~j8Q85iEu0S=nK(B^dNRYf zgm3ZB1uTRuhO8nHI!J*Xw8nWHgn@#M=cT1EgvzyakN`H)CUYRyX6URFK1pHa%G+?J zO35;Le1bHiP!#i70AF}K01o?AV=jOp&&**UYbQZss#A$fgqdX3@srQ%ywEDKNyURJ5I zNuBA=o;C}H=*e|Uw_?f!ayVjpWcE0wOdyw|$u!I1HpT%Xx6hp?YhDPFL3Ff>5IqFx zK{IkPWRL;rK^ZzjuK~%R8VDp}g&-NUJT1*5f7*#llv`nj?J}9vh#@<7Lgb`rOlxwH8>}S zr(gtuj5H%7SBe*c^dO`znHdnB*+d2_@Nglc830Z^F2jQl=Y$laHzym^v@CaS&a~Xw z*=f0MIJdEPIb7k?4oP1)aN~bnkYgszknASsl?2kON&ga z3=Mcqxn53bsqR^6p4=JJGf_@rCIWUKrXs|i@uV7g)C|dLE-Jw)R3v!yEndC~off@} zSpQ3Fs!V0Tng)SXuPBdD`H`_3#Z%0+1oIFk1()LZtx)D?PRq(n&-J)5M}lLd&Lq;G%m-i*&N!%u2||as5&IgWv8F(IfY!>&Rq}K$LYmL3q9{D26iPq* zTqI6{Pg(163K@C{;^;N0;B*`)Fgq_g5uad$@=he=FR z3cY)@LO@{x)LR^{muyD5dwRx<+!@)KnQqKm!JJV#`l$%8Pkr)DG;Nr6GMY5>4?MF{ zr=`ur8=hmLp!$u7IV(Pdj!IkaZpad+9##+Wbm3A{-8t#m85z@4GpP%kkdibJ=dR&6 zCOMxaYV-9IlE(LWuEIn!*5$&vU=t?-H*Rv$#Bm%%=PF#Fyc6@}tTK$@AEprluD;Gy zh!SIDK|uFD&Q)jv`Y%1`c;EdVCoBEnYOE20)9~Nd3U;sH$3-VAnNAm>kXj2?WhE-g zCrN^i2FuK^$NueC0N+WT0@Kyk{`cg}8miB;NZS7BE*StFIY6!-03CcMO6CCQ$Q8G8 z0CXcjw{8G*G{pVx0O@`;0J_oOw{rk=mw@iw0nm*A-4OB}nXbOd1AZIDH2^v)kE8+6 z(ZG6EA9VjW_WRF~`~7GBNBjL_g~5Ni;Xl3yq0N~c9ksNypW1~$V;dm)n1n9=KuYWx zgRd}fGS;@82*np4*CoGEW7SS!*M2+~$sJ=xZ+jk3qnQSuc*MV9d*8B+2lS?O64*xk=L;_Q*d|ekXXEreS_9?GBfl`&Op;N4 zIZGWZC~?DfSO_S_&j0x7Xdt!H6@K6t%7@EuE(bq7(v+ zlqh1e{`_J)GqL?za>HIQR=+tG1afOQweE5}==)4j?(%7isTE2dPA2#}$$^VAjjy(z zBKKF3{sCicLmZ-7g8Vbp;u|V=fUCZw>&mG%{n1u^epmF=K|bf?2X-TNjl*tfv^vF&L}pVFPU|HO&lX4-(O_EU%2vOmyp1mxIp z>zGa5vX^$;+UwsQi6`tIU$?L-u=!O4`zB}&&*L|K18$1;2f8QjZ%Uuked2_F+Yx#U z2p!d3icbLR+tj)d_${7Kg(2*b_5<|VA9Z@g$pwZX`PaooDc%(NtSq`|xA4wR{kv-2 zpMa-5$ZAolbr0hKAI~|pj`)}52ZKRJW0V!fhjStRMQza}S$ar>Zp&dwhLY z-xjzz&NbgV1>bQw^LTeKM}6B}SCCAXgv%tpa5M^Pg$3zG&*_Q;fDC!$&UvU+qhR9l z<1*AW+KsWx4j@UC4>y<%)L_zAZD_8Huf*hshd|r44G)5VzPb~~4w{Pdc@h3-|KZd= zH$F_^d%PE`Et{x%&CxbdEu4d|9-VVM-TNS-&Qn<2Wz;OFEsaDh_h$>Bk$}c}?hz^5 z5B`WUu!+*4Pbtg69c>1Q4FO~3cmjI}iPF=yFI=#LcR_Q8c0r3Vc0sFu z8q_Q$Xud}^K<+l?-x)X9SNiU`aKmvXp1dsxUWS+p*=%|*i>Xs{+`gwarEg! zxz}FG?|-+jFL}p>`8X{jhfmAEm%h41nzmIFCDXrnUv`t|tYl$Jp|^N!>eLD!$dByjCB{Mo%)e<_F`wW{?a@Y^qS zD0|vV<_(wo+~Dxb)_w2#d?OZ&oxA#cuF9vM4bjy4yHQO=`4~GVi_$RdoNSaC5!$_% z`MIv5Yv7AQc{$|PtRX72W?BY4{OPIGV9C(Yp^h^gReaYqP>n;5Qm{~t}_W9Mc` zoXY>z>wlr+f4BZ0z?!ggXFp%P{$EGO>fFiyU$FmkD*son|AiQh|8Lg+0~k@9JNdtQ z{lAXU{kfC>zhM98RQ|7C{|jlbHt^oh57C`F!$!|vz5X9SU-aC`|JCdNb<*em7X2IE z0^b$F-?8S3{$&>wtIyL15_WQc^iK{ymwvJT6|*4Z^2031WUXN*L2cgalTTJ#wUhdM zi11L2W;%UpgD81w<1sP}6ASXtn^?$sk-k{yvjsdm;%63$?^-`kyVz?&C#1lKs~;7D zA&=P!W_apEjyOMICtDb2T8INK=-7(B4!GE?Aiy}^V#pUCY@xO|^0a0ekzraUkLDBf zvzj*_BtvVU@tGvpZkZE0_a)AcqbkmDQiWRgXEbzlT7_D-15oc1D$!MuQek_wL<{j~pLl)u}t?j=EK_1%!zt%GB<2J)Dq=!U_Q5Aj!6 zal8Zjot@G}N%8G)Wv+WpM6&x*QCc9iubG_Ktw~mPpPAKWW@Vq#H!G{oDnhNl7mOr3 z^;;V0PYR^gxvB9KLPg|tlHV(_8wbb;DJ)+>eqn-!eyv}Wo_*a*5D(+m|46kP^`f!+ zHt3o_(R`skSybWg6zSU_FWV!TsVGTPdBPqbuPjfs{sK$}LHLK`pnoa9U9JBdZdH>E zq9pA7n1^*;2g?w$hcB>4Yq-9`?dOZqlBNjznHMgkP*g-u!`q4G5oO66ii%th@=ZOn zejs1hNO43B)%GwI?u-&lkp4lOy{orVQo*#V;SNJ_m#HnAsp<+#o+BzLpNSJz%XZoa zdI*f(ev{{yX0f$~BccXhskh%W`Bo$geKb$VahpwO%m(6)G8i4 z{Z4!Boe=&tuLC<=)+Q^ylUnnu2(bM*`HO=?5R6YX%7^O zL%A`da*&CP8LUwY>JMWgmSn*-zvqEPP@w+0!iI_tKJzA8dw{ZBl-Qm8hMw!>4)2x8 z2l3WAs5MabFsH`pjDCQ!Nx6Q2(33gWYWsaJ@MVi>u(D**Wp1sh$%=Xn88ap0zXZe-W3*)&KXmJ2=xxe*-&czcm!)436p68 zMNMsew=Z8FKXo8}UsJYKH&|^mr?#1sp;tSI=Xjc;lI7(6+_;2%xl^gu75_Mq`FFZ( zk5jC!McSX@+cEPGxM{8fuay7}4-#rRiCMSU0(}!y%rWW{jOO%=)UMZ;3WS8gPPevW znCf#{c3}q??-fEckyxOi7D)=-h~vbLp_W4{LMMrB^g^PjbhH*5kvEs*k%eyUE!270C8+ zr#-;tBTA*KmP(|jfci0Hp(D0%ZXh2yM%~grW8gS43d8ywYS5ydqRv?T!tx@u-T_F| zQb)~sdS0lOidjueo^k#$L#~$*&Ws}uI-@bGDd+X2mf{94EH_Pqy!_=K9ycuh(>@Q6 zyP66))RR@~tq?lA#3+{DfK|JMu-!t=`l2EX=-*x@J>o>`>^UO2PoX_*lJR=^%Yi|E(AUw-FxHLJZ6Q7~c z5px#4K(#z{cAHA88ZcK7R5b?#b*Oj~&OU>e2by$2M`fF39`l)Oj37K}V~ilC$Bs#T zFONB|mq(t|BXkWzR9EZWI2O&<7$o(Ql^fpX7h5#U$a9`($x5c#)*{6B{1$!{jhu?R zWny=b=RGOwSAO_65u<~Q?J!9uV%c>zanPXZz})e4$`-sSkXekg@|YA3&%hJ+{^(Y5 z9!Z=Gh>Gk8Um#>|n>`4coCvSs7>2NE2re1m7vhH`#>$P$!}#KR4ltjvWv9+VnSQMR znB?{#ZEhXkxrJ2pA7N#tV50kmLt! z0cbL`T3|A?eZVdkwwg}~+ks|FUYeF$u|p!qyfgkrq7FMN}r@t*Jqf&CGf%#CyKWn-0a`%Pe# z!uAKi*d4@c`ALTDuYs))v^Rmt*vBDq<$~4^n4}E`Cfz;*Y>DviFfbVg#lT8mbYRl$ zmw-vPKLNH___xQTy#;Kz@Wq2nStM+K0PIFV+YfA^pshrq-5_X9z^)gxG*p7?1T6$? zfuJ1$Rw8H&biSbN1U665+JVg#w3RsFF-OpvfXx=PG@Pg|7PJtsS%P*1*i1oVbDAM& zJAoAmT05}mg0>PzyQT?R6R@d*mUb>~dkb0!*c3rK0<1vL*mNcf+D>5kg4PZ!PtaDP ziA@r;CSbXOmWBq%!@hnk1S}+Ie*`8439_LgyI?yA*kFO(0IXhM-!!p z(A=9OAFw+F_A_9O0{a~>OwQr+DPZe?#cSsxA{l~q5ileQwhK+{yCxQwYVh>~Ci$kD zSc7SMn@QVkVkb=Oii-_j(t$}|ZZ)z0Hf?`s(*A5>m!e~mE+zw$ah`6{R+_YGleXEU z-DT4Dnb-@!ZWDQM5ZJ8(`yXKI1oj%RwF3Jsuv-Ln7}y$t{SjD$z%E3g$<{p?m@K!s zz;1@EUyA@kMF#dQV4DTD6Bw#KXb+iKC$MJF;(0mJ9|@TCjbSmEODz$OapBVb<@ zSi+T>wn1P%V0Q}aJYcd$3E85&f)bFOdq#4*R~%e04iPxW7R7&sI)l zgx}LVR9c(%LzLOA^f5}0Q@Tg#Dq12(NQ%+U5#f!-*dWbPAmx5(L~P>)b|h93Tq^#5 zQTB!aOA6FyTw_%Je5UN(T0h}`oJxpGvD?!o>L6;DL`8lLw_APDF5WUF@(GJm@hD9%#oKvgok%G!)l}KPf ziix0v%K9+HdGhX=j3tChQoLouvXw#_CL~k}F_+S^{;Y&+POht~sq4W>p_}58vQ6e@ zPZ6E}IkA)MWSy$F*h${E`wf`>H2wD9TD+>Qp|c2}f!Ocf(Z=m+Le;@ssfRir<^Vvt zqRa?fO;$Yghw5qoE4<_(C67Ns89Xx#f(V_4>m3xkh!u7(ZrA0?{>hJ@zs+jW<%&uk z89F=PcEsHZ{b!&YcTiqZuBb^@zw1SLuNURhUX=duRVpK0d{HIjHbS?jf?b>?2D9ek zU*{WPW4WaKA&-pDQc(C7hbkT0jYo71Hh=zp58qReZZMHj{*Xt~{u`743e?IC@i-Xl zS&ov&5(Q~cxPdAaDfU#bi+8(N3#jtz+Lst1;XbEwMIPz%l}5zOu&(JvnQKxER~06O zp;K*uwirchrGhW7G&v|cLD}J;@cPg}2jw+Tq%wRyYEq2QKOqGLVTEM~QM7XGDwIsf z!IK9{u}QJ#7>AnE31=&TD=P9h^EnBW(+Ov5Q?AG(qyMO)STQ^R%5gJ3VATGZfJDQe z_j>t*vC>pBtR#~XP@!7_5)FT@=*43RNHlmty?ADu6oZGigrzdVvIHa=JZpOKSOO9a zo-g&{u>>R>RI!CdJ?>F)0Sm3X@{+ z+-y<|o~B-uFM*PQIlk4CaPvzl!`1FylxIo7wt;j7QFWPgapNVVuw$a|I#Pz(DI+3zAx2((RfmV{CXSSLBi9&NrW=GJK{8 z$HSPjTV=7=!DEOLbGkYJp7zTPSN8aD$?bL_dxiSwf98H{gbfkb%4hO8Yq$>-t9?0z zL!PHrPvmjB8X#QBB_rNsSikrtE35+LiabtNTx(e)^~#-p3|g-0l`Hbd9D4wi_Q8Fn z6w?d%gGwUQsc&9)(r{ymUL=q7=Uw=7@Cw5p)YVaR=D(5@Rii|G?q{d4s%kNI3ahI2 zq3}n!V#UB@@G3`B)#VH+^VZ_7+Q-3C4d-GSfdcZQrl3!l9GTjx4(uM@7 zqOz*WSPxl@_EnOgT7u9{D>^O@0_+MVLk858>7im{?FHc-YVifE0>VPf|TgvqvgfaqUlqn=RDTgxHDy`6ozKam{vS}T5)kmc>wW9Y8?xVe%T_Ra-gT2Es;?&;Iir^ zt0C6u^GUg*{1=rySb0;{jIH2TvN}-ekX7{r$r5r@SF=Jq^Z>qI5|DZk`Vfi4+=CPy z(-TpxAkR?*NJ|HS;(hGgwP7VdP^3VxLSUDX!Fm6y!ojR4$Snww0!vU{F9~ z?^&|-EKJ3nn^UqiS=c|3t7kQIo4hnZ>}6h3wXA`HpDh7>q6sLOSe76(n-saTmOOW6 z33FCNMYFe>R}X=udDGC#7EYZ~oL2xLZ`QsXM5c*nprjx#F}?v^zE+KU?0UFUXGj{g zTDNS{O6c_*N+?vlqkMm+jFJ(h2sESgA)2sw>a1CL`ASq9HvE)yI>`1?Lfd3_UoZQ6 z!{NUmJ+El;^hr}8)3As1Jh4yc^t>=MeOggbVgAhgo}&4%f!IrWo|S$f`O%1BQD_pz z-~8O70;dQ*YrnC#Pb#14YgXGu#TnH`>|7>|7(MQDNe~;AoiP&9lAtI-EKW!e8;4o% zWt@^h^(8^fw)H5P`j8-|!-iKI>?)-BCfWBiY4;aQHirUyagvjB<3Jx0#14Y~8hCcb zOFph1g@3mFG}>^cewDc%AO(EBj1Uqy0;2vZD=;I2yjKj(%d3~I8-ICtUG4H~hTKwF zojGbqfYX3$hRmp3R##JBQxP6sl9!z^Ja5jtA;yzt*9^(VJ4B;1#*P|0eC!ywP?=v- zms_`NWo3BzvT#EkyjYt(26hcgt16dGU%qZ$%}vXzuNgA3Vp;am%%$U&j9fl4dwJ&4 zA(sb6O~2h!#Y4a}+ySFWzSmCrimNg2g;*u;CM7P0v@^A;js zHU;@KI-bD}LyMe>(KiLx0xM}qcp`ur(3KQ9vMKg6l28cB1)E@ke3#hb=(b=HaEeax^cl1j-M%7bMF1x$ zW3})g9J_*~nQ*^i(_KeqJI`fFd!MrRD0}P0b6A)U*cZ>9V`PbWr0Xo~h5Rm@%}kEA z|#-*1gGUv}9pbZ{nn9^mqzK&K$sWSpv< zsNcz;o7+ofhdm2=mHqMN6AkB|oKnTl!%7^GQ4Ku$fzmSMTA3rl@HQ6S29Z7w1f-7BFDnfNrESgley>%rsiI9$eVggdi%ry0N8 z*^L)RkmNCejWBZu%`ZM@OKcC!(#5ByE$_x~Cm>$C2$+KP{#M7o@Qga)37(p*l-ZaFf*N0NPtk>pP)LOd7iY^j29BGHq8x~ev^$shII=l8K@5y4^vz0pnMaQT9eZE zN6Lr5(`NF(pzQ@U@xS(LhbjZE7cA;j-)k!dKl5G#DSL(Rf(UL}t$;!aY&{QKwjm^l)#_aAi@^-UF zj?I?LoGtegv*owY_Ke=Eui3J3I9k=4KIQGQ;#*JRNzPCov*m~T;iwT>{qvlwL2;Dm zYqlH!PaZnPWvbg91wP?lkJ&Pt@B;Q7Hr1EhR`M-83qFQZb{2f>i@$Uhd}R6VS@5x! zf9x#ym>s|DgAZl;|5gV$26Q7@7#ispTOIV6&FUe~;QU~+n(CUf-DFG}IUA1ELpD3k zCZ&6?vQN;PK18Wm&Xs*XW$)JQc9wga|FJg5rvIk>mQYH^C@~GEV<;KE&HjQj*k5!8 z`_wboU)Yy@ib|jFM99+=PHI}a*42Q#s&%HtitlOo!>8j<#_IR$)Iq~K#5j*8~r#fDL z*O;=){Jlt}Z_vq*5Sq&*R*58*_lWYD_*b4izs4;59R3UbzWuk=kBj>%Khr+a9&kob zrsp!1{tHmP0jv$>%BWwY{f4M(Z@^yT1;2L_XY109cT*d1xQq2}+Dxi+>v_GY38ptM zfZ2zVg?W=<_Dge%VNQ|ey9{%xG}B+noe#0!{tGA^XW)WY#DV1hd zU-1pw%fn@r$LpaqUPwYJ%>>Hw3##%_=czI{M{oKB+z5k?q!Y=1h2p=M^&M-v zuwOYz_U;Z1g98$U1HoSsUH}IaW;%-wd~i@enW@bu!q;M%n}TKT7qJ#93*ywzSnkIKM65n`Hwd`$dRi2hob!bDF4e? zt|%$ok6T-g!mnK!h4`9Kl_+ZDtx?p%zq!o)?aV=3bY;$d8905$)Xux9nHD#~w>QGK zgFRIXuYnfO!ZpbJAa-t6AnY{My)uM73}G)o*ck|W)_i^E4mggc>-RlCPf&)@MVfx! zPH70j;N5-SBV@rf{k=aUf_nNO^hKzsO}l_V*di(?BEqb&=Y$-9MEt`O5OK~IvKZ+Q znnOB77ylNn5u@a265``~v+1xj``^6a&88#3_mcC?3(cx1Jj`q#hv7+VMsWa~C47iK=&1RIy*|$l468@e&nYoL-!5 zcBn99z!1vl0Iv^u7vBkguzzZw?HJ>`*`G0g5uQB?6Iec=$%w1`TZtfn?CN47PHy2)T&?U#7lifAu(ABfU-S&~5z{SYwfR^af37W+DvFpeuV!G*kMrw%N0?_9#4u z`%s_mGuuxf2Ci`2UJeZ%*rv9dRW8PNx+u|s(YD2RTwfkq@tx3@wc#G=DL;e#N@f2k zdJAp<#%o?sB(@G8T6ljUUb_R>1YmyctH5#u?VBd;FtBVv`?E>Iu9>(u8n49zlWs2r z#^qtW763Lv_=g{{$wr-fSybGdqe4W4GIp&DGnbB3hPfyIzuSDd49*O%r}@er_EUS9 zulR!IGo>e8`ETUk50qJMlWJN|b5H)^J>0Wos0{y>Nh8V)#S3Mm*Rb#DUmEHXRU+RN zf||)6s5s^RVQGZDN7xrAvsgI*FYaL;t;`r6gz6byeh>Se>A6|i8~*o(*^qnkTIa-*9uk{jL3V0p7iZjCp= z%=F2PZn-tS17_}s$c=8ct^}mFs>brA5yx1o$Ee+SyOMHs9aycGb3-=)2LQhTF zvYIM*$}iw1X=!CRfY0M#`p;c-(nSjGKfS+caHEs8eCMVAb&bVo^Z{~*zV}6^0CI7Z z#jY^c^8mow*JoV}IVhPhEp|{?_Dv2-DNH*Y6!tCc4oWjjhaHr!!=#}`TA@D-Lcl?J z0hEw~as-rG2Zc-H9S+JRFtPrt+^}u!#=*7QW#kqNP^ff5jfV>=@;JX>#DikFn)cM; zH!WAwlq>Q`pKeeT5EP{xlmINPls1A=?4aBSN|S@~6HwT4ELYEga@awkG%PUKc-{jg z;Gl30Q|zGhgCAT~SUz70$}R`xYETY4D7m2UFpA}B7APSHWfA>xP;R0>4$3jKaiakD6 z_WlNZ@-tk0rV#QtU2!(y#sh;={o#cPk6EsUA=jzMBR#lYQBX!b{6VvZKLg1Qb=x0* zgCWWYykEFGM5<xS>LHP|RiyaioglTe62BMzsFe&LUiH~eOUI3-h`9!Irs8iZBiP5J_4l1S}lBk9s zlZt@_Ulcj8m?Sa$l!@WTq*ch5aGgZ!X;&xRI4g%^cRjpWTUJ}Sc6n8OSuLK`UA-KS z>srCC`zLm%cO`7fmekkch*w!1-}=SJR~(?M3S}r|n6oOf1qJ4cDm($ZTpa>uhOI5D zsi+WNMR~@|crBPV>rQK9x{;ByCq#MH(_$G;uvR1W7AwwnSK~R_I`wuj1GG*i(_|eG zHcYsku+|=R+p%Eq)6|p0I)6+*tb@ulStpulvW`yEWF4>VaRN0T7cUB@OwOH(=b*)O zh(}KGqN|t?@u^-spDL$B@+@j?o%y2cB%E2DR6Mny2=^1r7m7vA#4EI7X5>86IXN_A zdO`8@DU+x7Vi(oh$(+vW{@Y9XGok|G>W%ZS}+UnwxdYlocTC&3C zmqD`L;igZkSFaU}y{X7Xk%?vDl{lomvZl(`>gdYo%KEYw@fO95a}{fQq({~kVKHJ% zw)*-n&j6h1w7}@Bv64}ot&I_<1%8TY3MWxieVrC4msZwqA7^V@VS6R~u`7Pv|G)7S z```2G>565`>dL>^ckKV%3Wx>hR2Zaj8f9$e=c->>qehRG6^y4*l0^Ob6DAQE%J07F z*8@H3&FNl$wr=iA&se|g$DK&U+)ewyn7v6hEu>|H?8`ZlyOBCKCQ~t-jY0(hfj-W7 z?*M%jrdLTw0~NKt!sYa_TJeyNs;^Tk+=^*B3qEc!e)BB&IBDK}7JNL3`CK1-|F3;= z#E_><#K8E)+GobdQJGnz$BfM$mpdsB2kGbX*+zV=IldsXol?`iyYCvo55BF}KS>Gg zACJ4m8##4DV_f9alJ#*d$r)Y455#6H)L-BCactxd-Ywrisc8@@+>)9R`Mq~b)G#Jz zfC$b-&?wV;XY(r!p0XByM(Lu39iWew)&Xd%Cc2N$DKSoWCzl;4n5dCUer$-mllEvwhyj2v)v^^Y8g>GDJl zxVzku1F>bTGe3)*N?x?^7Qg#IF;4QQ&N+~ub*U7!+LcgJypkzZInf?6PrUoOE;yYP zbHWFq%+gUQzVo~jwDKze+ce~px0ymc@i7^hajBJ00p!zV$fwIyJ_XHuN<}{TkxwaI z9;S>RoWFPmrJON?Wd7WeEpsP0N8|^xD7~*t!3W@l_zn~>--Qi!oHm!vnin1pi#(NV z^HWws^A|a4-3lly1ivp@9Euj^tNJSJLxsv@ewXUcFIF3V-`)K|_hp4urY+0MZg=x;4>EhrXG?jB*aLaOwa4&)~%Yh_*MxsP|9r(B$K03QW2@RO*u zhJzk`atNRO5=!Qa3kK?m&(cL!`i)xvneBXB7_mef7&o}#QW3$21KEBL;s>eRJ>sXA z5Ba4XDprs$Z+Z?S^3HWue$2yX&Be@x#U)6H6lfiJDpuSxk;0Zs z&&W@QN-{Ibpd8tNOD`(y>pDWn84n;{Y&c773(VX`jn^K)FUP}ptr_hnRbX3zaqNrN zwgKaYf4sP}#Vw_H?fal{#EaJ+GHo9PCT*Vu#*Yf|8pQ}ppSQ=zZGN}~CjI*!+ki>F9|6M-2xvbCHdJ6wnYM45wiIJGOxT_TCPRZ!-1wjlad(^q zX~U5R9PnebON4ng%$Uf)UW&`RkW5hUL@1UH71)Gg+Nh9Vp}vP-?90G>vG8x6B*RRq zoZ-<;j1Y7zKh)aIOq={@BtHfPV3r?mGJstvY(w}RBCulorU`5@ewiEcqY+asZ%4?F zEp0H55H$56LJZ>L16R~1X+0^!Ab^fL9oJk@?z9Y4*9?aXhby)2?~CSO|KFUE+b6rI zRoJx@B?0X4`a8qWlroA`@M!j_FKyf|PJV;H-gt4?7{iUMnl!~~0qpQmv7#Fad#~lo zmo}^j7LdXsce{4rx5u0kl#u}1NPj4#g9ZE|>J>wm3(b6BhH~!e(%#yQomG5vkyQox zHHwNnvRZBuX89v2_c$o_9K#kZd}d>#x*_rFcN@OQt4O4h#~B|s3rlR!i*vKSZ@D^3 zCs5>(p${=yk4Z7UZE$%Zd3dXW-$-Qs*kj1%>2|S$qx#W_k3Kg1#Ue!cOde+pSpt>_ zm6l(e^9#$>{mPZ>2#LS7KCkFEh z>L-p-`(HAIirPAC`&M8RRRjpFW@%YP17xEZH>hWZ3XAe5<>yb$Kb?;mlx)IIXksvb zCIcxq0x|rU7Ah*vojg6SXjTtDMpxHN%rauuJBnrX%a=7k;K(}cZPnaVxm*j`WrwU> zzU(Gt5z2DrQI8$YNs~iGGjpfq%`7&iZq?lWFWI_Q~)+*NOhSf`#*QvcZ!7I~bq(xK$yO8R!zCPbkDYrP z$zpFKh=G3vYb{h?dmDdO4N!96w~xKE7La$Nn%h-hdkk#M*P;>HRbP7>uc43NN0*0r z{sIbL)6m$97u&lU(k};`Fh&p(pv0bqt)nMx2f|Ik#A>hlM#h;#U-26Z`s0J>!cu+h zfp9kT)>-gzZj)s6hRVyn{Of>SS}(p(sAqaPY;^VF!`_hXGc|)@pY(noeE&E0N(#j+ z5XVuz(0%dSk3`VL=OO6g zBM@})0SCJH$U_|>pP*^tn+0_7wF0{MPC+xjP|(b;5!4ZY&?&M8N(dpLPSHNp`7HuU zhzubDg+?Zn(Rhu<&Itj5_5|7!411t`x;5PO<+cfKNN)jL4)_6JKA>9xXVt`6d#M|C z)0R|g1*~?($k~*0QiRvu2G3K_g;WoE-Vg!wd4s zjq*t%^Qt?}$lu>S%r*Ex%bmlJ7(Un)c_;bX2u^Mxd3GhW?Trn{8;4CeYaxr2{$MJC~lY-W288$s~l=(w>M zHsuo_Up!!rEncNA24Ky6^0kZFvCANq>T|IjhbjhCF80X z#qWv6ucW>E?JM)bkyq$G75+y2E&IjI28(`2k)3w+q8vOM4wGf*9GK3R|oa%-shl1>! zj__Rl=)OP2>iKE0FibMuLYtW#y>V!4*9g4tR+`b6G9QQ4;I(QuPvb33Uru$#`XhQt zwt9ChTACd#&A?WT*pm{$GQV&`mgx2e@f)6*c`SST&w#DDNj zy}P%PBf{8wa*nQlRlX``uvGiJiBjDpxoLNs-# zey>1oyowo&O-EnXe0}q4!l!V4=CPcP#!KYGne$f#oaOXma-pb1xQ4ezYK5oU$-y+d zg*0y!Y5wKOeeB`Ao7Th1hp7n?pS=Rqa-%2l4@}t{nh;FA9lF0(m?-lX+)rtMMi=Y>*H>-gM73s-n>3Um) zG4~6n=p{b0V90YaTI#Eamio;C35Dm4+x{U!2v271j%^I;TWPdc8JeT1J5^n&j$Qv- z$zv3gk$vQ2#@&I3z;KzTI~>2^PjCIAyZhv?F8lFb*exn8Gd@kQtx}18Lp-;&s(WSk z9k?7W_a;%KktYJkCTx-Fn}a~qJ|r@sQWDg2jP%Ja-F!swr) zxsoQrk38XHNDCSUth(3;-h++~M0P{o-MR5!d-57^oWv)d+_)zv0G;zSVTgS)#W3t~ zJ;|NVImO_K!FVGX+*e$xX-%#EufR&1vo5YM^336ozLkE<9rxMt^8-3sknm2U5pxm! z7np5k=MB>5H6#AG3fB-n4nrH>mV8v?*Bx$L$k8_t*Q3l^eBIDrYks5E-?X50eGmPJ^lQ*@B^uC%`sBNZoKB27$>G4{r)K+M6_ zv`OyZLXW$r@nY9{C@{ZxDkMYDf*4h}ap%{rH8JiOOWJB+BZTdCVA;aO1HeWL+CE@e z0(%)4SDSwAFTmIc{MvZLU1H0Cg#>LCu!#a&4=h(;ylKUWHXcs`CVd`>gi8Nr0xJ-F z%S>9-#GWv*=S}Pr6B~>vxb&si#1@&@_f3pP7bV{bU^27;*y)tCauaI>CT(|`v{y{* zgo%xaH{4Qozx3q+VAAa`Oxo{($vha0{YROTw*tFDM?4iIn;#>N|@d1p`lb-LZO(2nx%BNsF`wenIyyB zxNZe+gqo^!;~^r}6)GdV$Apz}oT4 za!U}`ccuyKFn(F~@?jz_u2FH3hy?=Us^U6<1%TZsunb^}1Qr5TCa_{)iv_kA*b;%& z0$VDuCSc_PYXepxFjHW*^;i*J>)~GHtwMxR+E8tN^-a|^w^Roxqo*!VyQB_M7;$2k zulkUWaxKe*-Ei%Sa(p@p@Hb;r`FQgukj@jgT2erLg@R=6dOqeOwmt$^2e8y$&OOXP z=CHu1jEt-#>@MZi)UK=J6`4TVvY~;I6^s^!(yfjJQ53s0^tUcR!fzNWfQ z2V<^=tFeLH>T;X|t`Fo_R;^fG*C*#_a*hd1X;>GSTvxd)Fc&9ut8gH9SYS$BO+#%U zYt*p7)aqr!lQg+mbGGRSq^(@O1o0f2^dG#g(}HqzD*GOu=xbcYr;km`hX35+HQEk& zAWTebKv%Bt!z3x>q=|i$Md40l&_Q7v;%I8|um!R2wkT|u1dGD*vKFQ)2W2BnVF%?dnASTe_rkQvLD>Nl`7EEg&$P`!c?72W9h4_v zdcZ+>2BrrclviM)OUviq!t}U<@@JTya!^jdbl5?OMLYh)L7@P&6oBP3XERw2N+wL~ zDJ-4>n5q=T-N#2#?xJ(de(m^jFEpjXa6uKT1=RR(r=n>eb z=<|j7%gPmb@Hx-6;~pp3u7*1(_H?0_M!E)z&`>uLR{}Gb`B*U(c_dm7?Vuy9MuXW5s|A$9CJ$v$ zXRL5E*+e3rU#TfqlUHL;ENgEZb zY3+Ub!&4q^7wa%p$#))o(Qt#=0bEg$NBUC^%0bf~+N}lUut~AUFd4RP7iT9_nLiwH z*ziSuQYMu=(&t~opW~)KwEH7{Mqyd`%=0r+1(d5eG{@r(o&XytGSG6B1xmm{nG6aq zZdp8w=t?NV=Q>bo9Xxt3o^OM~%U#kRUgi_ylbk@5VFDq|*4-5GiA3;NlH#qa7S?SV z+f5qWk&(Vw_g$=8G2)Yn@XxyFVO{dDE_jGfCvxmGuX0$oX{ME9v#G&0#Xk2KVnh)?>bLEOMvBr@k`Gr}1?#{~#<;|E{oIhh$v62D5qPRR%b_&BY#R~H4;4?DQapW9!Hm8i ziJ`!HYuc-#d8;Lt(!zQ?GJv-^dp;My$42nt2(Hv+%7~q%98GH~ZJeUWD+=XJD#|aK zl3yHB^KfJ9su>^gJ$nwry-!;NG z=25RseHe!wX5rMxjDq~a{8=G+enXuV5n8!CpMjMC4ol#4hXWx;5myC0ZdENaru{|^ z%*YQxlK+&+MKflGa6H7kP^Q)p6GxAnm^Er*RyG0~H*vIDNvLdKDs4T6iuLHJxUp6| zBX@epa2m|bwYiXUcB_w}FBXjp7b9-@h+E-|yxd6zNdMWztWE`_91{EnALPhE(dy$JwXu-w~|53dr~$6UJSp2siGg3k}W-<$;>NB?)vf{)>zItxDf z7jKT_FhKQnN(9qOZ9p$RU$6Aizk$8@dgqG|d>5YuUmEzX2H$+e%UM)kr*>9@{wR2^ zRPzF|2l_a*!?~69>LLtKeVy9j%5on3dO-O{jr9O^?*D*X*=cHTG4EeL#d2#yxU%Yt zonyfq1rJc*{?O8@<;Hs)nmm>mkaLDg+bcEd^=OSlp0bvmo-$Na!WZdGGc532SM~Dc z<$?0bWw_s6y`*j(%loWV0G#odP#TBKF}D@V%6KtVrWBocab=E;H(qRf3=mife$NqD zDt<*1LuHg(rFbL~7#FAU5M~Eu`y8@&zSGQ)6RpY3bcQ<_vRX}q3@Qe(G zCn@$`o>aGMKYpD`?GA8*RO0~PcCn9lDtoWZ*t=au+D4^3@Kq}XtO``*ajqn3<8~P- zzSML3)0Qh^Od^ld6?+xy$a2Zryz?wq+{dLNkJA;)!3|mEQav~~_K%jUO^Qk$rzM^bj7u<+m(i2`sh@1lq>SUmAGOr zIat1K*J}K-EWf;R=tfEB?~Te;e=X1>EOrIfs{Wg|%|N9$a-&kYA`il{?PPJ=%wVmwmiPX7{luRG3>hW75o`;t)rGzWkdBkq^^n7SEWLACdz=Ura@z=~Jf_ z`B+nd zl&T;P(HqNGb;2HNINUkU&dxBW(Ll~LlOCCoWjmKG-wV4B)ssURmA#Lpnd8N8iP%*i zGwHiv-_KT?$S!8mw)RBYLx8V>uRt{k*7noQ+}0Y+h7O_nnz^xEaF5h@eSuLhW^SMJ zajqgYO`80#Pm^%J0p(Wr#U@ITcd~KLq!7b>KF*6w;2DSfRoS=#n~ZZ99z6j!XFV&K zAG7f~QYvVHPTWBz0eTkoBmCh}iuQ&ZOK`c@vno~|@8barPvkRKc%-q7dVRP%84+M?d;^x>4dP<%T@YQG)T3qo1>>6@m_tFQW2c z`ESN%GN!~v%%*a`=?q=Zh;ha`TlOhu>`g|E9XnF6a$O!T*5$Rs{`tB*)*1CaZ+UD% zdJgp96TL}~+XvaGWc;dOS0ODF8qPt(M#MBmYe~lUG5{6x5$no!d+C#2eGzVXfTui- zCV8Sq^iH;snsk00n~7rDo=%gz(Q5QM|Nnob@ZYdr#QxOs`Y+ZE%A7s@FROm+vY`M!;_Y69A6` z)&o8P!~iw|CIR*XE(d%EuoUn%06C|9888R%3SboAVL%<=Z-6Ag7Qi&XbAYP=KLD%( z{1tE^;Ol@J0KWl@2RsJ274Q)t91>nzs^8oh(N&v3{#sGE$)&Ncb z&H-!%%mlm$7!LR`pc?Ql;1a-gKq=sNfNKFy02%?G0bGC$fLy>nz-54M1C{`O4;TRW z5@0sqWxzjAF=#sMA$tOJ|^!~vQC zlL1cyt^oWuU^(DVfO7#~0n7*d3NRY*Ge862AAtUVR=^CvF9BBregs$zI0m>F@J+xX zz?*<;0KWj-4)_!>2q_rkO4ROweh>7y(C0!w1pN^7Oz4@=e+vDl(CeYsL;nE!2hjUL z?+0Cnu0!WrsMDc85B+)Q>Cn@m{}B2Qq2C1kCg@$zyP#hL{UYe!fc_2W3!yKB{s#0n zpyxo(f&O#oKZkxB^xL3+4E`hW=~lW1)|Qz6bgq=(j+>1^P+oC!u?xd!gSA{ch;9 zpwEK-67-j#kAOY``a{qkf?fl?2Ksx@--CWB^h=?C3;MU9mq9Os{ucDNpihK85&DzR zpM-t~^gEz;L+^$zc3F@M0l;E_4^Rxq0Mr6JfI>hTU?m_0a2+5Uuoe&t$Oi-gl01O8F7hoCS4*>SIK2eL~;CCGSi-R9==$GQq_r#%pi9;U}hkhas zeF4Rd$DvKfq20!zZN{Pf#i5PGAvJMmD{SP2Tnumn1_Am3E&?O~&If3&7Xe>7g#@p)Ndw zy66ll^$V(tzn~K39~X~uPfSco>er9O$s%L1Fl&8E4Nz*JQiGIYzS$M?(5{U9G;||h z4ZTP9_A>U!?q0?-WdDU{%6^XhoU<770nULqM=|CmY?+*kaPGmi7}qu2+vT=4*DnD8 zr^8%fW&=WiV!&cREuaao1JDjQ46v)7;WA8y$FLX^HV8Cpp2WOiE-|KZqo4D!coAFnqjFE3c@}Tq&lfiwN?JE=gT?!a$F z=SE7xap8fW7hagHw-uwbaN`7zOX&~px)D>!*5olc&p~XK$9wmE@OJL)S^6U_i(#QZ z*g|{n9{(Qip45jbat_rEY#6jM`x>;3Xc&7b5Hsd&Z9&ns-nExWVqzYpZTd^@Q!oUg z>w~_oSmbpoQ=<>`?txGE(PNNnIWIOQL~xVWrN5YiFhwYL6!Q72ipZwI3GmOAc_Qc6 z>-*_{OFs$nFg*+9FyS8Wo^JPx-iKatwXmq0kA;2SJ@dX2<9^lq(63!>tOQ{8!DoML zq$(J2d7E#;t_;d3h0krhjv^MDGqbyq(qXNSh>*JC<&8bq46BGdE@)coHla5pNB$av zDp?U3uZ90!u|dYIyPL7R7O{+}*bt99XUAfikKOSk(wT}YrE8Esf!3+0J7bzpFt5UM zS|1d7q|f*SvGTbh$6|Aefmc-aW~>{@3*Pybm39?PL;p z%djGP9-O7Rn3s4j{81(mcp&muSLEH8=2sYA!zInv!aEupn8w!!o07Ph83ck>$+o%#16E#AAfgA!?vk94?%?7jS;@8>9H ztxfM_z}`I*-G_2szCAXlGrThA)!UOQT-%!2F1z@`*!el|KkTV+-7jbru5Uh0t8*hC zCEbw-Q#(xwK%N4^7-3J&-;iX)qU*ezPMFyDwch+`m*-LTG{8`xzSyA<_~&h2!(BF! zRP*YyY7&umQs&P0?pYO6l6j)}*aDH(RHl_;@mgmlv^JXQy&dWG-t{87hRA-AP&6MT zHt-83)T|E-Z_h=nz3zYHywA1)9zSy1ce^L&kayD^aG!J1+xi_wlI8t)TO*RCw>*x5 z`#C%9^tW=JZ(Qiz^GF+WNPqRv+j^m=BC%~R81PmYHNDv1k~+Y((ytf#L3&h>JRs?9 z^ad6`@m=*?#i4gwi^d;ET+mi_33rG_m%l>4UwB<{=noZ%!aw&*>Hmm|7%-yV<_cuM z(eGh(+x&`m(|;p&%XE9XrO9*r6Edyv;LkQ(ktADRK;$Eo)HZR6pJY_2W@W(Y-a6V(duSaG?7$ z42+^j^7rhK*!|cWw_h)I^hoe7pn9dq{(nS8N2RKB7f1V)4g2Z)p|_RCk$rJ0aiU{F zj2g>0m_-g4F+j)a`xj#2J6$X;;8+~l|4*Wj+_Kp z&I|hRTr2Hc{MSCgk=3<}Cfo|gq~Q?}Mpv$D7pLpq-MGX8*C5}AQMGlO(9&PraEfc2 z`b6*UDDAtF_8m98QM={9uwpFuQ6LkF=hQ!jpcn+ z9FFIakl$sFjgIC+8;WAFjq1ioa3@BB3f=!xtBBk$9jyb=yZc_I9^>^rJd$WmEjY!- z&>28q;cr|9>#xSbTL1NFrx_yfKIa*V8p01`Q!cG%D}L7eB$;V9(EESiwZcWtC{Xch66`3t+X0fQl3* zw_C)lR5b~m(_GJ%HZjXZC4p>dInA}IpP1*C$?#QvdH3AIU`rQ8+a5tg(FG-UROt6G zNPAOJj=Xzx#oc0ZixomS&yLH1&fqJeE#zMa5lEi(L*d3=k`;K4m?cODktVW#X!5JI z7&TS0A9?1MG+xs)0!HUp?2#iwE!RJscGUVapDk71$+#@+$b2^E<;Foec#1tneHz8k zdotQWheW0ltO51EiD3+fHGEoU6DtI_s-8qApoPaHNIA1{amFU_2?K~1d*-96Zh8L1 z%Pq-Qk$`$z?9rb;`EtuJnioN^#wF54`db_Wwp@a^vs;Iy`(*PQ4R0$k8nzgrUx}4l zUeS#y*gI(5$VFjvV+L^6O%7(A8v`&=MYjZjb#5G{%$*yv6;=`5$g+uUWX^YPG}5F- zWh+3ZQ27$b36IZwR!AL7f0g@Ztyz;Q^l(;eh5P*q_X+Qw7qJVIAIo;}p||mE%t7B+ zKLP9Md3&(M5WdR0Cx4#DyXP6$S44qA64}wnpIrT(c2vHKXzU({(9ijx@xUVXvX-E- zU`ON~4-V>JPhx?dt%p2%VX~f<`AXz@NIAnE90na^WODRg?$LE_=7tk@lN!fXjPu_a z9vsov z{alyZyZhOueXf?fE+N&s=Xn(OoiX@%C?>j{!7&cVCz%37UuK}UH6Ihhh$s+9;u6sj z5f!#$*9i*73?vRcDU-ra488#dz}zgJSS!GnbdDT-$_cz7_&;u%F5LLa(s z-_=?a8sOT>(k|_Q>>#Hx#%XlhjjD<95W3OF_HV45%YEgPe==!MT^{=_v*YPC`f$=oI5IQ>;%asR4T_TZi8YhcBH+`VTU?7Tda1(*Nw;%o8UrQfZbkxKhhc(G{3RNtH(#y z4vT3>&|ejvw{GPqG+W~La)UxzgKKQZxub@{-nshqp*7cMXqkNkFrl z9;d(Dnire1|CWnU-%=7;c*Y~vh#|DnVBOl*;E<`C!Iy02O-(*==ZWa!jMsnb>D1=?wq3%-nyCnQE}^5 zc2u*CUi~Tm(Jj4VJtYRQK8V>kV=V$QVqGF;;?7u?h<%iMZL!AI?h!U7L92+0bR*V> zRTh}BUWt(9n=@u~JgOj@yUW6q`(>`pOBY_>!Ia@2-`#!!Edb1~J!fK}jlj60tV3#g7n^+pykz=sE2AI6;vv#0-b-}M)g->=E zb6`6j7;lioYx%%XK)@CQO>6|Ps|AfWNo2mvH?b8aw$8*RoiD%T`n5_En}v_CR|;Q7KzNkIrkmJZ zz=Fc|K43Dm2Tbh8z=jLk_koQN*!OVT=`w*m4s5W%CgNNrvYI&r3`GKLIxuNFADGOm z3SdKo3;b|V>rmCEN!lEMnV3sUWFczjqZ?^Oc|zcCab?yOyiA28M_#19zj6ygUgLtr6byt($To)X^=w@%gj zlsNlCr?Q{iX5PD9Jb6s@#;~Im663E?5`ssN*=w`_EDH0PskJEV6T%LjF);CrvBi@Q z%0bj$i!uk4LR4o`P|#4NfI>6?i&8}js+8qw9VqQ4#ePnjad*2W;1|JYOTKi+ThNr+ zq;$a}@O$vfT4qtc0~57U!hv(+rQua~~v22H7ll^&-B5KH@wD7IAGh(a!) z6YQZ_iavmJMavffO#qAX8<^y5Gb`6DXh?c2g+h}B$C2s+{>1)4c9Fx ztHKMexOgB9<#xkTWwo@btfmgq&NRGE!Dj@^s(4D=G?hzJS$SnWpPVg+O&Mgltq8AF zrlm{jmn(`^CJbaX-B;m#>iT7-vD|4y;L@JfPu=6Y!* zo}T7KI;0VJMO8yR-qi+nOJ#L=0|KX%3&SnFl~HAsm@y3NbG=})w4t)fh_%F#9V)v; ze$>=0FSm!cqzdv_WQs)OlwHz@abw2>Y|6YJqNFnzRwFYq#*6_cu7}vRByYJJ=`YlY=@)IGZj_3^?f$BlGZl}*+V?}zlbmG&Y`yl~1s=Wg(POYt!Z3>WGCKOiUI-|%uTM0~JbeZi|A5FLr00Vwk|7!vn)S#GHu3jQud#^kTw32nT>K!gOXZCg7Pk zAfAUq>&q}Li{M~#2M#62s4C>cU}FCp0Jr=bsQw1QC;s`>-??u?M7rJH{ zhXjP*A1*J@F2i7#i^~BUa9P0R+Te1#PN_P2NDXxGk!xeHZhI2D)BTOSK zhH)PL&c|O0{w~1Zh4{M&f2sJp7=NhF+J<-Tf-m2uS9qLsQ?LbyzA5+swQa#2(B|s* z3w^%+VDNsJOY}#CHI}?7kOzGNr-_QO3z&_MMTMZv16&8V5wI9g4p<4O0@SWK4+q{R zW6LVPXdX70iso^9@<82R^%&Ut9>r1#cI)v#NP`E5%<%j`{qdZA*a}Tu6VDA%eILG+ z=3s2CX5L`i)wHdJ%Qa!M|}O~%CUV(dmw#@6M$d26xJJX@HMxAWGz zT0vsoN(Xf>>79`y+GE@t4Ci8RFMJ-t90sp=?=zb^N-v{p%wD2b#~>ysk6{i|HaIgl z`Rwu`|9Pi$7%7-dXu6xbbZ`+AyXl7xXCBLZBhu|^E$l|Nq`>PeSmp!L;4IY8?-~kS z^G1064qJMuU`RC%nQcL>;!z0DGp_2u11AH#d*ZRpp7Y%8$tY|eHZt;q1G}znycBc< zo9%Aj;^#vj!&*r-%4qHwfQ~TjhsY z_lK>?;w)kM{`41{+oR(eP9PR3t<$hA-cr+=I+pMx_8;&@z}lG`$V?Gw~#xd9T3`iQwXY`wrRlLvM& zFs|3)wLf5>$BbJ|Ksf9V7W7PdD7J_GlM72uTb!!*!je-Ks=3Kunkg~hozX@|{AB3iq5${;dSWa*ZF_etY zLxxfC*cWng`R9YZN}A$)4!UtUS=FS^zZLy z!G{e{Ehz&(Hq}>p8LkxJU@`W^7ld`_Ed1k6U-?<^ap(E=v*6zA0H5af)N2D1 zu%qm$1)zu$+aa$RgRy5ZAOQ0Y=;Ut#gkU}ld+hyrt^=gN+@=jm$N|0U9|^;uV)~_ z|1X3;72QzdWrktKjXUua2d?sfsToRX9FM?=C@(b_*@S_Kau!lRsQQ>9tZO) zs{AWq9t!ir&>7z-U@FXigL{_ed;pf{o*0)b{|1;x!~Qu{{>x#$0_Gn;XMQyUCd2$! zxM%q<0-%3P{JJXt+hM*2=HICDUk&rsFh2&J^{Evw1Llw5p5@OvGYIMLP~~3_Gs+?H zfGU6H>0p?@3!VHCKpxD0hI^L(LICnP@m^K_x51nP^Q)@-Z-N>1I&n92)+Ze>9p)2o z&-5$+oNp`tTVNgw`xjODuYh?7%s+PL+QR z%oqX_pMcK#bT?oY%%7?9KVAFZ2me|Aiva=fe;c|6Xaa;_{ypqj{?`FgVE&RS|Ftk@ z!~C);|CKPO!Tb~GEUy+oADvF(s{EIN=W_7>H}n|5M!+PP{{;6e zj~f6N!u%Cg{RWSbyI`eZ2U>eN-fP0qz>DvDxxgKx<%=h$Y|A$ohSHgZM?0*WK@r?qe!u$c;vpi4N{-0OnzZ^VQ zfd7ZknP1I-$uM`pJru^pU=TU)XUwRSf0TR&(J5O=Ijd>L<>`+)BMqC zp6Ilc&Pie&9`!^EW21%1(ZWEqFfCd*ELxZmEzFJsnmn;xxc5xT+xoGW# z$a}8A>x2G7e{rqNF3W5$m0l^WgZ?Ei$n4JP^ln0v*P60NdYc~vf>Xf$Y;W_ofpVuN z8J9OVp)bG;cfTBYDjBy_ zJ*9hbBEGwf(%yVIFGUMdZ%>G>^_+aYYmol(zK`&JF!pmZqQ#!u-I3pWTW5cWSBP&J zSQ0G^M%QK?p}#n-SqkSfgT)9z`0I%_rk09aDeKt#k?>udHDr32DJ+NL*{i(9IW3>M z?AsYaZ^|s5huR1Y;|aCvknQ5uJ+8dhr{a;#>Z}F&hYdpzq&_#G_Qv$-X-L)V?pK(s zr=tZ~4GCqXt&?4gI>uF}H4Fl;VvJU2M5~8I3)0eW^C7}HAJ$#2PfylMvWnB6nXP2z z6{NwJGIACSE6r?Q)RA70p&!Y4Z%vH;o@92HWXw;0N%4a@{nPN}dS0?VGiyP5XR$nt zrkBv0Xk$iMv_yL2s?N}7W-!!eSS*+uqgZAR%Xy|g&i%{i%wc@7c#+BsRi7g73~O%3 zg`c8x!MZlJx!b!b7ieT{vgX}1mRPpdkQBkgAl~LQ8YlK^i0@2Drq4K;T#SqLW!dv} z?%)RXLZ6-x`7pIazhwf<+`#2wW$yHv8^er}_fCBfoOgEzn`w;PfqMe|q@PDCU=#Vw zSD%iX1-y#;2+ZEylQsRtLx*{h`+x_poVs5Fi{X3SYbU07V!|^ve0(W7tcJ<97nY+_ zQdZ%FYA^#kkQtZaXQZw#NHIzQyM@?~ekuiAjAiDD&IF7a+R;A@MC7Ifn%g_4_!z%% zLT4xgwX7TAxV)Rb2abzhg~-^z(V}GrgD6CyRFskun#fdCQ`$&rp*@wFBoA4pXnLFM z$?}kW&)R~}A|Xo)k|pwZC?QKITmN(3@0n?O9?$3d`Fy{>@BjaL{a*jKm+9R5zRS7i zo_p@O_kGW~5Ex3>Yf7%J#wH>5_L^o7u`3`wt+^Y>w0J$l^C*=2OFYr4iyilfs*@p_ z!IV}u7Au1-)`}nQ#zRbQa#L{Wc6&SdgFhp zo@7I5^?itnQv{YEd>x{+xKUYTt0u+h-)+8>8$suwVP5zvh{k>+DX|-v@|Tp5 zM@8h%6#y|fzo;4pDoJ_yfgqziRdurlMNVLRas-s)^e;t)m9iTGggw`~1h(oq3lxbG z=mHL201p#74ceW0O<+$rvcWhPH}=OPB^)`1d@kXwLrm91Nx^^*HwzREfeDBb=y-Ei zU?F`*rKdzbf&)?sJ4o>#0KCV+u`5ji-36=y*>q4kRx%n5?77GZ!lhi0RLP(|l-qLw z9a=f6ekAUog0WK8LIC;67gCrNvGUaP;d>aigKRP4CKyIIXiIR{BKTZu2c7s{h$MXR z&`V=>7us{_5M;wFsfUhDA+L2wT&@(;e!sw!;%iKan35S0S61phP;=#o4T}Rgyp<$) zV}GY)O7PwbIlu~L8>ajx?De`}um8V>y=GVJNiCopHC>Y2IN+U;YxR-duR)>xXRbxI zi@VRt=WANmb(JTskPp5Ik@A^h%02|2UEHpMg2llISW2Q;$%%cbgrvkG5WgI^M`%sm zp)3?Aqa+{25HF8^!i$tE6ka&0!RZ+d#`9A) zMUykW{mGzYzzzufl9~*OG_0sFbvn3O5akD}>Zdj28gKLzg z_dp(^oSa?AcQ7Z&-ra?FWF!n2S!5Ar=#={9xP61E5K}BL8{bPC0VKzGiVvQ{n_pty zh2BKzm#U%YqQAI_4T^M^83z5y07t-ZCz+yL3Ahl&5qz430me!>1>@biL@Jh`Z$K4? zP%*wmAr*wUp)`T{UnWjKju^oAS@^FHUqQ_!-9t*1rW)u^;ZF^U@_7FLm-uT)DKBgo zRNUNcc`+T738GZQ4}cI%_)iDnoKIR)f(9UbtFe4(z(7bMvY#vB`(j&ItKLCNglz*^ zt6l<7ZXX7}Aiq!q6Z|l1zHhvzj03gV^`0n6-};+K17h zsN!be3I-I2)y5qWE)DAyZ+I4!ANW?PA{iY-2jLB6a6GXL_`L2NOXr7S(zuu6Rk&0U z^P@y`k-d|6^E(*p)5Z24u5RV9KmwNUCAN=sji8Yng>(iji|if~fesE9sS*(ndbk`L zHO+yrtl2Q*LbuLk*auiaTZEQS2f_D{s^feoIIo~vN-&obS7Cw&qb;yYh8|vEhod?f z3X)O>GEs^n1c{fP+H|)53 z0220LID+BehF%{T?UCM1{y=Cd8frl6tQ%rm1?zV>_fT~dfe4jh53y48AsHyYkPM%ONQEbbwen(Zv|Hld$ zauwE~NO`IRMPr%3L!>M3W++Gr3Nj)(kUq?REK2EbMJ*K;sZvEL6|{qXZCK2BhlGUF z8PtlB9|i|0NEX00T3=?zT%ixWL9W<{%BIIK!aK(sHQ1mtoCs!`Y)r_FI5j{~#abR`cY)B~QC$%&dq7+-q*p%y++VYyuKkjMH;;vTHE zA9M!?2fma@2x9{<%uXQ(tB4PWoyzf(53OkdDE9|-1Q3LYh1L{`L2lOx&l%!`Pgx>+ zhjRQ(1B~MU+dmUw%#rJX_3&ES965<(o#;TyiAMxqdcKFG7TumpX%-wTia$d_O<4!K z{=I{z$>~daaGcb?vzgIA@Vl33MOdj_g6$Ly`30Bxw&;LNY1B|5gv$kxT{E5qu*tKbTR zZ*F*%!8bvUCOH_^LU`)Zd_g~=xVZ-urEdu1jcPk6O_&cN<6k&1bQC6q zeI!;&DK;3C{1McAgf~Y2g0`rWf;7i2i@Og68ySN32e@(Rwj8=WY_CGuMuJfgqYtZ2 z*t!!gWz*cI3zSGP+T4wjrjnf)Q0Z}nXKR9qpfJ2a!-yzN7&w$%HB=NgfM_zimL3JG zhNrM$gc~E8Ad~F>!Y*?Gb?I8CTnWBZNSc&ILTqSUhNN-Eq@_0svyBk*U$xKLUt8dg zjg#nIl)6rC)v;D4zV7HC_fp|h9NfMEo;Yx(!?}Q*M6_`ZVT)XuFol3;5r4~BdpM}K&x8#j0PS!~F&z~0>xJ%2@{@DfZTCXXks;)cQ;OG6Mt*5&1l0gzNQd3;@s0^H<|7yf3B!VH((G=UW{O%J$CdN|xgCxSkm`mjaL z59|a@YM6LZ!^F>@`ql+j6WWCn^@9GOlGP%N45unfZ6TVu$#4gf`wP!K@j zWIA+j7e>atl%?wcXf7FN1yrKSE095!umYjtPRk%W;9d&9P=KhnJ)jX3bXx}Tp*cQe z$teI)ZwJ5*3x&&GfZWNqMF61!$Dw@!$c2mx1cshULU{mDwQYd?IY82H?ztMxfrvp=AL?%Y(oz6I4M>re1`z6OinP@LO(&tX0J)LS zMu1#NC<`Dy37JE3il*abkQYD{?Uw-rM2BA3FM}RJRSU?tH!_F=hyWWwx_&S{QaLur zAb3Gi9RI?wB_FIE9~g?{Qz7|_CU5v)d+?FI$Js*uc_|C11LwgRZQv$gefY!&2gu>U z(SQ$KQsX@;2<5@?O?Z$m@c}_WKG>`H0Dk0qX?ie%Bg5D?_(<{R0f4XqjY+=8)>B>x zFbG!u@QX5w@HVPl&Q_%&1jy&dsI}qJ}B1%;D4uq4vvo#vKZ;@ zuMhzb8u363d1q{A3_>g5|1ub?o#o)T%9g}n+h}k{6pdCSi}9ZqJa0}cjwpP{k|k%z zPk_Ln%F%OjF~u3r1H>It4m1&nK?%>4j~QzYiN3;Mr_#vx1*izn7m%2IW;%a**eQ>W zNMbRK0+u}1+yo^0FUtY70?I+jf=|GbC5t-Cc|=8m+>n%GJ_ewrkXVMZ`B;eYkdLvj zvZT?nKxq9PXJi}(9p`9#jBYDk=&Vb6Q!1t*akj96q78mojtZnh?!=V4 z2NLI#&Q@Gr=J=&E*B}aYa>ga;GiEgM24wkrf8nTN(DmRKAM2jC+dIqgl9YpKy4DU# zALN25pL{keErp>dNlaTS0Wb{(UY5S1=|Bw7aEvMR`z&abtiMKEfJ*ofh$9yRX?~N% z$hRGc54B5Yd^5EplcY6)YdlF^n1-xtv?cVH#xKjk`IkZO1;6<085u0c398hvC+BEM zIl%L8fiXHUw6vnp>bk^O0i7>&je&L@l#dx}3FV;nh2?CQD;(27Tc!i;>3}d!dt~E>(M& z##+KC(3EitmTC+yv&k48C)IuX9NcgYO7Sm~^SM(dyE@y#74MLoRPgXRbV^;e z83RhH%@|OaZN{L++_fTmuG6GxjxLVVTz{1lRo1TQow+<7&&hStBy5SKCW&HfV=8Nq zESr>Y{vmXwQQda!I(t4U9PR8n zvq_TU!l7$gXdvHZn$r|lXD+oe0FH{AV>3p&r0AM@DtD3-bT;1^KEzT>4Vy92Y~*6& z7v1H+b#jCbbF{YwbY#pc&GidzpTeEu%(tKHWY6!!pBh0>I;>E-qU6MNbeLvuXFFv| zCrWZl7ibB&cA+v!2`zsaw|lU_E_{vvmN|iO;4extw(Wxj4#9zxi>##RIq|`Paj?FU zzIBJFE&=-a-l|KKKCHiR4K&Z56iLOLiqMw8LO*&`($`T!S zZ@WDIV2S?rFX^~wiT)SQO9dcF7lF_njcPYMD3M7Eb2$wU<55d>m88KiKEJY%#yKVG z-$;jg`HEkq`^!z=s6Ayvx)YML*d%NR(Cq&Lk5B(+EQV3A{?9Cig|ElE!&N@;wZ@gO z)rLF&h#8iI0o-^Y_89REKK*it`D$=RnW!@K(DQ&Jl8k%e)uwnG54^J^T+yDvhyd#x zbSdI$0-^DQgE@rk2v;WvaS5=_0skogg4u(I^b>&tx;WA#7LJE+2p-t6@JYjiG+Y38 zNO(Tm0lqCl5|g#U4puxIYMDZZ^Af~uNK!@@mMast8TavPZp~9n4`vP!1$PAM))35f zL}l?SILvaLl~)O$|J%XY{N&Fi?1X8bOSr65d*E{N03RUaL0pHgsvb4ZiW}K*oItmR zQ3+`15X`mGGbyqn5-xxjdPtV0*c1Rm1~WWk0e&8Wk=9@1;Y6DZzfOFv%bys5!;&6= z%~wftJh3^Li?|H{c;Ch*)jVZ9=*$k*7=WFgZUw1EmB8a!Z@US@+BAf-*Sl565M!+pw^BBUT=X6rh3Fka#?>Zo{_8 z;;Be@OHz=iBCggvGi)R4AxWvtfGFaMA^1e9X|}G!a#<_+(7kX4VWV}F-gwrkofty4 z0Jk}C2@rfAfh703d8%x-Fgb!vmKb($f?Z-ZcxX%i_U9 zvf*6@u$*Bd<2vSv50a&KlS|(x;T?P;^neP@wu$&uuWmXM6v6Sf+L3yAO7-;cvba=>_|Woa^d}*z$a;n=~5)p`mpl4HlPMR_j?aMbm4r5(5&KNF6@0@*L>! zB{a>2p6-eT0F1>zy<|MX8qj_ZVG{#BuOinc-hhwUzhi1LDfrTY>c#0?s`_Rjq;`d> zG!YT$K?nt0PBfbV30x%xEX~@VOLV|ZG$brnzzv1w-g0lD49#+K4T4P}%8MHr&{akF z&#;ZSEjaYD%G^|P;-f_fm5d>Axboyo5#@lEHBP1k)VT#e&{X}acu#WLi=`5m9G`(Tb# zBn{Ja&4s&y|FjF2B*}$oAeY?CkCQ!vj&na!s`EJwpi~{}x}NwC7bQ|{`#)X#{O7AI z&ceQXdBdr6$U*QMdB`OAb+uS|}7 z9RJKm4Vi~&mWKysKc;Tcnn~oek z(hT^3@>8xzgRN%CclQ}GXs!&31;`NoE7BIrpfnk@Q3hqpprbMfW+7(kH9URAMiuuP zE2SRZ5%bCOS2YMm!9f@}CRC0v53bu%V5OV~SlC7fTi#^m2+GbI&NlTXY)#yyN2fs3 z#Dh_Aj`16VwL(Z{HtO~jlw#}qU_sMn_=M3+cv*T&ZScG-36~k7)HiyP{j{V3&9`Rc_ElMnSgs=>YNZ;xKL9ep*s)-&Sil& zOt}MDc!&!gN&1n(h1xU$sPlNxQ(2Ubw@W|~64esbJrB4dMnv8^+@%;v{!vtY=wc8} z%+*9`IF&(&En2$_Ay5fKX=?!zxh|G30A47IC)pG?D#CTra4!g>L~KV_g^bXPV8`GH z)`o)K!Xy(`0!x_W%1Tg?8m=>`!%<#Dtg<&;91I5Yuax1ENMd2dj}`{2p70lav{gM9jwaR!Mo@fg3E?Ok={~+SDrRKS&hDsO;6?+B(oud0o1Sn zEkT9J95{1Dcqxm#*jO%k%1RASSzU!`j7TK;>;i(&b~xn5T7_#_%HnMYLN;hJ4wh`J z)HRrj$DFWL0Y0XyVA|BhWLmfkj=c+);BXGppFBbdw+pq6fCE+To}!7MVsk_;`s9V$ ztkm6*nLKrB#e02s?J8h>@no##COIL=mI9rc&yXO1@c2 zB-Q_ohQWbR9w*%q+#D!ND&uJj7s6p^7mi?XIv0B+jY*QgMLXTGcb5vG^Src$i;QSs zF3(d2LmU$choUU9H<37-0CG)1a%CbxT}*^v)7_x9ycp%V)k+kcO9l}+*dx}Bi+c-y zC@x{bMP?dsZ`uz<)}|6h30`Ve{8Ul(sxUcq;DFbI5;v0>3f1{>S!_ufC&l6u^@#g$ki#V)T@vM7!4Z_&I=&G%I9*d zcsf9d_-LtR9gkzpQ%kUrwi{2(YZ?~AIaWLz{+ISk>@tC5kcYS`Fo0adbT%efZuc}R5Rbbw0Lyk!hO!yg32&25<cWkiNTU zwhr{#EDGyctkiu{gz>=Vy8ixDp-4|CBh|b-XQGAAs!7I7~ZBhkX*oTTLj!4jFgj@TuMg{DPd5W z3$!GKp@l-im~x&zoc-+Zn?*W>K}ij|gl58EYhOLiQZ3;(rl1cgo8bg|_Bgp%xKTc4kZoh*g#m!@>At;StgVvIuOSm`@UUuMU zc)71 zEV$YkeEncovr;voSZFJLe4z`hbF`xj7U!F`pWn5lPh)`RkDlHISP!D#ze zsV#pQjsAu7r~}w=ttQkDQy?@9IgmCRwpxTwe@Go1QF@>B7dC?7&@=~+hA+a|7W8K1 z%xHw8wNX)?1E4o~T$}jzaUU^RpO~f-Rs{MX>B)$A2LlRokA`Gqw5OLSUYnc-2rnbi zKq^Co0wRYIJj<>zP9h$+OHAf=C|ks{lSDGfjBTJH!xj+i9VRQYQs8V42w*NqFYF3o zvK>H&075lv7yN~K2xm)1^>jDNcml&yxP%KAqNFOGmlH9?4peRVC^ce=GRO>B8c(*N zCq@t}5hq3!=zK(_Sk1QT72~S#vWb}EEy~2B!J>>T_!W~kzKJt&fg;Ypi&_0eE72xi zl!>?Gi8Am~N=jpQC+PzN6;*fi0X3^sPKTHF4gLkG0uGm?ifRIAPX48a|zFA;q}Sy%R!%y0CG^kgthfD!L6XJ!EP z8Bt=wn^7dP;3Bbxv zLp@KFfpPE#cYjFD3FR=kJQ5`fM9E>IWCxMgVi9klh!-G_knlB!;4cPiVKDHBS?EQO zWy6*xo8Vi5>vs;3Xe8c&%P`m!u34aAcyD=$B5)!o$(p3W6&z0h`FNZ}CC|g41H9X4 zu<|$t;*)403?Wurw_@1!R3N+sR-jogV4{9acw46X>aiG=mfEl$EQcZ>sA1_lqJx!+ z+p_8X$Ms{S9!JQB4vVpIGwH0&yS>sxUf;VTWa85?7LSDf(^D3RPB{p5@6V~JNwjM9C(ccgQ=gI603Y%Jkzu3HIq ziQxah6}HJW7pTG}HXD%d4opbc3#=Ox6^Jr0)Dm9ikZeJ?SQ5M_G+0tj=NK@G88^qV zy~PDsA1ieW62Of<&J_v}W9y3)fB=$h=3@G|9?*Jf&zTHNmk&&l4_L|v4CMm@S8V%;TU9M^wf za*3mys&abF; z0guTp<^?+=G`ax;LSfOj3Ap!7-WZAi-0)!sjo=ADNF`FXY7oE)6tC-|BguUMJy;k; zmGcD9ewvsGcYIh^vQ{jEfMF%L>hThYcu|X$U}uF<1=OvMpn;k`ol68-OClX?~jPMIcwNtY(< zSG)((rCy`(0AChnMX;FbV6rxrOb22b!V*S8AzqY-=L>hXUY3ww1C$_Jc0vzK3Rd!ix(RvMd5J>bjUifR(R3mCR}v0&Rj# zFI(tU3&}t&UEV}?NpYeck&y<>0=&;kAxMD1N?8Q}QA+$IQG^MFT&M|?17PP4KTVPa z8hXX1^8$#AIDfP9uM?Ts0ECFtyopSl%!!K_He#eP$I){TWaSmXJl zI)ySx?SUY*AG0FEyH+GZpsf<1`ve&91lB9DTo7`JK~Qp>A71>;3!q0wkz*J454$T+ zyNO-45Op5_F(p(60{i?60tyW2bfyL`zIUZUK!a$zYK^OqDgD?n_3WFvP22Jqcbqso6^j7nfdN%}N z5Tiy9W7A_e1~H^CfGqODz+PEo&n7g4Nw`c-)MVSaz{|kr!nSUS1Fdp!NDF#FLlSzRK=X=S4t~DD(1-z561;`*g0

    zz60BhBu&LKUQ#6dvpKo%4)R{oLBTNq+^SAKlEOUCyO>G?GLw_k>|D z6N|sK# z7$hluK)%Rh*QgSJB1FZM3l(LsVE&u8A&c7aU)nd z+u)Qy$w=~#q(A@K#Q#hJ^^{KhQVG;K^HU;7e(ERnWy*}4ZT8Umn;;23Z&-g6#98_4 z2j}a{{v44%I6&1bw>LsIgKZ!Y50pVo>r&Bd&Jt?p1%kxYFLhe5bAQ%dSUexr zr|u#brh9@CIX_DrhJaQI>Z+G$wmumPYh&^+srSe%vP*A(1cEhiYBjj!Ex-yFk#2d9 z0Z4xH6MpOPgf9*=6q|d%HpXgP_6fhKu-1?t?BL6v@CP$-5wQk0!@b1jvlySnYL0}O zSQ)~M&(<0ESHQNKq%2Scdv*yT%2qouyU@nk0&^Q&36Cn)-hr~ClN%6uKzR|I#{_Bv2B)S_?2*Mkj0dp!(7K6Xa}`Ws;* z4oDeo>$)Y1W^cYcY*rV3V01UCP&eIe41U!t}sT9c?C+gS6b zXtoJpB)O8!xkKb)E}o_Y$NF4cVf6?fxOh&aZsS3nxN4|+CE3VA-_c$(sH!3q(6az6 z+HgaOtUN*iU2?$Y1#T$G#lTjQcpBv;q2_4>Q$+6N5Pa}mqk}%Hi45G^f!!QovL#K- z!DTG$KEdZbHGvE6F$o-Se@QS2w%sNYRaLLV99J>Z0lr1RaVKi`2Ut?yTeK3jMo|WG ziYOEN`wCA_S;9fg*|T6FD%ri=g40S^C>+l7^d;jK%An;kXf;4o9e)5s<#-1WwuVES0(?fr9hO1)08wuhm85TH z$)GTRsJ8{OxL2~c0m{-GV*#Sl1p`E3zgh-e1qk_1k=6kao>=41*bsqcZ5)~nC5cPH|Kto9k zUIH|ngnGdlFY0XqKvdi=S)58QXmC>lfpM3th!q0IX^G=G3bkeH?dWI#gO077xY zp`Dh+wSsLDRfi5RA64%%fT*~&08w=`07TWX3%Wp;EaenHRCzX#h^j3ZAgVTWIzT~V z`bodgU&qFOFM6eTYMWK3dk1E3)!WC4k&o|!0v zoB@Igp}oPfxHuWKR0geG%ap*7I;Mr0{_0HS#9C_ohFya8ww`4)a? zKk)}122BI{ouU~2McIwdc;wga|wX3LGMnG)zI_9AP0Db_CBq1(9 z$T5H)K%=R+|2Ge)%9)N}FEHqN@C#y;=C*I(O!y;tC=Nkhmi9T)(h~lYxyV%5Hl!34 zBY*T2b2I382r&qtUWc}|!XL>aa+!KYWV($)E=S?LZ{`K6#Kd-qSr0KMy2NBd4E5+p`29Ep-$~M7YiYDX_^$)}iX}5>{*nWJv62}0 z15X9{i$BtG9(RfPyKyJJZj_}#$|E(<-jRBw<$QpkD|A|CyHNJv2dmB)G^4MCnN5OW z)I2zw8!q6&EJej&iRe?RvP+B}#JIBL(^x``4qHA34eMiJ#_BA`6Jn@GiXm#Dt}r+| z)1do8=|jBu+OKjqumT8{t)U5VfoPyc-M&h*nV00hAUG}_Vo1YP2|G~cs1oy4N!(wI z+d5;V#%+=qiD9cG?yDdZ%GNa~T~^~b~g&@yll z(E>S19%!~33iUS8lVZrfaXtb|K@Vr>x1#?E5n2hm_3J>y~9vl@cclMjKz5kz` z{6@NFnkXe21!}xK=ccly-{pBqYg!{>$LyQav}e=Y9i!78YV0j|lr*sE?$flo>dl5u zc`6qcpG;OVE_k_az@@cw+4%!L=$wdfn1A+Tz3s)6C3hb5Z+`xGo?Gsn*7DREp;uN^ zucCvIa~HJ-{dj#XIGyiH=hQ_h&Y3fT_4SjwviPb_wDoLuxYKjnfV*+?Lw8p_XNfsbN zpj}O+-`psp<`kgUoRXAahu z_nmNh=5qBjBdvWec$0Vf(pI%+d5o>qCk0macV8V(tp2_Cu!l@xpGWaM zRp9DgO|;>i0b!JF*16A)}5bE4QoU`iyp9VOnn?0^W(75N` zz2ps5yDpd9x19dr3IBcQ`KnOw!u^jGb8V(soN{-mAS-@I->zO^|MZt%-uHZ!<^UK_e3Og-!M<%kfO?V8w-u* z)KI0kUf#5BE2duB#937EEXVNVZm%8Cec1$^M#LcT5JTXJ#oe z>-%Hfa|#cY?Koe*^!6$HrjA?_?GG0&q?eq#ZnELD`~E#=^txG8p4*^Ud(*(X-s4he zo$km*A*Tzb23}Us3iI1&7&Bt*Mb$IAGSo`7o^vbm#jSC<5iw%%U4dXyXttpq$<6!mO?T+@sFPIk_3e!X3A@vsStFESbvI zt#hx5ZC$wDwk6QBHfJQ~Mef+z+$`q~=Al|49|m8pAkAnDoU#JEVX-nwBS8CrQ~;IzDMjEliSuK0C%v;v4r*Fu%rCj3 z?eUPF-g_hWyoOlVsJp+U&hnCaS+=E9>-oWJ4rF$}l_~C}Lc8JXU|Ktc2>Kd*-Mt~v z!|(jL-ci|m?%9abHfv}{pZ8DnA3ol&P$RvyuFxb~{Id!+#{`CC|G@UzcJHly+#^ehBgDg(xh=*j$0=sxYV z*kO8XeQ=U#OLD-^k1t+cD*5qq@w&>p6S6CAe6>gyo>yA8b)iS$Nvq%k2d8BTt-Bw} z8glJxu1Z=(4x8`S;;#|a%DZV(H*d8@iC}V1pN|TKNwb-oq!Z@QW zm$ok@MXRuXy6yZ~=Y7Jm8WShi)kXOXSlcT-{Z+Mpbw z$~|{|pR(4+-mNW{Hy$Wyxtm${xv5Yo=b%_SKeFC*`-qkisc(`ZuOD@Yt%=d{Ya2O& z*U(^5ACj$9wsek1qsNfokIsL7Jf*O=|~!@2vkZ?#9P^zx`;u zT^M<2*$-Pg1ryphZKCDIa_|wOf|9wkPQ0;y9q+5OY4US&P zUtKpD*Zy`#`$kZ&bg}XD^O@%B8qW`^tjkt>{V{p=v65i>=yeWJqq5x-8ZCN`JEWwd z8v*;XhQT&Ho+lm1+~-iZCPZu9-r*zCFFY-*_^?Y{*&I~=qe!>qMcsvlLeBTf1L`)y z^kK=T*4doZtBh^yT@h~0dogKI;*VLmk-?8zeUi(@s<^*hVCnGXWR6O~yPZ9Encc8S zkNcsw0q6g*5he8KJ1LBr7kLVg4yq_MmsBX8S}bO!_ThIcaO*feAB<=$q~&@x#9h; zei+lUBkN1A{liZ7SmzYa=J<^7t!wg=vnZpWkMr|IeV_82Eo+U|SY@ogW_`9zb=>&3 zb~dUhD<@7LS2RA@Rbj%6zOyZ2mTVtuQTkvE{g9@4$|Y~p(|0$Syo#(D{g~dvZ0(1SPgLHozo;_s9mKQp`Kk5zEKeKSep!#!$ynycp^Se*fZ`Gb} zT)N=2(blVa92mdF>`|Qd&<%-(e76O0@B0d-Y`dGV@R2B) zpEqr3A7%9=gM)4_-YZy^v|-?+h1av0i+)_c^4p1#g;A^QlIPWbwTx+6`!zahWp3oG z*NJdG)ii93<;QU4rN@J8de55^a>Ovut+*-RPVN5SKQ7FjdyX+AL>&G!RHvfWq3^EV zjxK}TrzIt1<>=6Y zKf9?fdTu#&SPM(%`CG3YyI%*k2E2LxY*b@S+MA|yizCe!e8XS8E9mv3yt?Z9j;PH) z4=H+f7_s|*)mn7_+oa1o+7oho+Z>u`AD0SCJ`9_X@~($B@BKzwmDW9m6`#It5`Veb z!T%iKx3JE8?790IqVEr^{+Rf%@YDQyV&~~6)q_7h{&U*cNB7ktYgZ*Q;j#oLx42pFr>jfR=JNLk zMm3x5U*MUr*VZO~-(`cg?2nVj?K=Ep@t)r|U))_8e>wMMKgBZ_4{-BDH&^7VJ-m6! z`XuXg5XKHucu*Vf-zB zug#81%~iu2Z}*?HCVux(ohv7<*)LL_czksBtg9KCxuMqGD`~4vg z?Ueemr0VIiqim_YUQS&|7HRP?<*au$D z!_R8ybGzkTX*scXPnw!`{}T_FFRcx=TDP#;uys)M2F90R)*)-R3e#*xt$Q14h#mg=yu-Ws^`o4wnJjC6==pNWobA~* zk?rNen!aHc#c{0kq>8bA&vRTGe7PMSE<>{#KgXvLIel8j_G#m;VE#UQVxiukropxg zJ+~aMeM($E;cI4{H}lQxsy{tXB)i(*?f1GPYOr;X3UAeemrbLuuE@xUy|d$u{>gT? zwf?+vq8$mE7j-iAD6qgfqS8N<@au*3>^DTb@_Ds#~GoqiwQ>;BoTU!-$Da_y&# zs-Tz6dG-F&GgL~(Hsvm=$s+p9 zF?SW^-dkPb26PzQ+Sg;{Z~20Ta@Nf{_WFYtkB;E==x3?BVBfNYkSq7u^hE(bb8g3N zyB2?a$oswC_L-V3hpdkMxG}rO6vemB3+9O4-x3eAd(>##HrFj_RJ-}W4Ym(X4s*YB zZ)sU?V|tG%FKie(%Z29`tb6)Lug|`-e#~rg%$n%=ez4+-D7(OkcMjhouG~H} zHrdj4={>(;rO~HF3l`sdd;N0Ey#X`3pWM~(d?4rJ@}z^)YQrmfozh4=;=8Nltksod z`m&#gw*R@Mx1Op+wnem?cE*7|AuCJfKbUA#A7kWrwr1nI<8_$gXR{Hs2)Bbg#Zi5b;xUuM#nqXt#*^u{&-Rg1tCn}j_zSRgc+M?oiPHEod zez6g)YntZl8?$5Xrac-D(?%yfD%kt&}nlMMKtp3S5TIZ@$ID7Wp0NdxgL+8hhXFRW(#=K)+t)BX0U-#U|F}Vl7PCAtp z_3-?)dq)e~xufq#{W0ZbH+nO_({X&g7_DJ#F08TDN7FDg*lrKGT}(b^5aI z?Q@&96kOQH(pM&NV;|U8M*{-EOoUfQw zty9=?mpx+s$yAYIUhbfsm!9uyEVyH~Q0dxk7OmYpQ{`YrgGQF-(g^kQ%JU`|ubUgS z`NbSxdSs+qt9DdiP-?Kr{SQGjmng+eZ?x$9ep{j3TKtK1**o||-IbpCO|Hbnf>+5$`BdPHak*}{_7u_tcg~wUoBCv*?S%WAYWG%Mo>z0P z_1om|rU>)sy6?wA(|8X83M%cG#_?v10e>Fu?&SYieepHdZu7?vSFk;NQI*ZUrlzyf zJ1lpoPE6|Qvmtj>ZUsKyIlI1H!=Ub3)``ljA?39P&&)hMq3_5u>dW&l_*xg8i#qnE zK&Z3z(&;=#-ZM49$?C1I?%G@ZUY&TH`EXe8_(y$&f6P(sxpA&_iu$~WiHjn94nEho zt-3*_9jW;8=N+vD zq8h`e><5c{LLX1P(SG(xOvc5Q_P+TSCkLF!xO?y3p2l5O84~9PRG>y(^;e}sJst7#2x-dl8 ze`ri~_Vlo47B|!qH=S3tXADv3bJnxluu)~_tS_FrpsH_p#%I0n=?G>?ZO4J!%G;(! zbvuYz^*IB!%`G|cdd`Po2@!j?E6m%_eY=X{p=J#Wn>eM=)NVBIUYjmWUGc175$Cs) zhB<0^T9)gpGq(MC_oDjZM=klP51$NPSyO%I{heo%!XBS)8}vXJz5HUIo1f1Pn-y~+ zu|YH6J~2(%=S2rAA~rU3)4~<5o5UV zjOxX)rD_?we7Zf+GFE62~ zm7I6{+R~W*M{8Zh(OkY-ZceiE4xw?zsx0l>Q%icfx!38k7q-UM1h&|&ADL6@IX3qN zM>{LGwwo{|bA?vc%x$zonkS6EK0IVmvGqlwpI=8*l=dB4ni`} zQBQ5lc~5v2AFuc+oq7}NF~2o3*yQ|(k6(71mgI@F*Cnh~$~N!2v+$cniul~nL-k4H zPqkRae@yC#Xmq$}Tc)*SM*WEK?~?f4nu3z;O8CaB9(rhB+1NXsF4j2D-LKmyykuEd zVwqj0KKOjAQ}@gRYkG+@Z~5M!sZ6Ogb%_2NL?kx2Uq5%=&tp$^RPQvg&AoM*8k_5D zvs}w>9P079;cNA$uN52Of@*yulU@wqdgRv6Q=urLW7`qnW<*nc0CGgGUtp2sozKaQuu-<=dS-g~lsYPDNdF&^uD; z-uu2Bq^#WyOlCkWFmzHVKobpB+a$HIdLf~~BDS<{AO9qO)<`}G<-ry|Y2#gETxjnbG` zXLD0fqOtm;PtVD(Y;_fiqhgEiC)zICY*A~UVf;dIA1$}6P%9;6zHNH{FrV|YCMPy# z`9#&#^)}`YRI^C-AFgG*eIiZ!@!2d|&upQoJCPH#c73jU)#KK(K9^fsy<18SZ2Vl8 zc{fL?uqj_#d~myIePk+Z09=nudQ%hYaJ0=&E2e=rVq{3YMZ?lErEFOK&vE`3JVfEt z$3L|WmFzW1Sr=-sGke(cvYdh+^*h_|eY`R5cH@uVmK};L+;Yn2$Elqv6OW`=E;Z8D zJ26J7_xph(c%zj}6XP9X8_u{zR(@K<6I#siJC#`RwbrG&;RUN5HUOU1rihPc_MDn0 z)>ZvIJN9bId0P=f*N@lVGD^v`x6NgJ4UN=Le%7R9k3$U4q_0IzK^4oFTb2#V(rul6 zTI0a)hkIu}`qP7^^__3(QyUbt&*7JzyVH0eac_8WennH(td)H}& zTu2`={6j_I)82_1yU`-R6eb2E89~IR5D+5n~xCccK+|7iTJ| z9DJl$QPRv5FFw_c-zQb0ms~b$4^|DqB_24-1G?wuE7?w`_34< zeM!ui2c;I~nuqA7-j`BLHr+ivx+e0KSr7VSy~sb;4n4Hy!0;B+pTmr2UDFM6b{djB z{5PE!TZRnQ``CNL!ZZ4Y=jsO;d=KF1PwYP5c)oV4(dh-HBR^f;I%@3hW3gMsMe}F8 z{1QKKW=`BAvn`1mhH5Wx;~NV4zK=_|yKPFc=+VNZ)AIOB)Rp@zz8y3;X_;W}!bt-+ zEMjI~|Lw~4A5n!PPs~fUTNPvZwLbdm+NQ|dl~ECiuV;msPFD#3XgMb6_)_IL^LpC^ z8XgG=XexFK-d}rX?%WH1gbZPv3w;_ccBrk;aqPXT?=<&8E>qVfB=PI#e0R}Ssc`bi zU+nyR{6PYWeoL4(s*q9bRt& zS_2zLJ$v5tCatFVh(-FVaNi3*dKJ9;UR7QGb92;=4o}5HU;DF-zTID>)xP8Mq&DB2 zgpaf)hYuyfrSDQE413S>?$N4ZyYW+n;hrzzOzu@TjJ{r$>j z|72g@zH#`K2P2ZpHMx!@-d;CKH;w;RT(e?#QIEz=70$;GUSCtT^Xj$Vu3S^?@&1OL zlHlgbd6RD!)%3rmaMpO;@l5X8dEXP)8%`Rzp-I1A=KhJ>H_!DrvT4Yx4;!B@E8AIE z-nJw8*zN6>y)u9QnzSn`H%4zuVz*w~OwUi<`mt(>STx3D^)!E_4E2WDYi<+a>C1k9 zO-%aoP{edxk#Zg`}+?Vq!%ujaUwcjMF#J*&(< zsB>=f;SlDnBYUIUbD9?}K5o!++Oe3UJ&zu{GW5Xv<(m7=nn&$T@LaGj-^Mn(&EWE` zag#spS^VSh?u(m$&%GR9c}B6{%RKIZi}@>VicZ~psCJrl()y$$E9e9f?0LR+NZ7gF z4*mu1pB2xp+iqG|pMK_o_EX^{pV<#CW|_ai@n29F8hlvgD$z6d_}eu>o4v=@zZ*R? z(*M!#wU%eg&gi!+QRb(|TzERS7B&E;-n&%rA>#hyr%w{iX3SxGx%Ttk*|^W->sR(p z&ZMJl^Pl`ybTzd6z_Ell<;gd1#SGhYY-y}<56#{-d-K1o(yZLk|90c>-SKNCow%ZN zRC$s8wd~QyCu(L~oz>ksH22ghTIDEL%ka&w{nb)uzI!&|&&{iXSFWmhJnre4+iUnf ziDvpXub#74PM?wZ2lvf=^)|OlVebsvb~$X`dD&-($%tn=y!lHVV?LLEQr>Wvdtk}D z??swpc2>HGb@L5(W@?rVAF(w1+zHLKxVl?T|u^!T};-e?=>B3--fs*dp#JdrEzw+b6z*D{@xQUSG3jA_AGyR zqQ6yW?NY<)h3hs%4{Eg@_Jtwbx;A9pD4R5c4Kv=Hu?z4}Yf~~E=zQ?W{`a@f{apX# zHE(2r$YWdI(AUFb73RNlIDgG)RQ<#DWhQf`y!4E;$=+TgEN?Hi27cJkrv-)Y)c>J3T|8B#NodWZW^Sw#dD!8@wE21neU0~Z)WCMd;VE9 z+uk+#M91rXcY~}4M?F}@Q@J|2>1Aw2#tQv6|4(t(0u^PI$7lQoL>ZaE$nd1ZBDxtq z`AE_5L7~D1<%HoH3TUm*(iI2Na$Uv|&(i0VwLW^7o2Qp-FD)b8R%O5gD;lD8@VO|y z!4gPCNQC|U@4a(prZ^qN-Lv-`zWbZ|-S_?9|M$)C|NZaA?^auyw=O@Ml0NeHLq~r2 zN*DWm>iqNFRyzH@9Qna>JI7YP=hL#%c~3(B!Jl1w?01o2*;iiL7`X2Bh+T_A*B|Y@ z`0CzA3*$c>bm*qOaBl3(_ph%@>-G2pBbH42+q(7V`ZWBQG_R-6wZqFYF3dRia(Y$4 zrJ^n`Kk>qsHN$7?#viS~4*-8TIka}j(BN887I~nFl^?EnBqr zt;z2-gw+MFn{e}!5&7c+)Ana4UG^<+$b0%kTtCM%O|ci72QRV2{xu{jx!=}fm)@-0 z{Y7(0jsLh!t9sT4%-EDTr*q6(mR&1;JM8$n*WP$=(4f|d{U+^rW8=lDmQ~Xhc8{v= z@qGTULFIujC48ieIX~`eyDjw0saLa8r#9Y|P&4Ib!;_<5e|EX=Z@wEnJ+4G6|NFAx z`3EZh92-5qxZkv;*?C{=DZ5-brFZ3m>P=g_UI_|0`{?E+w!8MtIsDP{0iW+E+B8+a ztYpN7{MMZCyWcoB?44o$FZZ&{UpceKhog@zEE=$&YQUOrcO-N%*y^`#Kfm_fZV4~m zyLC{=BZo%E-x=0>Mt?QJRuR4Z(!K}&?&T0hmWmI{%h(#!g+Dje^cJlVATB&?CNR%e}$3a+|= z9O#-&1t)kREod!lmUL>++vGz?JJOfcbSan;SWN~sC|3tlFqBj+O;jG6OfJwbV-i1O%@C?8vYTaAmBRm;`eYLg}b4XUwC9c!)SS6g$+vGK9GTDy~} zy&S4qI@GGY4s`r};F;K44Vm#;rL(pZU*jfco!NGQ)>4bv$rtH_8Y9-2h5(GfmQju2 z3w+rC=WkkR*3R6<^i*re>R%JBGuJCTJgqVM(0xty89)D?Rc)(;0V#yBvZE{{P zD~Fw@{giK=7lV}w2=O6nAFYk#7jBP6&~yi@rN}@F4r@Unz9%8Rj@TB{@(WUaadK{< zL4)t-Dx4y2t7hXfI>_K#HNH*8RGNnbA_ZoAD4-hGvTA|iTc`p!kTbi*AEiwN|0aQ_ z3Xbw>X^xO0Dgal6`h^N6UcK!ei00M!tH0i`yGh;!mA9%+Y`VP>%l2A2)}EP-5EG1P zzQs9)0P{Ik{W{bplj9H}$BA0Gv!;{Qrt;PP$xD>kVpWm&veg!%jAatLF@`TSWVuGK z9nSh1W5H3sq2z1YR1mGf!&$I;fQgz|Ql=@-UO%K2^<~mp#*V3mXAm;(j3|9~3 z7Ha#fLG0Y>%~UY(;6>=v+`_DeydL%v1KeO|9R>rLYO#Hp|gd2ct zdnmb>Iq5DnfYP=72hB<2%QLQk&u3+?y(x6*6_EKHQ^Spp72&H;nArt8HZbhK7GI$5y4olp$R558>QHd+KR(@D91wJZ4xgxLBh8hfuW|y9YpmGe8XtqQP zB+8M9tT1_r_aypMqC$zvBswS2_Y&Qdh?bexN7Ktum_$($JtR@GL{CXHPa>lD@mf|& zv|1uElje7cUd<61L330l(Q%2+Nz@{dFRV*>iS827DPcSQ z^Scj8G*P0bB$_GFB8eOlt&!*hiMB|zN1}3xj!ASuq9E`dcwa&!dO)J#5@kq~2s$5Z z^r2#>N@RtJFDFsq2KI(`pmpN`6NGS9eAcs;Ir)y?=hsp4gAX38;H^TA#v)ck%~10! z@Y=ZFcTV4-K5+UDmo?zj#+?^S!~)CX<^P@TD0;HSo(MFu@5Y@xCtYdW6gbtu(=rV6j}n8NqeH{)u0!Zo0xZ(D-XZndW-O2 zZO?5Z-nP*q`Py)-Mz0k(Hl@N@6X2{hD*tlCb@ea451k@K=F7G>s8>+6&*0jXp~bio zBQ;33L84M1KbFQFtOM%u@kh0gLw5>PD+QNYAub~YNE{1Po-0wVCPVR=tI3WjN7^3V zK?rCvrIJ)BdiGyTuS}ksf&^C4)3zXyZ+$i(&z;pZ3I$t)%ePDM(WU{rO)zqJ30EFa zxkR88PesgCDz!u5?H7{<>O{SqZA__@$NRtv=sxt2HX2uv05VJf+JZlK4=wmqAyYDd zB-1KVcG#05#py)i(255q#Kp%xGCt|yu|vm1MUIJ5#W80tvX;9tPTL~=H~hBrUsROG znPdhXv5@|OF&oiQ3hn8?ZTyz|+K&FCuLWn^IT&hB|J{Q*T;P&Mk-t55Q7G=MM8D{* zhXO5s2ld*2;UF$?i07TDH7G9wb6YZ5Yo;%>)#ORcenX!%6bb_0w9QJHt+@ednZC9f zij`(toA_KuF;3YzWlr~ZrWOk?u34RNnoe4JYO(!>dC?enObav>_`+G~B|7OxX@)oG zI`0~{FU;wjbNzy|)`VYNP8lMKl+rX;owgfWpe;?bNXZiEfuAg~Qt9Ab1?>dOc zc8M}QqU5MJBe5ku|dQ>BK8$=XA%2}xQmFpir8PoMiF-tae#W~Ins*zS(Y^Bw53?_qt4wBd~}apt`E=^W1aJJ@?#m&%Jf`+?6$}*L`QggZ9|JnX~4kq^8YDnKLUk zJVkv?eP~X)^7!}!oldt)rxSX=x&AM}fj%u+H|8tbrqloTuKDvTvNI}DX5|&QbF;Dv zGq$aoFJxwB=(O;KuHw9mn%F=`ZqXuFt}8z;W4@5>UN(PrOcqCeZs7t~zAHOp=FFKx zVisjC%FA0=m@z;7ks-O}EXY}youB1ekg;mzn)$P{3W{U0rWfaAy9x?(7GxA|^30#T za{lb%!n~LiS(zDG3l=WQDbCJi70;eEYvz3X%$hZS_7FI-vNPP7nVI?dMedC3O*J*% z%_uV8RWg5e)rOT%RK^yYol%^ZS+FRp$Q4Ojyu>wP+MJA>{NjQ|i}G_amTp|Rs=9Li zY|p0ovo~$7+&F*s+A6$9<2EZlBRjVsFE=~ih2&ejn>TN&@l>Mm43xE-YBsF&49&1G zH!sWWUX-1YTU1hzSvp^E6*^|kPhVB#si>*0tf+Zn)sQ+CWGpPm&MM4Z+DlS63#i-z^&8UVYkD$dde|CvG zCl=0vjD@b;!rUTPUPf7E%~N3r6*_`1vlpyZ2`sq4QP~S)^A~00X65G;X6EE%5I>Dj zWg0^+Xt=TZsiArET!qEC?wrCe2YRMbLQI2;GYSd{i?ZEC;4a2X8g{C{C?$DW^JlN# zRK2MNOf#GdvNJOZ7cMHyDgYOJDYm>DpWL`<+r}8Ev$Haa3f+YZ-31F`d2VZE&6cW7 zsD0B~^sO*|hXp})UPgBQqP(n}1z8yji*tZ06|_-t7M(S>C^siRCwDX?Ymm-fy$+Aj z8H=-BIeA4ckcU88w-R_-2_PdGHf`8kQ@KR}eQhM?f{eVv;_RaAESJW>jGL%&D>s5q z6wD}$mV!nD)zO&?Tm{*g`8n<{Zz|)j%{7~zsEOoVlu?wkC@a4>H~-7?f}7V=RUTaN3gG6w{qjg%4%StDxA@sQJ7tvlerL01%taF5{gSQ zT?;Y`vtv6;K}NoN!NS6YuA(SGHbjUbP0<4CQ4rBX%X%n=ksuiIatrbcigF{R4Heo2 z;Br@fRuROZ)(e?zi|z`A8AbW7OjllRR-_!pU(tz*G72-@d3mmdxfw-X$PhxshRO|_ z(Bq?%6=%5ebFzTL;*13wJ(V>ZS60uTU0G8D>at`N6*ZMBt20v6Kb`vSSe2H7e>21H zl`H9QRrr0ak|FY*#sVVmYJwrrj={ZzjPH_JgcfIR&ChKLWaCntgYF! zp@K$<5hIlLMn!olw|IsoXJIiZS8v*guI;H{BgD#$PiTd&S+gY?2<>$k5U~+4MN`yJ zAi`m>DcN9A;aXNYvtm{CrqxfX%}@pr3ZLbuSXsS!-O5p-Q)ho^bOn=^F?rXntg80b zU_`83xnMDA#YUd?K1J!tcY17!otQ zl%b7f8HTr(nu%snqoZ3J6&&4K>Pc$T=y4cSk-!*$D0ppDzO^G}R6}EOZr=DrMb*Z& zo7Bwo8U=&)I;^ebib)yG7{R*$G*m1$uy zDQha9sM-QC%4)3CI0`IZk(QRGR5|;h*=id+PppiFOnV&$S!_g1eH1kmvT#^T%561O zo=TFVYURp1(yH&@udZ5Ep$eB(-nDDPz(+@HSXm8GG(rv~qT&fJ^olK2-`Dz8bl#1d z)>V>7uNbxTa0;~=bv~5^?WrhxK~a&bAY)0<0yhToja9@7sAo;gV3vic&ccG?!ouvr zj3q0#R&9I&dht4_#j0*g0&ZxQg-~Y;icxx&ru7i7(v*V6mJ!EHjM47Qg3Ro!94*V1 zm0O3DTbNOZDTlid`j9#sP>WSYRcZ(5Tv=J6$f7kXJs<=NtzL;S3i_G1+M|U~uVv|m z1t`3t5t`*EShUniF&IK?fQyRFo2qDt*HyTes-Z5v^ zoYk{eg3{{yn%LnxHD%VCwP~|cwfNMO)R^HN@98OP*M!x9)ReXOn+3K|%1fQ8mA6_| zMk`#dC9&gGOiavRMKNA5vl3WcwXw2dNvSKROoxzRBexc$;2BbrM$|~k=wS5A;XRc? zkW1;cVboTv+(HoRZrlcyI&-FGgW_O>>J@alo~;FrTpXYto)#z+iMum>C6~)B-xs+=*10s{&DASS~ zRldJ54Sr)99BN4%ZvXklGzk0oH>SaFOoL#9|7%Qx6CNDm{PR`5KQm`*PC<`Pm@#8H z{(CAnY+k-~^{kYX*~?-3TwYUIjdhPo`xehiPu1$>Sawovb1S`1%-FPQy>3j|NP`)B zYQ_2lixkW9pysHg`YVmrrkN=z4?Xmd-41W3S*a}T;}hI^ht6*O<)Xu9b-EYyFeKq` z#+sVS)t;@D%9~Etjt7%bdsFWd%t%+c%KL<{M2qAJgfcJE?^H2sZ{_O>D&mgnQrDaw+!=b4tdHA?YR|>ZviLqw;o+F`YEVbi2ox z?yts>?k2$Z<1wU5M7p1jA>CA@dvgrw9zeQ}#*pq?NM}BSpQyi)=)oiYp)*m5@HkRB zvY+ORAstvsmp_JdgCSjC+cq`x>3FS7}HG|L%Q2g-fd${H)9Ox2+uiV zNH-Db%Eyq-f^@6KkdE-Obqwi94t;+N>8wasH->a(r2F9*(vckh+Y!=1C3tYd%8gZP z;q3xf!pefw9HMR4Bz+p0D?X5DY!xN-wt3aVDuY}&GEt!GAAc3R4e?2^*^ z?W$Yby!+E;q|BHNZ|XTS<~)QP@Y-69<=ss+nee{GV)AMaoJHo{|Gl(_5a(T0UA1~q zY2Ab(gvqWIcRO!ICo6H6*ae z?JCSH$XRlaJq|4^(J3m!BG<#q*Hms@zGdx(>gB6yR&HFqu5t@|o3*@jhz?is6*^p+ zZi-oVk4~4MqcQ*fPUZLRFc$2ICDZLin>|$e%yrk zi3SsQQ`{sy66uZR@p0UQ$yWRAH%~Ogo2E>?J27SYJ$G1c8kaEX7TdiK%uGw4l_cDG zD}UQv_a!?XcBX#&Ths2JF?;U3haQ~so%uul7<|OX@wmp}B3Ma&5N>I_qdr4=1HnHT z*A!gTe@RvXT;096l5jb2IdNs&P32J;8XgD-)P8C=wfS~jcjKCgD-+jBTn)Gaxb%8FJvz4Djw=OM2Cm0-qyC{N)?TfRTHCZXX>B1|Y4p-)rqNBKokl;R zA<25Ws7-Wfe}4Gr-ZWwA1XLPNRw_@)KT*w(tZJq^+K>e`|7psfv|e8l zuENxzUu@ADCFKGBB@)9=nP*CIs7D$QKW1%s?~aT24g_zL@+{6g>z13Ejns%dG~&}> zoZ}+P=(&S391#0ihLd-6-+Msn44g5p-~x|!s2Ok3GD@9%Yj-%Z(-D3qJZOJq<{ZxoRL5XuijJ4J(*Zw+WsjyCP-%{Pa^cV-BDxx^2A zart`vVudHfedZ1+*HT`*m^DaWZxQ#I!tJSQqbcQ+CkmeIzLRU`0)ateIF4{4p0_Po zDpd=~sQ9worL(A*Eu)V~>jaY#mY;zh}SSB?$bUjxdQ0O>GED^xi`$BcaIC zMZKQ=IoeqMrqlecgAfstTS$>>FJ0vK{L#N$u=;BSo8KeYQH;g!7R>(^LLXcs=p=-T zq1*YLTabru{V^345`IWG*&AxQ$hZ6jBAO@r%)VuM@ngLh(2H$xO&9CV_h%wPP4f^v z{tab9%HlX*vEFCa5_3r0-*1T|9jYy`{_>)MoAJd~Ea3b*Wt&8=(Vx@9qqRP+qZ-``Cg-0pGx1xR}sU9~p zElz`&Q!>5V4<8&2;&0c6~%Xe^vhG#T=;32!v7y zgu}rkr4&JF|1kV%iHS^Sz@}y}wS{vFb`D%GRtr`=F(@%A-}KlQp->dh<1raBRqHFj z&)53X$C>cQnV=)#Z(M@ONcZs*CQ|>jERmKALYXwc@9_u%gxsDEu8nIeSG%1w2mqQw z=ucMf-GE*Qiv@r+q&HeRE_Ud>oY;Ymgie^q@A_YW7nzb}i%gI^PWwyIFI|EOebc-Y z?QvX8_Xx@L+0r1|nkXl8e5+{&@L@ge60E&!cs|LxJQF@jfY_-Qy9`d`J6Un9_6YTS z>ekLr>ueZq6J>*gZ?%|FQ*Rr=&qH804OL_ay%Ho=g~qDy6*t>{jpXCqM4(dH>ACeVN{I z@18!{9^_9R>OG+Z7*IgqWUY__#PY90;@(915vsK*Xf~fj15Ym(Y|RMrxn_j$o>JSy zK<$QXx1T)dyi`{N+$YN>$4NtT@1frI-s4nw{P)M9@V4MhTIEz%JJl6iQA`bn=~Mww zW1$|xy|45U);|WXheGe3s-QN5?9up^_S1M`jTw9}{w!vrkGagzR_-`0efo@}JAG39 z9nC#E+Vw#W{O5Z%k(6R4=Jn1=wV#L`da=_WUNzVLwzHANLA{e@BQ!$CMfrPr`G=Ig z3*1Tb0P4BYdr7_iNAmgB3C^S5EV;!?T6A!nGClyMYyFUj&(EN2^0VwF21vL&-}ihV z9sL!!K-cr3oF8%?;^n`>3mRsXdV4;^-7E$ST$}%qYhsr^EGeGawT^07hiQ>+X;qw{DL&%qytR5>^akOwyCZDref}` z@)9jK)zlH^yk5H>Qimmb^pTFC1MeeYG;69?xV>+@^bl(BKB(wdH=vL;T&D(kXGUd= zQOtrs5sqC-QGlL=d-9%-1*n|HA2&w*eSk2&sIN+;CHP9a-bot@a=vc!CgBE zLc;o^Xa(seMpBBDJm$K1h6w3(DnTh(F1#ci>p9nOmL{nXPY*O)CP?e<2X3bmZk?U= z2^A~E1EI${k_P-NCyT;F1&HequbZV~brXL27W$}KiSxbfe~^wO9qQ@3*YE;z=(xrg+{pi^e>Xvm zx)W&vM|Hosq+BixF&>i!dp=BOz-et{sg*VYE)@3fRG3mog|p+)Et7spXp#VPQac!y zh^}_0;RyS26v7r>k_LJ{Zum$=*bEh6_k|JG&hP#SxHIXPpJn4)Uz<)4_lu}bykeFH zG;|&8`3UG*sFX(N`u7OB6l_gbu{Be{)>N^5Kq+)6&vrOZ@w<~zt8{QU>NL!~#xO@} zU>v2yII(UAU|O$Rs`ZbiiypUz(vcDRV`4{1K_>8ePAU7|c4x;>gi6OS6FC7vXO~U; zQ4Kn#)OhsG*o=53Xlf}sUGqlml?MVt%_W1{#SC}1A-|E-uP z)p4`hI@nu%oGC>8qv3oC(7S}x1+gQjNcO=EzQ5P4aNC) zzQlfa&~M)3{=5u-p533|&pXq97|gV5B_!22dd}}VMI)L0~pcl$EW8gy*n3OcBj-=&+Iq-oAie54@ z4I+7}Y?z*O7&x7aDvbz8Lq;>z`NqNl{*4k8bqGoO_|~nx{GJ~E4NTPdJ)g_AnJC02 z+fu47#=}5_7mIA0T-ANb&R(ogz-)4|x$49Nusd<@R-HZuJ2$j0Gj-6a3ze`l091;OYcKCG`cqnBboSE*1RccG775 zFSa3>zbM1M>2a|=PSJm%52WacsffAwrhlWE!?S`5^cLIovPW2^#gVSUn2z)vDR)4c zB&`?(EHU&y!RX&ET}iqu74}KTWW&UyLxD3U*@iYrWq%+-L;I5r=}AY4uu`r8ElrgQ zuSr|a%X4R9evl&1)o4~LBttt)0dnV}0F`c6<>ZvA5RpznutK;9$))!h0h6mPFv5MI z5SIwofSPH@2FWc5P2oz3?2L#Y5F^x4?vIE`g0wF zLN*Xj20r>}xJvyP%}CxlrRj8?Vb z-qsXi8KyMgjUwvfktJwo1~2&@87JEwh}6ic8L^6_bAc}=H|(e4rMDWcunKNR$`dI2 z1b|^70Onu_+>q>B94}i^0#_zCv{McxcEr?4oq@s0@sx-OC*NZI*2$1ohFNXF@nLZV z&a$CcyD!rq8)n617$J4i+e0e$WyXzIH}S1+F~_wC`NWHzc13X|ZU#d6rtgDMAyyx4 z*hi8wtVlw3(qHq_q@&FZd5oRxDFoXS1Z}xA4~@~0f$yDIdmYrmT#GZ;y2Y%hg}E^B zb?>+w^2D1$6&=s8+*-CMvspOXQ}5qNHStZ`fLLkw z&+sfaTto%3MbR#fNtSnH!(pmCDIlkINl*V4K#Oe&VtYbhkPBSlP`MjIv6R^(to$w> zB{?oMo#1y}p>iNUp5BKni>un6fx;>6I)Im|ZhDrVOg7wM%RouS{S+o&Ln2;5=WbTDvcoZOi9d@6#FIaSHYniFz#i~Ee}yQyj0 zSE#CeT>?wt=x%0sn0u^d-Q0J!t&tQA1{5{JznfujH^bm=hQZwogS&@gP(dBKyhYrv zcVcMaTP6du=p!WSt)!3l@-3f2M_>wq)FQkJgb*J)-ejOO?0X3T9qBLr49%jErv7cR z2c^IGQ{~+PGbNCTceDfXK<*5@%ReSE(Ws-$7g3pA!ib;{>_GbSM}Lj{aw-X3fd(sn z*J;!fOi=YN>FK?QcXsf*{t3ab-|fM$1*iq-pD8212TkFi8A41#U4X&>gM;)mk*!3f z;g5)*RVNq?ThfSzi)GitHts^P?1n(SuvqHiE<{su8o<^lsnYN;w~J^RI6DqwXtLb+ za4aDeAZcd3&q!!22WBxFCj$ef!A}#QfXl|W%pjB#x`71)#qDI+LI~e-7PuD`j!1uz zF~iy+%y3#`2L1=-NIdr)erFNxDpP!oZly8>Fsi_!z-i%I9-?BQ2C!g8aMG1pcm((V zC*+%>t^X8m=?#QAjt&tRcaZIIzvFMj5UHUfFq4F24mykSsYls*fVV$HKvy*Nq zAfDkb1qJ{--&D$)!122m;lXhcomT1%&)3IVBH#KWf`{uNJ?46buZ3|-?duGoeVHoc zyGy8wZitR&1Jum`M;HNG^XlJ!2DLjbIy<2QSv=y5ocf^GCYRYXV+)o! z_{IsSPX1>bG|u3i^3&A+iq+o6qJ!Wg`Jb1=0SStz#c{Febp8CV1)a|{1AsX{uMH5Q zlR7j!{}S~N!*j#sGayl|vElM3xYwH+E?>u8u}?GTq$0BjGIV>UuGbfb&7P(hUexDV zV%|~0$ba$r_!0l&;<*vSqXP}fxT^gwUP7Hs0TJ^WU~M4GphH&rMp_zVEH7Tx`*)Mz zsl8deY}kI2v&gvJD7(gwa}IbW4>5W_(yiF+cc@EdV=hKeb5xx-vK-0GWn<*t z3ZtV9%wUm!{2Js^`Yg``NF%X5&Dl}=8ODRgcL|_WHjYTglLi7;4B{0|PQB!30-xXg zZ-^)Ezs&jBFwXCOnb1YRGsOAz7zr`GckW>_7~y=&edv=>O^bze6#HDElEH|TOIXW; zlT<6-I6#Zl*sm<@?ig#I=jMp0e5_&xMCBtLxNCMwlD9^P+yB52rIQ9}iipdku)~0O zePZ2|So%GN5eW;u<|U5P&W_Oph}JMw!=xqTZt=3wV}U^~0*<4N6~^j<8kJ}8erbFH z-}nzSkmi|3uUM5_yto4?qwoNld5q4(eA7CFI}iDbjP+CGoqb?~XZ*_s{Z_FpE$OiL z4^o~{c4ru!pYl!fkq~kcYQh)97B7<0!0g`&{%=sw$s6^~!~R9r0K^f#iB|5uRxuJ* ziw%B`Z+sagh=T@x_g~Y)2fTlgfp2V~=gSBrqu|#npICd5aeJ=xN3kQ#xy{J8Orr6t z7L!T7>2Y90deCuVFG|n2^hXKZ>4a2dxb(R*uqAOM!j2S%{`a7~lk^v z5$b>aU+8xyX_8W&L3X8tE@2$-?R2JriL6RE`2Vo zFpwJS&$S{mS#exu3daJRKi4L)QdMgb)Wcl6#EO*)?dn1x*9HTS7~mKCa|O*KfY#@8 zlRe2|8!w(2@aHCW<)#1%9Z8JNH0LIudJ9kul(C-4I)->b|Gft#KnXZ47wDGsmi+5? zNN)sO#i6&m$azPHWDpbLCuvO=>V7{G&NWG|++k-^CyK1&&F%F}itdstIxxC>4N}L7 zj&hcOZ#~d(xefJrDwHW@!{q?IEtWc2Jd~p~k%TlM_s&q}kPu++kN}&g%r}{XOH-RS zIX1QDgi^fs@0X}0A`iLKR9xy^(GdZy!qLW@LYANbj?-OF)69?lR3NBFXmK0?$sH|L|0sA5#Q8w=(RX)f|Rw&i-;=uD(7+ z=}&yCVS-$nfwZm(A+C!7P)IL&<;7KqF$&VC_HDkkc4~-to^LIkdR?}Z$fXa*1+K*T zEQQUw3Lg?mozNpSKvj4FpIIE#GfxvE->M@ZWm5*Alim6_#2NyZ<5&YasA(p?bz&Gx zuqWRtn-*{f<;AR`r8>4=;%u+aNqVnbuGeF}W)B*W%`Sb4g(D~5I*ro9`1)OW`CUe+ zpT6ZwLvm`NynLqmM#eiV!8woB9;m=FAyw|q2`PvskQsg*CqS`Og2PPMw9~4wMZp&| zxr_BTH5(pK=;S<7`#DPFt~+~bK`&bEj?jwA6VIEPPEbi8IRqoWi`0gst|duF%P=K_ zIty1C2#+AI%{OU!i9o(JH4RNl=UWrLy#rYq`sr6XR@F9R0d$0uRVVt_>R}rA$$tEv zp1KT^!;j1jojRmS>fqkyI=Lf(E9StUIdIvm8nSM7oQ9#{`3~?_!-v%Kq#ni4P7!S} z5gp2k(pHM;j)^(sTdMQr=zRroojF_xGv7pI>C~*}n=&AhRySNo-a~9**%Xqm&RBbxst9vg z!}*^gcB%9#vlq~+z;y$^^DYkV*N%|1-(P3cdi*Wg5)=F?pi4CDql_KSOP+Bwxd|pn zIb>0{;3f`o-bv|r?m`!%UQ=s8j48cVFfD;`5|)N;1i}RDl3$=ZB$bg`T_Q?8?Pj0NxKsO*9Zacj+$;e%N*gr5v5~&hab$GAO`$8a6&9?f5(X zT!WOI=+7PW=l;Qahx4*`d{-{5-spl4iJ`d2TcUV5&I^YteI)3Xm;?!GJ}@RtvdLVC zv6{w51n@1Hq;M8s)GB}}18j%BuC_z!gb4~~-x2c+EdFqW4{W!Fj;!;W4oWm}3v$5BI~-}P*oL`tu?59Z22|G3&| zVy;0i6&jovQ3kpg7x{C~*BPZn2JV2raDXI%f({zJVe+p10Rhg$2|$K6Uz;V?89DD% zbjZXKRFYC6E!CBW#~oAf3Aj5H=(axIY?$fGi}U5_eF>d;TnJd?t~d*HHNOw$INHQ3 zdhZ?SIl8UsSg||WY)SXsMqok+<>+b#g7=DbSnRq}#aFW_#m6JAGa(d7bPm*GrW_T? zKlnS$DHWOkAgNJk10MZmJRHCS=!u1jeRv`Yw)rP`;-vzk-zar}dK%xyD%L6)A+PrC z!$8Tp%*!Z1v7xph2qpfOZY{zwx-|-K;#MZT#_lDHi)FA>F@nz{m=;V}5lBs$#C_%! zVJjY$AMU+uyfl=pqpCFH!hpEX*mThwx1xjOAh6EVx$?z$vy>DsE@LH^NrRfMWF?=X zaEV_6e=llQAp)S(3=RHr>DLTUr5zT)pGa-_1Cnr;z^#b{A3{^KR#8!C6$FW9oYa~% zTKzO_Rw^mi05^c=O;Rr;imkIzATy=nVlqU>x)_Wnw?wRwFHy6i5efjN3Jkds1E~fB zjXT=kXz-wU2T&u5B0`cdDB}VE$e?vj>dgR)Y`Yp*D?E2c6f8#@@)Bpnq97c|6jO$; zhJ8_hNrB^o4IeCBs?*&^KV0|3fOOzKhXdo+Vnutkv z$LaMh*(C@|iXkWyS##Hsr-kA?#NNeyR!5uj^ZMJ_c!x1PO?0)`^|HIgjvnsptUWKw z0CX%Qf);f(Jq`e9 z`3^w9zdp-=?@7MZ0IXbR`#n*mD7@*+@0@nX9tvM)dW-V>G8)ISEp4PCB=swIy ztOjen3;d^dW*TZZczoR`@_}5$hlK5wOoiXVccU(H!^Kpd&2j&1WTj}XzJUnNxfjWL(U`hF?nX6Rm?N%`@5l%KePQ)8n{umyqkV&Z-sq`{I#O+A3%LE_%|S-g8y}R8ixPIyr10!Y_;(%I|fkRM5I+j#!!K5^s+mGEjTPI3~Rl0ech{fu}1-|iCEPXVa zX{F(U-Zz=3hykhTf;ZTI?OK#5jJB$<)wAd^vf=!(@zLw;Z{iI$mruodV|;l;lI5DD z1A)HyH^3JmeZ5iqV45F6xyFV7F^M=BkCDg}og9f+j&Mo{PM9!}%p9Fe%r#!4bhOTd z65&bw6a+2Y=^KS>Fn8fbTMTg{j=;@`+gjY|>$+`=HBMR&Wl zEM=nJ^Ei4Y)Os_9V-pvkMUFN$aPCT@i01{8hQv?xkVG@3GJ`e(kBgN@qrq1eC68RT zNMA6#gmTdr3dbmq#-flhi4S?yQ7b${!oKm>b5Tj%A4uZg47XihW3mN^hVin$2-Id{ zTF*I6_LEqurR6!+Eoyh*iGzS@bhSYeiGya0cT$LAQ7%;cJw(U4CjJmG-P!S^`SDTmpFe7{Bc^ai4&Rtj<2Z+egIk?#KH)PXKf6NVbt3NT{cE9Vc= ze80Ke6xd`k>WhrNQUi^!kpH^v{pjj-g0v0eFVA$RZcTUM`PPFzw~}(uPbg;L*lt3&LYFM-(zs&-p23- z8L1e0fr9^(5+D}Kv@Lma&|>{Ia|IK%$Qx1rp#LqEstnHkW#y0>AwbEtazYEdB2AVq z!R^-h79t4zIEV)SWEh*JF4`^_cz+ZT^~QBXeunw=o7azLf$VK>0{&j1(fbtx{TS(oY*??D>BoYfy+-`KVx?Cb zz0zVY<|waFiLapZArt*zbV4TjAzRHWR{EjSK_Z|qkYLa;=scz{>b&}nu3RcWr&_$q zA;I)@52Bwc>tSQ=tl;#JGVl+)_QtVH}ZSOtBQ5-aV%Z&jSYYj z);4d(j(J21oma8&ud@R!a;|+Hg=xM5)GXIhAT9w+HP!un$!nni80dSP+Dplk-jkA#u5<(r~!SIA&^CdyE>zxFj`Kv-;2=c{ag|A>A@iW{|h zP6BhICjURam1cTSQM_j8&SJ<|`)ftdc(kJ;S}9O#Ru)HTEzv9;N;=FPg?#CF4r|<> zC4Gj+uIHpd#}$$}Nmrh8v?sMYFKwUT9N0b%YsnptbvS7ku(>`?qRoe_DdPDQTJm&B z9pu@Xud+AQk^#)rB4QicXyP#f_sfWNDBZHKU4<4H@&xbAC@%snHj1Wns6}}nLY1ZI z30UTL3(L}r4Bq>sxA{HCpbf!?BE3{_d&r9|l9{<@B73c{j8=*g2|N7L-!fuMhQ5eG z5>a3pq93EBq)Cj(*4$GM0;5dHg6wD@7S61XI72D8IJ^zDiSkzKlR)4#6Sn9&o z5wxP&LZ>CDRe3)}vDZXl)N$m+8pT=Hl6_4WM&1z0bTCGv_ zA%u3XqXIkMYMaQN0)4EU643|-Jy!p*ny#P_ghR0R`Tj=COhNoo zF%ZJI$N#`X?_EiqfP==SRN}OM2iGADDRB7+v*FnSKf!mB4iLpq5N+2m0~xdtoA%WU z04ENq?05!<$(SmbX)7gn7~Q%3IW!|#>UEq-Iz_$vIWWmwsn2l^FA(WT=akO=E}SWQ zw~wb1`Br1l4#NbQ9Nq-Y&2`DApd@sE#%_r3>6@HT!>+g}?N_s~M5uVY1z(VLZw#lf{ zNgUJ{My`U|R6Tg;+e6B|b4a<={~3Kt9c|C4xY(c61D@jKSWRKOLBZD8Wz}r6#+?EVoJV}t+JnQP`Emb?TIc%_9!BVVbR;O%fVM_DUuv_3 z4&h*kMVmfV`}I|HlN7!8xBUx|3E+i$@Wb@}PErpFN@epShPyHKKdor^c~=XlYk&U* zvK&PfPKTYU5ITnS!Bq9U7AD`q{V!D?>3=a50Q$ZCEki1(rT3#rhd^}dgQ>v(pQ`_X z&!`XT!9EO*9`r%NVye;y|GJ+Re4?3f0AmxFkmfAZ2a{EM8Fj^9jlC<9ZmxAklJBE; z#?;X|W9o>VQO7!?i*-g|ii&QYOl%i-jH>imm;gkdWV;R#LOA7{Hc-EFF*%e^yLE9{ z7(ND(Fc}@wrgh9-cGycaM&6@lD;ObJ6UATOqQ0r>D>$2E)c%P$jR_PU3-tRHT!#Dp zQ$s2lWB-J(yW##h44S_JW)exFKp_Fy6Zs#!cPYwlO-jf!0Pj!!r>eH>ruZMhy&21= zuc0RIbU0f|JeEoS1#jd_u2d3$LI zNR<-Nvb)hRBZ5r91Vuia-V3Ry`z5%ab~UZR<@P@-G}7y{f={_o@p$_gZqjWipw{0g z?4U4ZKOAl^(VI(Hj?2ZIxgkWC;d&g`I$WD^&Bc|0D<4KAO-tdT&B56$C%%3 z963P!QE@s#4FcczJCs4z@^`7M7KULBwM)ttmxOUjX?{;>+=4*61w?wLsdA}dE~&Pi zUC`GMMmQtwFcm1Z(Rcz!zePw$ikKPx!02K`3M9fF*hHyF;NAjJ@N6vO4yiM3u3B)3 zu)My9K4H~+k0PrbMbIYZ6n!;h7OFy&P4E4Ql&772!|!=go>nTx`#0}DXJ-;8!NX&yXMKDfw8R=GGSL-5|+ z)V(#g+5Et*7f($+f%BAb$Og*7?Auoy^8Q}V)OWzs>fqLUmo!@+zRNqMd71v<6?*T) z=4EjYuZZ*FC?*bvQX#qb{YM!9SRX|*vDP{O;LOr8pmiAdusZH_?_x<#DG3)q!u^Kmn!rU^L&@gf`4`73LsW z1LDMA3n>5quK4pwRnD_fAE5)mXk3+{jV>+;TRdnIXXhK4>vNt>r6XDKUlr0&hMcbl z{+#_?d1L`biMddCX)jmfJUlcn7jABZX=^T?`%@^ug@86s0=Uqw^VF+=#PN;)f=I9r zIdoZN+YD##)@-0~O2c)sW=Nge;`h=6p%+m+lXqO3vv=DS3Mxhu!W@R>e7^C!D9)c} zQ}!;*m5OY|W!&NDbM>5^9%uB#5>!Y;bI1)YmRM3bHp>i&UrwM-k-ql>_Z)+#A1WM&Td32Fn{^B5MKOeq>R~? zV&t3tr#lCd#4Z73EI_7K~aY^o(#U@ zIE~}P_@+}NZnSNSZx7kFsO`;(I`{@hl9*apEC8cM4<2MaKz$g^~7{@ITlQ z=>uRrC*BxMG+K&S;#RQ|z3-_1dq5lp3&!Z|g^KOUqlFY5mJF%npJSyhrmQ(AYhF&N zyO?hzllZ(Pg(V)3>*vUUPL+U~74+V&8Y*Nh z=Nn1?igc(mib8Iu-Y|vM{|5M-6LE*z_Qg*0LIeMFGXPRHsIvYPCiGZ$llt7xCy}Sr zdo}xFpvwkykPtu9!?2F#%O)M|gW82h?4fK!E=K0P|M(C8@DGJeu;d20Bi-S`K5;UInJV4^P72D*D zD6y9FZ!*E>rlcIU>=XtA>{FDw4FWBA~@jR^yrIBifDpJc9)6j;uw31@{y2)0r z(#Nzy+?Pn3e+XXeT&gAPg799#9_Ke>_5Jd6`n_ zdfj^Xx}uGPuyrXOvg>u_Wm2yO6ILIADryN85Csnaz+#k|pUls+22I+5U9CR_IaK_N zMZz;XV%SG++r1*k^B0xj|esS&cLKjcOyH{jeUuND>Ky zBY_6DhJ`X^SY}QT>PY}Y2D$J#d(p#=csa`x&-Sc^1@vgyPR3{i1>SCkjW7R^R5j%c z)D&^h92XevY+-#G z`GG+@Fe@nZ!>?5~&`Khkf2pJkXMnw{+iSq$47ME6Drt>zFQtQUz&iv(4YqU`1N}zv zvY8$Yfqu-B4D=Wm=#RtlVGU*|?BqO!0`Ld#gJbd1rQ}|@bSZfG7`)3J4yX#`#OiQx z$E1TOgoC#rk3YDX_Zd0zHt)lN`+YP!3b%zyZ0fEXcj+V!6^!e-0*4H#T{=?7mrGZA zLfjFq3%itSKaV=ihR!E@9MbA#;#4-DSWfC%qd-2I!0T)lewr5WHX{VMSp#~rLt&O< zW=gZ~WL!2}iMZ^zOf=*S<%RIZb);o0MmLpW&p#hhwTAot2X|{0J9dO71&)4 zMRd9MUhxYnFVh?g3~dnur}mbCsV?hY)M_7JeCTmO;JOq=)lkv?l{>~s*A5~9PPw|QIAZa+I;R;H{57O z@GP=bL$zV>V(TQ+vM_E9JrJVP_3EY&EG5brOm~v`7`i5Qsa-Vz)6!Akn%@H&BpplY z5zkFhXo&F=E35FIN`SCE-WQxG4q__0nfgV-rCxYvh}#V$&1lCY6Z8Bon!Ca>W)=e{!6@~MzvBZqxS+MPrP^n?i|!km-7OoTX5*E9 zP4o+TCmOs7orb$e0Y@Wk7#M!Ex~9i<1sxe{@TAGph9& zP`xX&S1Jm9YvXLlTd-ZB1|k8d5IW$SR;T(vTQ>R;fZf)MW+5o z(d!Ul4W~CmvAB)qV?@adjBe6V^uS_V%W%1Ixp2+Jm5-|wR|c*$g}Tu8;F{x2kP@(4 zJcvGK_KuShxHc@8wJFrS%ser$?*gh4NT}<7m2i034n-l^o1&g9oJfXHY#o5u@X`b( zh1_CvA+H&W{DSuZ%1b(aa0|sb-{Kp;L(GRf&UZ1n$1^5LjclRuAcITnOOOtt`Nay9 z$D~6TBIkyqjv$K8V9eJVAs_?7+z2bxQsLc&_l)#S2DBI3nQo&_PI4s;Q8vEuHZ&(a zK{-1Nt+6UoOO-y##~`9UUNPzf(dV8K_jNMqZ#)x@8QRZ*xzpmjj!|>pH4^uZ2lvMR zf~30AH^$MCMevPygtS)~dBLEnjQ3#H;l?6euherd=&2Eb zJpA%~hUth~#$xQKL5ajVJ0eRFSnna|b!p87P(Aqjff z8KBZ@|Bg9WB&y>bPJ6n?dB}4Y&KN;2$Gi(GNj(ZD(`?;4zJCtZwMk*&w8wb=Tu?gSM`4Ub6d3%IW zE6nIaHDS#@8UBh4JDpO$^(!V*qYc2=?E%jk&+X!1oW}yMLYgU!r zHzNxkGHw_SzV$f9mng%nR+M7uK$-R%E>msWWms@*H_|p3!M-rEBT~S|m^#w=z;veN zTpA^76T}NfJfsB%{lbX6&ECdwGJWGFs(rYU~8g^m0Ied<=5(x&|8ScG00{}1K4AxAcJ+du4L7hSukQG z>)^hMm2lPI2Pkkr6UeE6APojWTzTj%l!T4Zngx_TZ1gwK1|Zj~(TLP$w=fwiS7vHD zwg)dqX;5FGH58+HR7sl7vzCoc-U5ZBqw26Dvn=f-!v>-47!Cr13BWs9NahA_MwxSU z_*7Y~kgww#7eXPyBU-fWYu3_@L$NYy>1at{94AkqG%Ok{EZ8-602X#T!vC4<#cU+Tc-5?a4slEDO84unI%1rfP@mz^CH?o~6zNRxQ3f(ici;>C=}*DpjeE58gXG2Eb2IVhJg}@;JJ2 zwL&#K1_bi{aqImE;hQ8yBUz^NJPCr>X%gk87Su0C`x5Eg*=n3%7Lxu5y~BYL$%7#k zpONT;g8@1={Zw;ZvS}LE(QL(6s%}@m4W)P-)9DdQpL-5yIs{e0|EvUx{= z#d$0UizHBEwMoY@ZLLO~gpBsCQWzGw`Vq_H_q;1BpLU^hJ8T-AFwhY1d2fz^fx$;> z(cdNO1^j_vO5jdtkbIjM49m{wLgY_`uEbn@W!r>WTIsPuE8lf5$#iT%`e9qLo|%|^ z9FE^0x0;Ln35vY8QU_N}Cx1YR3Mm%RIl?gqoHktFfmpurH~6hv2g3&3bj<`Di8u0p zWiy}T;pY#h44)Bx8vIx6KEZ{xHO$JA zvE<;nA0X0N84e*L;q*&rMw(#3ez zM=Si38D9^SlH-+3lSk0<>PpaeCqmY6zkn$<)8>#PuDrVme3W-llIg?@zOJJNLC zo~F~@*s_m+{Lrk^l)b@9{bFM=IucBq0WUK7+bf)MYXKWL>dR7G$K=zyGg;K&CNuL2E zN%W^s`qTb&ti>dE#Q{#8*Yqp8!EraAlH$XZ_*5+WjDgDSav^=2vf=Wj?QE$sk>B~Z z$biGF1_@GJ_{IYJG%N%o>|xwR?jlN01vP9^4m&oUzW=MbdqjT&nC3pgJEa_pGsn6` z{Xj?#PJJd*fPi%!4}@fn+1WXIc60FVNOtJ+grXceP1DS>lk2{DND;8L$NI^^n5#f= zld@@_AUFk^H*JR$U;yHq=3#n>a|oMe;|>o;-?wSHm}3rnNL~b^iW03*c3uz_s;yuo zPdr4WwJRgOUFW?;wlooMMAohdv0bVn!2FwVawcRSzw0WJk$!>dQFoe#))>dX9and3 zovkETt0jo_Z(18}aTvIh!2^!d@D#%O=Pu^44a~`@zreSf>{2g>^C_vmr6U)&ba-*B ztvfn)@U1;fC+f-5!Ymv1;uAu4?h3*0L&XLvfkH%Nm!R8zh81C&G?mQ(RD z0d}M!COnLjTNcpR4c#L`3?wDfEQuVN0fpDBNkY+SyNOB#Ywavszg*mZ?d6Np`kdw6G-Nuu&Kx;%)quS&wU0^ zsjf9BUk^I44^su7!xu)Z`rr=8bDR$mCC}}6lNy<8G?VA#qD=B!V6JHqc`l4up1(jc z7gR*vD0y!E3VA*>`N;A-lgfrT9YvleM$2<+lspG#De_zhy^Y3^Zx(ihl0?^}xphQo z{sSbmMoDvI2TIeJL?GKUVw8vm4(v=k_k#IJpdQ1W#Pb2%QJNy2NA#K*Su{f| zgVp(_YUBrs=)9Bg_hp&<#j(wQPWg+O4#{7rxqk}zi`|YSf6ZS{{$jyemA{s-{KdJ! zB!3|o$aBLcn}}@%L}MdXGL6C1pZS)TmB|o^Q0nC|B9w#z6QL1l8zVUnQQ^Kg-$K3b zFX9wobpr$iIA$OAgFuGiiJhM6I32`c)-XpV^YRlAhxk~-rMeuYe=8MOaGVdyf><+CjLmNrb1Zb!Tkv&yg@<(TC#1*5&ez7aegtUJ-V}9!u89uN z)#gkDKVU&t0qJjiJufytGvzUVQZmh1S;HW!4P>8XIqX2llz69f^ zB|I`QEG!0e#%5h(o3h_a-HpWj>csummOKLjS@isG+QdG{2n)ZH^m)G3M_oE3$aHI7 zYA9ciZ?DkEcN<9VD;1{Enxna&bTR(*#|-6&WKOGyUJT1JqLBk2-M?NRxN0mx(1Vo2 z9xRiPI;Jo!wRDKm!=_BFa8r7ulR7Y%%)z1TRIW>yua%oe`CzI1>8uqldIR`+h z#Jb7&$~;jC0I&~x1}8vZlN$)c61tIZU9ul+U>a)PyN6SI{07e&<=VTs@Bg zv(Yb#i;MezjUbkhZ~ALI@~z*&6!(jU{t&(FIl8xD$BrGB`nlr>y&kxdfFRXpFIi7Y zS#*3ToC^u1Q-R<#?vxr2LZorWDHuMZ)3}2>uyM`}3qMvWutZ>(jBg+axA3ip=mT9<)`N_nt;hE*A1Yg4us)07i>h6-UPrfeil_U! z^`Z6ZqWZpdbT$^E*f$$YQsB}t@eI~C_7hP`a3_I7fLcocK=@xAJ+aa;fd+J?^pn3B zX(A<;Mo!%t>aQ@usHC|h#QJx;zMg-#%iFEkGry#wzmM?{SmOQhs5w-(2VSIu9%6D~ zP4_W`DXgoQ^aJEAj*mkQ)ndT?X!$ z)ZR15;i5C+4dl!{Q9LuPs*R+9*hc$IuEZk|cn=To@kfGq@yvWR!3WdCHhWb!C8m_) zSV|Kf*lqx`7%)qa0r4aVka?*5w7racWUPX$Lk)Jnfktxy=Wp<>#c?=Km~Y*zry~hJ zE$3Um$4Q+-fjbiDj~73fuK*wh?1A4Kxhv8!>0|MC)2c2IR0{O?n$tLrejvbZ7x$Z` z{aDK9=m!B)ajIZcqot!Ug#rbigiC{pjY_V@bG^U=6-i|s4qT4s4x=JOAP{d(I{DsW zNA(yXtyp`#BLul;LtS@52Hu5$X(9aF8{&7pf<%04wQwij`WfGPm2X`x+%8+TDbCX8 zRKbgkcDeL1-LTNR;X)})g_%UQWDbkGM^3F*0zZ~M3!IzAy$xst+4iIo7>pEtA1g*S zlYc-vXHThk}c6(i{vOT>EoL?XmM}on($pKvJbT@b*12(Or(ujM{^d z4=9M|EfIb;qnTEw9th1#$p&d^&e1*GURM4qY9H`m1u<^N4l$zp)4d3jEem8z8O$)| zy?-Sv_#czNxaMW`smrV-npVTbf5mv>+ytO}6~MBP42# zNpz=dSvW$X*y`?*O^X$vp*G;u^9W~63)aY%U3;HcyLK%#=y*tahdA*aG=8dVK!Z1r z70gzI{^R)S0NYIfyxa*+y-UZs)^9Ll$Mq|4-9qEA#8?~4aF>jMayswOk*MQ7t);7b0@eHa1uC^AYRV^e_4I5 znb&In21)EOd}Rp>xmbQ+r=wTX_vmxLwD@LB>(V%Om?>U3oVdyzq%D0D#k13@PB3vg z05L4Kn-%s8d>k*G5r7R(~VQ$6b&?yPuz8=TX4^VoGDy<=lVg)(kZk3MXKxjo$ z2F}Gpw2NowD^-z{{uC-iyPYK20qO_iIQk(rh0ukl>_iL`Z}AWcw;>#?`#F<4-;I?! z=uU|cer7vyIeIy9ED1HJdMHe`EQ?LfgbC8%kbReMt8B@NjYbT}U8ssBr3hQLDxQ?k zuo!cb40Q{)BM*6&qqHb_CgH+Rk3{w0i{&MTHm=f(dTY&cJ6 z%4&k5QJ~$?QjTef^q8?s`V4}?#um8Bq2eccti|hg0Fh9Yi=pO)m3!>$skbOGa78KC z{7Ov?U6k5iZ^4(}^IfhbcF%3tJju51P&KL*R{GszbVQuH)=N4;al;1*5J?S}>DPM< z8>Hz-61%rkYGkL9{LJO~70eK?A@EXw&KU5#O8PmJ!DW7&jx|V!hn}GmDG{s7(D`re z$~D45p`+=Ehi3{0T*lYn)w0b&*r!i<<1%J&rAF_}CwgCnwM5LId;LrAbmMjzafi_s}I;U{DTe3G`XTJ~Bk@$cuDeklu;e1MR*DkTK%~Ok zbC=-r_6ycXnB4$S8jenvZ9k+`>aqlqCBqvQHIN5khIhK$!agv>ltfwi*ibRTev2&H zX}HGz2D~`~YSKDoi-G(s%ZNjzSz?9ONOBBmmC}^w#Yp&{2rCIbG zVg9xX!rZi^VORIlWYqwGw8fy)oPd7;l z@Oywzt_w!A4Em5Goc3tkhO5CXC=*A_V2p&%vsSkW-OoyAIb!u9t@aHdF-0+rxlm&Y z-?ANK1WhbD&jyXLlG%8QrN(6m#AaJd-yq?y=nuEj9^|7v=b$xQ(bvT@Js3o(i)Wdo zLNmXo9m{s`Qs6OV49}ghm0X`|0TgoHb(rPW)U*N+wxt9N2|%!h@*&yh;KoGC11h0b zlIw~c-yVZkW*H9ZhBt=y?q3ir&Xe_41`n1T`5kl9Ls-cU;Jb^?L;t(GbB~Xzy88Z^ zOh}?qChBNWQAdapCD6$Yf}oislN;nRkZ_aBkjsQba%(c-R-nNF1w#~l)T;G@^-|kv zq194rwM_sK1Qf;AM1=>uRf`vV+E-DlyuY>9*?Z0jSou8f`@Da=2Qu?LYp=cb+Sjws zIs436{!v$HV)raLQNIw43rk2>AErhYM^9JFNg;kgAI0Rw)dxHVeEPR_<|O=PbONOo z##_s{|4F=LYVYVP-1gD#U7O}5n2WJ+f70IOS9Wx*L{_eLZK5})&^yf%@yc}hu>~ph zyg$P^12;x$7iHo28b`k%|I+^VF-GcAjg~a8@t=;jEO2v_O08|9+qc%TT;4@xi1S@6 zDg7;~_eT6+Vr4wujF`2yBtFJjkbs}YKk~ty2*F*pHQSLqO4hZ8f0qm|4;@SQUbo@d z8+{i>79yo|4Ap1TmPdW?>&nZ}`08<1)a_n`o}1J?_;;{LzipI(U4DqW>os&+5Auh5 zsd#?`U1#6Ad^o*ta_Cwd_GUWP&cYFVX3W}IF<9e6hlgJ0n$K1oLe4U9qh})h&=_BI z=y+DWbqe>QQQR<<{5;)GpxsMZed9R#uZ$gPzr81 zoxH6=Jx-0Q4d3xNJYJP@1&sM&j4lLDoHCViMrJE&c<)XI=6W>n)WdCyU@i z_n@DSq!cF7C0qZDifPdj!cQ5*bWOlp6v@<#DS@sSv&09_HB-kpO~0;Vth~4@_E`eF zK56>#m$~>mCQ`TL;N^#v7gQYONUexUf<5HSS*pdftaaRCcj{m&X+M`BUN(39m1q$J zXIpPkaOuH)WlY3XlNbf;V`je?HlsH~KAjn-f3 z2w#Rw(61qukVW#W2o)5ygvE+%3w2FDcIu(#0t-^*aO5&XrA(D@Ozae)x=xI)CFJ~N z&<{Yrgw;7+{DPgz-cXgKmPnjaa?=*45RD;#mci*D8UM5jYdZL`rP!_mc;xZ|^1bU! z1hQi?X}}#-<;eI8xp{atbPc|j+sB#caHu=@)sc-;p9vhk{ID(Y3K%_wa@AV0VzkQ_ zOLb7f{fi3n_`b+?T_SMkB&{SmCi3+&YAmO=o^8!%=+)>nNH97u@xxgDbvQ{;{RAU$ z1Q!D^Fik{Z((Pt1b+fGL=w|9S^4zG_;q+p~u5{^Y__YvQR}&j}O5U0Qwi|Vy*W)3H zWUPlqCcND#7t^`~jFcWKcKBp%dhj|cOpDX~JgE9HsPa9a66mLx`d&2EjA%Y&l{7Nq zhyOhOO`jH+QlT<2l-edT;q2<5(PCm3JqMU&%ZOa-9(Ka3+o*u#{u~{PaMYy3(Es@Q zLuCG2@7LLmXXc$czLHKonMUnXIG&xdeJ?aq_;~4+b@lX%*V2G22Tb?C1Lpq=`zO7b zIXK!1|9fu&l}1bc|4-XTpFZ(63f=t(r(x}?oSacF`Icp?dXDF&w|NGsoze{TBK*Y} zXKES_8o{zW{-n^knnECYEnJ+j1fSnyT8qyiO!TA+eySg#kKmI|4&w~^u|GN|j5E$h za%oIgf<(3gM0Zu=j61dLQk+fVg`bAoNYPXTk{Hi{vN&{)rjJ1r*vi+Si5xl~bH^zx zTLh9ET?dl(`%p-rfcy_h9j6dL6ezQgC;Sp1<{ixamIR35z_`xA=7Q3 z0;W4bex`dsc}yEY`AiRia+w|lZ0tj8Py7y-~|DP@p1P4HCVdXju>F zEVf5)s*u#^4H}Z#vU8O8h36VZ3+s)+!runYM?GjE(~Tgpe9lnAXl2}Tai6Hu2=QzU$YG?9;!c0Y=4yF>&GNu5ijp^qg zvG+Jg(intnOU_Tjm*o6Ckc37qR-re5ByAc=dHN5wrCbOU=Z93*km zbm&;nY7WiSq1S-K%IlggxkSlUX*vQD?>_;pVk^hB%sE{7OkGFDgB%e4qx{jQ2NK*5IYB{wk&{_^{ z0ZF=DpcO2;1JulPFG$jOMC%`{>dKM)49dsrsS(E+IfMpM+8^)t-We4bN zmhA`8HS##)Es&&wWFpv~-k6*9YtX)(x51N0k~tp`bdZv{!|KBDy=)3T>PzvdX*K#w!+ z1z{qDx;*bH!+4Tq<3Q35t_4lu(Ca`_gHM3OtH9ODt2&T))eI7^mV?Br>p zTJ|fDc=Z%WyxIy9uf76}U=Pm9Rvu)6wy>v#Ao27kAo0rUQ(hH-#H%upcr^zkUR8s{ ztHmJETcKrLAo1!>ka+boka+bfNJ`@qP4PL(mvoSnT0Kb0bOT6Y{0t;HdP>V)14%wc zVp1$I@<9?~uBJsGbUF056`Iy*+MwwPkQaJ!#y>%rM1fp+sz;p-`ZLQ`fh0%21c}ej zYQ0`ifc5rhy)Sj>Hz4Vk6@J4wkM-7r{>t<;s0ZXWF3dNKmsxgqkzwp&3X~YeD@>J| zW`h30vN@nvndXD`Gu3LndQFX>eH_{fdWk6vdXZ@fXfM-p&>p5v&~B#Hpck0df_5^k z2R+ZU0knhZHqdiScY?Mv-2>Xjv=OwG=}k~C$ZdQCk}~~=ri4;ey52IScRvW74>4W^ zjbJP1l&iR-K_dGzNNVOK&_%4bA0#ysz?bMP2DNbLFF?<*p+srTR@V=9h!cn>9?A8 zY1*ghQ;?S}r&K7KTdC|-Yx;$zUu$|Bgu@v;J)&htH67O!J5AY}0g}}2)v}*y+OO#y zO&@3)IbFp)1d{x|tLdB>hVdGFaT{YneN45Wex{`$Ddz`4Ql>u#p_<_RZ?$X-=xvtu zYT0w3LoC~;Wv_x(vFsht`Aq-R^rfcbng-2O>7E8Uz%c@#*FkP$5$I~BUx38ZeIW7l zRnTo5BX*Wyyu*6uf$m|M2Xq%xxelEPx|3y(XxU!S{VY2Kl5{@=WwPwDYm{s}NG$t6 zcX8-7I`meMX<5@Ykko3%Y;_G~yr!!)ZI)r#ODXJYzs(I zYra;M#$ruRX?j-ER!zG#eZ5e%jS-D1jU15FQ61>~AUT3HYPt_}Kl}2ymOZKIC6JVJ>a#9!S#tJ1B`Qf1yL;+f?Wo zpi4OPJkU6<%i$oY-^;ZuP0Pk>S+159f}|v8fF#}7L~MC6XbP8Umkzxd6kyq7AW7}F zATP^G!-_V6u4b?P0TRofgDzmp86BAYgK+HD6ak5qbwsS^Tx1xdS?@xS)NhKGWq~p| z-5QX@y&IIqvX?Y{szWC)#`{^=ax;itXB}s31&wEV2Sl$ik2Br}jb-`}G>+*gD2pk6 zi8@|R1kGew4k#VuHfDg#k_1iT&}JRF3N)2v_iEV_Ac^sNP&tS0)S)keN?7(6&}62M zKt)U=mf{Wv(^`p|63^{ZR{pSE|xI6C|ZO5+rGi z0!is!twX1Pq;#9KECRZS?cD&9(!EoM-UpJ>eHbLA`z%OG_fwFR?o~flWz_+a9R0FW z(QZxWuTrwZASt1LfF!^F0$s$u7}u#1S_P6acpH@CpmH7(F^pMEmxJ!%7+%m_OxYl@ zk_QSxFV3h1NsK1Yovimekk~t_L*1(lqlROQ(=-FLkY)2g*D?)VgS#0_!$1v89#B0~ z5@-QaGAP6}8&nH&8*$gGG=_n~9Qr5F51F0=HL~6ZT6R>+hTNdyj@L9F)Xs5hHPwTf zS=I<@V`>8}VOk23vbqH%UOfw<-|}}G+d)!7=dHz^8jg_(>fq4DpiY+EtYr^^q|Q6n zsblgDnjQzq*z^o&6 zvS&b&Ztm?Wm#=`X=F~m~NxL6)hw^16NPM{ql)-w&PgLkxpb?P885e-0WnT;muym(x&@(mxVGX8!<5Xb}kiVfl6~`z7c;_Fy*%&Z7L@1W65k0(zZgUx6|? z?r@lWhh=G?51D3xK4oeEoy)%52pYw7H|RR1KZ3fLc7xKGJ_23C6n{5fRK!-!2b~Uz zGe&^on8s^a4k(smRD;fD`jOVVA0(yrAm|o^#u+`JjcoZX(7jBj|5W8I1@t$Tm4M{T za3Ls$Ew2F4FQdDS`#~v8zX3&<_Jg{a-UX#H#iI)5GbMv0N8>?~qdbu0XqJ{$g9dSo z)gW3)>Nf7vde4C*N4r3hqmMvRNB;uJtRMjylREkVNXEKK&`oTw4K$T=c|Az%-3StU z&x6Fu=OBrD9va529Crdp;+BIXZUsoS60iC}a2B~g1VXigTu_&m zGZchI2HAL!==ngR*9wxE?^3OIm)6^;_4a{=vd{fm?=!9UwbmQFQRO2MBu9lY7a8PfD@fvYgZ_ily#pk1{{WJ>Js^quDhN&>?%Nxgn-xBP*IvmOJmTi8k{qKFp{uu+p2kyt3;p!_c`!X3uh^#PaJE~`%=DC7PP7FV%f#MgX8~f z!2V-;pO@+I8X*!X{bOKCNtY)DVsjXS*j_0DFUNkYF@*Q)z`sG&4l>4&8n05K??L!S z+Y0E?Gj4_J$3-~koF~vlxQ`*i&;arMur`aCPVQKVZv_^?> zncf%pz}#2)nLi->QYmIgr9OtBn8Q>d#)X{UcR^xV^0$D3c$4;bo!T|O^G(N<|HDmr zj9ES(A>dy~GuB99`>MSuH=aiLR~#-SvkmcS-^ryQBaMV#$(B=1`>I7O)cex@sqNB+ z^f|qZ)1>9c8JF<>&B!a&uhZ;5^GO+-@_(o7BEGcWC*tM$M~rbE$N#k%uHt*KPshwb z(%kq+D*NJ3t{IM1dmMA3x$odu2Dd8GkAX+D(Rf4qv4+Ht_HUBPOcpM|U)iU;(7uXa z2)1s1>kgROmUVj;W@yZD8kceYsFjkvL8d=fnfr0(ewivLGyNqU)687VGxybaHgmxK*XF*o%I|J}UQ^#`+OIM9 zr8W(t6aGm3jpp(yHp64gnL+}>Y2=A9+oMD8%kgMndD6^P%JbyqHw5virwlS;IlUxv zKh7+V-|6^LztrEzUYsHA?Yr8?!1Ss7to{t#rx_}3s=Np8Pe&NVcbM(-Lf$9WFJbcF zb2t-~bP|&fpVY78xwl-wG#{T*R;?h(MJI@kAMw0`i;idU#zuVpfN3*6X>^S@dhnUf zv=5&&Ly9*J;d3n0QGAYLqAHg5Nmr7`v&;jckvg8Q2TE)9K_>k?0HPen^SOtVT`Oc& zEb9c-F>L@XVA=?(XW9&EVCn%~%d`))km(Spk?AO?iHX{NGgBhyhfE&O3MMaTC6f=d zmMH*Q$21>wBU3A=i>VW|o@oQ9n`tBHCZ^3GTn3=>18rd12fBsn5a@QMqoAKK(U5vC zQzGa-CJ$&MlNa;=lMnPWrU2+crum?Um|8&(Gj)O;r9LIs~E?5N{j>{e}sHDz6}kHxfb8Q#_z897?|t_j@KE=qaWE=nqWuK~FQag8s%opii0hfgEUW=pP_D7f1Pl=w4Ag z4I+FE0ObdwbLV)&1EO<8^bZhS7l=1}AUdB${{@}HG#^CQDB_J)5S`n{8=W9JR-^xd z=(+{^FNn_fMrdCijQzwY7+`&H(T``1zpeClxAi7=$|3FKb_JQch1^5SA#dH)z zS7Pv$AXhNpA80kpJfJm9w3?o-k)ixRbY%?X2coNB7+*ki?F;1xqU$**KhS!n4WMqO zjUYOoM)`s0N&@@?(RniZ2k17YL!jH4j)LxBGEPHJW=aIz$>agu#pDIu&Ey09lqmqZ zhsiKHv&%ceo|ZaKQ>dw>ZK<)UvvUF(6>T_4{&8MjOIuqkY8xfho`Qkt*I*P zX>JL7+B;fXTiU{*T2FFoTg!sBP z__KR_rKh8LVROskW=~B$$P-@L8akPlC9Ub9wxwo<8aRW=HBva)mm9gI0X8u(k*Ov5 z+9T+Et6nN)$*8WX_53?6(`92?bF}1}JDRFPZB&Cb^;ONyp~iMkL$fDP;rFnU22p)g zyQiu-n&XzHR<5g-X0tX~tD&8}N9?JExt^Mq#+Ei~FqL_2s5M;gF%`2sm%pTgGPa}HW^sCo{8NolGd;%WSst5t$dy9{ zb3gkRF|h$RBZxF{Zk`orpFZSYfAxl00EM7ZSRI#X82A+NyAssYCXhjss%c_~hl$ zG`TUi5#~4RFnjT-JRn=Rdx}2{Su7Pv5%vaaNwB)9svVQ4L@farl<|6-WG?pTC?8FW z=3rUyIVxE~IyOm!bl`hbhvrC?_=`&ZOtEY_Z$Uz{sHo0AA=#-VW5S^&VMu7h;TGi+ z_W;IBWbf)>+h{^#ZuI*Wv<)&mT#IrvBng#-6XndcTtE^W7GY;TM(8_eS8qXXCsICS zN6Ii4mOapkTCRXZZEzGDU3I1Ui0aVsuT@LNv_-2KM?0iW`K4{q@7~4qQmn`^i=?C@ zGCGE+O(c&%(g{&Ct!E+GV3WKG$wr&x2qc?LiR9~ZNP4s+xF8hH!rneD0T?mLF=8WF z6%K}4>UcFtw0vB49kSDb(tvf*3AQh6ppt0S60&^339(Xf(y>A7kU!~ZD0%3ab|6U| z+ZgiMBNua+d0lx5PH zk`IlC+F_hQ5;Ag*RWhC=bfrM+q*AQgZIW@2OtnhVQXxsONyzkmG!ktmjZEKXm86s9 z#Wo39o^F+7kY)N+d~GL#EFb55nYqXy%WqgEnr zw#VQ7uWwY_#WfwX0dZhe$)&$bA$D;8! zn%3DJZH3WTd(Bv+BS@qFW@PF_pTEa;=##dToB#NI6$fWErX32E7Tz9Gqo&8Sd?so* z5$=iQpgCFGrzK>St{HEJGonM1Oi1VvRWnviV^tG%=0qhSojmAxY?5+F=AWZcD6b`H z7+Q>t9LsF;X{57KORTj_E!pWv#wTrqo_qN((Qi7`F+PFijV$q)$DLU8+Km@eERt9~bdenglHl!uGyYN%_3(VeqK$Oy z?GP1&SXWRWwu(nnF=sNHjS(Lg%Q~p|IVi z9b&Q5ZA+yc+piBjXlc)z%~+%(Ieit9PMhTqAlZz=S~M-1 zcJ<(37?qq4$>uAqlF^WOaP}V6nFt9QF!x$1u`)<#{GdIv49Sj;6|8LuE^BP4rU`r0 z&b83-niBE38xl{p=!oPINPITQpCK`FtU8Aw*=LhDarkY`wWf6rB%8Iw+UhVwqg3hG zM_cbT^ut1uHrCQ27Hy=1Hs4wm3fIHKJgenm=(K7H#zUHt7!OS*9dqnW%>ZRvB|QHb zJ;|cO7D+m)%J5kw8K_ROA&l@)XUgGnS4Hj}}_& zjH8*=FA6M@EHq`~LYss#_DsG-XFTPr+A2w<)_sXpl9mBO^bDHzC)JDO`}`I=sa_nM z9<@v0^iOS)RM^>Im87LZhn|rW%W%aAqAoVG#ACL@A41|QCmkiZ0g{b2$xk3@4JaLJ z+rYsZZR0XBjqS7%Z&yd##?KLpHqx>8Q%qA3>mmxoHss8ke;tiQ*VykT@Oc z9+>B^uY4GdHH;>G*hmNM5WT6jd4b`bseGoeInX&|N~HaEK$191bVRZml2)7Ken@(3 zk|!WBuCd121&P-t>7!VtMEd(%kaW(r#`=tOY?8s~WJgVj#5xxe-yCZ$JdkX#Nk&7` zqb1hbIS-CTOYHqO8WW=>HV(09BOQA=pASiN6z#}ggrbqsLD`tGNXH)Q0*mCJ=QReWmdWI>nY_hpwilB#v&biEKG{vp$DI|9o;e$*bdLkrh zISrC$v;+~1`>1?a;xSA0_mFs6DVCDF0?B++B4zj{BpYlxM8$*qudni6}-C&5m11lU{qi!YU3 z+`%x@A{|L<2PB7VmfwUVagjCkqmTqliL{MxAn`6%^^REqbpqo}mZ&o_lDuY>&_USP zZI#dg*4SZ{a37>+L!>=h$HPmZ8$It{<{JEl$^+JM3?WN$FJ1C=fhi%Wy)Ni@=X9u1 zt8>rmKa1K)He->F*zu8MiOQ+fpOI|Gta9U>krx)JIQW$;(+=s_Q%~ktvG}Cz_V%Hj z(OAu9EYgwG*P9a3wcEKIl4xnHEcnesDh}>lnXyPm>}>f~J6Eus@8grUo$Ky;RK>wF z?`AC0v8O%?5~oAOI&c2fL!+@iGh>mCJyr_GQoUeS;XBBv_=lBUE(BsD9eb?NkT@L} zdSokHk6D|FHO-7gIwD&E$-Wh;z9`CiNP4aliRe5G$x)l+Pmp*bO2=BuV_?DQpz{ve z;$Hmg?^Q}z!Gu_}k&alVm5rU+4uuVaq(@7Fi`yE)A&laytsahpj@mH)VV$}~9<8IU zLY%#ZVwwGm4j0BCs|4dd)&y`YQ-^z8r&Yo|uG%W$>n-#I3R&jkVA?oPik6uE7y*`e z%$a9Cd~Veec*y>|biMM>T82L$%lZoW%ipj0l`1b>w=nZgI(!9&5;sz`9ayG=p5d`d z(kU@|Qbl|YwseH)&QvQ)$U|%DUg$>8yN@pJh>ND)WTs9!QiE$CIb_+4mEx&T&X+>3MX%F$BZFe4FHQNH%JTwZy0yN3Y<`^&I|@DjnQ4LM+-y zM@sBRkZiu&n%1q59Kwt?n);)Z*1c9q4YRgJjMQME+fw={zFX^p`JRZUG* z!3NoBuc^WvUFYIb zXPYsU314<b$i1C(W?*DEaZIDhv=58 zs08a8+K^OR%VJO?mLnM14b6+H8XIbH;SG1}ec8DMzU*vdy*9RSw7a+xSEG06 zR-MX6dnmL}@4!R2qiSR+VKbH$z$`C2F|xCRdA^{x+*g)UQdsDpRN%woeCrWM|UK8Pl@`)KaR^)KFg?&FxinC@nP3P;)Ijs|jHN z4YhD;gTZPzkD_U)twB>3Mk%86v@Jw4quzuj6>1K*wX`nfR$Ck7d%3}2usu}Mf#WlY zTNXBi44+lR?N|bQ8L-pVQiG*C%C1?&dBwg`e`#J$QGSV!-OrRN$j-$2hwMzf0wp^$ zI|+BVX#Ee$UD-mDXbws@i3;o5s+!Qvxbvve%AM@XEiEm~pIlh#t0tH3?-nn#&j)g@&m0n(4BpH{kOZ<>wao%L6{OSSmY{S4)}gkvlWzj4jl) zwKVBIjA2`cp!LhRQ`6W&!>zeTYiU$kX_NecLSI|;zp-pCGm}FC+YW~?ddi?-nhb{; zafpce#TqIiDx@t$3yng!DIet3KeB5Cm)W}`8Eqtub_D6JwM>oj=1oR3AJoxls4&}C zsjsM{cv9IUe|fYIV-1;^G3j{9kl8cUn5D#g6j7bDqnUzf(N(Bcb!D+a7u$84YG}r4 zrrJSMfxvB3mIEau&Fha4H~ofP^j}+GvG+7ihX<_KhIxUmS60{(!K1=s_e{Yq1T{_ zaFC`0vK$QCs;CbPkVcOkm<2Sqql`n%H8_mO4IB)ajiGQDB_V}R#<=OJVWrSlP+pK< zlwaVZga?jv7);D1c-fh9Y*&uwmir2Fi}K5I^7FqfrVJ)HRAJqsZ7j+3_O&MOzg=N|JO?-^DldK(#@^I3gs{+hQRJ)ispogpO#I;93mTqX5ouJv! zT-So0hdBtvF|Dgz>(HTP%0xX@c2bArep}Ph(M+-H8|uQCVKvhvYWAfUmT) ztURxzJWpaaARvOZmTGLSx?SqGwN>im>4EW)eg_sxcv(1@^KG7DlRaz8DMc;%i*n10^0CO4*QRG@V!5xaw$cmACu7hk zDx?gR%%maIa#GM9ZVR_Gs@$g+P0pEISU3rpA3y6v&E^`cDN+MQkuR^Hw6Gwr$ZxMp zO8=y-29wi*!rYP)3*%pnW%0h0jZ&GPqZdt+P64=Pj%*f76OT!nw=}(x}fm?GTRxmPZD>=U0 z;z^V919=7P3F5&Ptr*YFRE`B}Yul}3rrNcZvX5CU-d1)8JYh!7^jmMB2`>+nfs>rq;^j@a;X62 zq#5lbGm&T;u}#a0eT8L#yz)G>^kO=>F$Zos>&Ghm>`Y#UZ_W<97*a8aw(1N%y!j6k+;|H0U9_yBxHqM)o zHO@OO)hhLPQoY`>W5;?tY2z}y5;Fhv5-gUvc<9rU&%$M5+@Ijh`q%*pw&L$02M0wz z@RYsv(E|#=HCdxhUE4J^eMVxg_2MRp>FVew1N9QUKI_8-q!&vcxW*bQ*I5m6!Do1T ztc&VNr49i@pcCc@vcSh<1m+J+_j}MSplj%s&By6R7uQoz0Dl$Gd(hOSuao72mLvS- zWcDnJZlS`DFnoLpdUUb<%aiD#u6}@vjtzA0UK*aYJ)@+DK0` zuA5vnvb3S5t);!CE<9#>UY2)E-qgyG9&;LT)yS+d-Z7cpacSemj2nv>=5?5sww$(_ zdfca}3F8vuRU?;VjYU{Tbz?)#j(!#z~l#l~q=7)GxD$~m>6MRVHgni}U+;|vUE zdhNWIHm5Sw)H-KTO`6x6IR_`bbEbxH{h~eO!KK1*L(QCu^5T*)E!Ed%8D}Tb!^QFZ z9-5Im=oZ|_9hd0Ldy=PK?kR5#H#9XYYiM5J$-{IHN1HZOD=gsQrv|#jjMLp(_J}?b z@E1q#uXW=MUWs`3*Wl^&Mz}WgYxO=Ubsfb^`|y&mA-wk>i+0T0_PnmMdD|>+ zGy}o{y&l#Ldx>n%P4@UTYi_(NPa7S2ibna}Xzs{yhig4-SiGS>ucraZCmq3$Ka^S zkvAe=#n=Qd%nqjaSo3R-jzC)x9KV#xC|V{D(C#)`gn(=Q_*tgQ@rip1AiAlDJ42|0 zEKL(ZG*;lJf$&Moc-;ITw8V&DUt-{njY(7})GP5bi}*~!pPPS%RrJ2X{s<1GA42eO z=r9m1rEnX`Akm}8R7H<|s8M8Bf@lFp9RCR5WlU8%l#e(bIy9I~Di;d04Wh;8*b4cR zqRalndY`%m$z_8@-qgOi%k3Obmtyx^{Nd?Wd{Qyu=~sMGDdXuK2!IB!HB3 zaCpofjdKw8-lV&lNKdwW^ZUeGnN%rGhg2Yb zWFYqPQBe=4o3Thos`N*ugj$+NHrOQAN4nw>;&cS?IY{d$_$fd_$d0wd5)k5aPtZwUEY*G^zipaNKVWtjnvUaHLE9FR<5j|rez zo@|p?eLfwE(c8-Z_5P=8loff1o9vK|Sf&S_WmA^#gCu~z=*`V1wT_C_1Ic`?^9o3v zo#A?Zd0ugOxxds$M*^IeM-K(&3?3I?ab*?rt2XqGU~5YQJw9v%NnOsM8?2Yk%Y0=x zb1Nys4G`{IxG=|qfc13Xq&MqG?F6f~*{*_wB!EcY*^=&R@kD%Xwi11wCo&TPMHzMGYrl@*=u zx_G|Zif)r_wyl%RcNeHim{I%f|CW%Sb~(XX9Y^4D?>2u^Zc^_~ZGh z<)KcJZ^T~?CV_`(B8ZLp!O7;GG@j+FZcmEXcpf`o-bs4Jr>IwYih5H{QE%EQ>diVu zy}75TS9OYdp;OdrI0Zdw0!=5;`~PF!US`hQ3;+A`b{+?UxZ?1CHhHJ_qYuW*>FKA~ zjQwxX%$%O#HufLtdU0OleTQok-pT6R*R^&3F(>}EVfGu_wX^r|piw)430?bo--;Wx zkLJYFyN<5f+KH&W?+qGtv}|MVRXa%1_1E4n6P)-MbZPwYsa^T7kZC5R~e$%znwP`0_ zS?qZOf9r7K;My|jc-N-~pL1>cltc%&l8^(#6qwfa@xkq`O&@dE4!rBv4up|}j# z-ll2y!QQ?d{fYhCkUDbKxBKAM{#||BkwQ}cR+h!~@!ZgqS0YP$5TAS|AA9?EAWko8 zBMIqk?L(IPw+C5-776Ej;X>aF{jo_18iu{?2U(T?3!Z*oY`>3cb6DTr{_U*%B0hJp z@4e6%hBT-IhzIw*$j1729oz$R@Qu>lWtzh&tl5krA5QH5m^xJn8OEQdyWs1{F$cSd zGgf?44GneO@M{cl71OAx&FO}7Q}Dj+l&RBa&`Fko1T*@3Tw4lb`gXatlsmBR?e8J} zKAMg{sUCuq?#8Pf{XN}te(&hp71>U&^`@uQjf30zU+Cka?tlLvwYHgPYcsnCZ|U}r zkLlaPf=UP~7d!q;J)KI6h0u)bJU(hi-yV9|_NZ@=zaG?_+qES&5t5c6+|<^MeN+4e!pVh{8marM1IJ2@S(2VSQZhpyp}*ty45T-TPEz8BRF z6*BR68}grf-1I3;MTUPDTYQ2qYzn^pd!O=5pYkj|IsaQeU8H--rRD^7nNpVY#RxUQn{ab*Gti25nU3j<^LIED}5wirGhh6Kzd9mxiAd0+qtlRz9Rd3N@r}qnI@QfEG^y2DI$=um1zqc+1xhh(h zFfX!w;8dMn$N)(WTuyM7c3$xy@n4O`}5J+i0B9l)K)K zeC=Er|16c|k+?Mks%& zBCqkCOy>ajPBAOfYgR7zE94*%NB=GEizd9hGPdi5BXJY|Uc{@Oyvj=~tD?<&|eb`(1ChdM4q9T%dG3*(JvsaTPskF!jN(?s|@5f$n~ zO6QH*r^>Hy7uS5`P<&VA>Y-hG(X6|k!(MmB_#0pE+WE@c2^U3<4O%()4+$_hYUlnh z6Q(<0%@^s3jXdX!93yvp%kK{!=$kipc4T|VY17j` z!-35#B)Yz5tV?yRKN~)FJ;tpl@-;4_I zOo@n;(-tWwEmBqxDJz`R0vSmp%dEm_v57zAnG?Bvq7f6vgQrfP4vSu z>u{pcb^Ix6PSBxQBb|M@G1R2*Lh+Jo=vc@Qhup&%>CTOvunqfu4jD%ABFoW_T{m5f zYhGO#~%%^NEhqZ=i4 zJ;~9#CoXXwbw0xkm8=`*B>9fSb<;&*wD-8R{=qY0ItlYh;#saO@sVDKPz)&6@!1i4 zrI2VQ!1=$NUpxOo?a$HCgKjnvNflADFp?7aDt3jB2b@v+r9aI{nz?q)V9W~VB+Vkb zCSPOW*(T#F@^?qaZWt?}@xr;yxgY6d(1evU=vs3j^dULlHIe znbg55lV)*etxURxx*YYz%B0y*oEgPgQT)HIOQzWyw#>v%aCiRz-F>ojcb?45k-LPP z2kN-jP&b}s_UqZIJI_@;evazb^SD2o-9AVi8)L^zI?1Z#E`Mz-Iy(16GFVHdLzGAz z%GVpaHWuTCKWPDs@Q_yz0~j|dlNyi^#tnbcwFttHQj)X~L4!~^GZ7L8VLT5Y?g{(R zUnjcO|Lb3Q-UxX1_OvuIyN7Tmpbt&gGo)jV!=7afm$ zfuZ6Pm@o$+9PL&g!tV4LC_3DB45J838oXzujcZg+jr*lU^FyvH+lNC4tVNiccvcy%k+wC9W(GHN;BjOlX?u% zJo?REwVeuV+uZaXg+UYEN1eC_K1!gY?xsCa7j%KHBBdqBLki@unh>GzbGB%p^z5z+xdvW(r z;{IOK1l%o7WxZTbCeuvN)l5r4G?k4ro&#OUv>P;@>F=N{rcXiis3uLXB}eq_G*JB5 zYWb7)>7Fd!GG^{m1EB3nls-+!V-5N3_QNQ7mu3H1m_f!6U*4@k2N1al=BDa1=0Kk; z58~%*v4jGKNAUio9G(aLOL#w#_fh<~A52I$ujOtr)tlTcMqz?{_@r8m=bMXEe)uh7 zd{UX>w}|mcrH0=k#wV4U{1*FIrpjZZeQ&smeTLDQgFikOKtMJ)`?2RnqM&@fF~^T% zaozvm-DJA^V&ANHcu``w&q#M(E(HZ{Z{;CO^i{Pu4Z5pny$?$vPRB-kQt{ij?_<}C zKZ!+QR0SLH7nM*!C89D+%a;2wRQ=J1g5P?e>=){8C0-neFxp7ReutNuTQt_vJDXgYqlu<<&8tUhqOpE##v&bitkZ0-M>4;@| z87$pyInfRe4-VCGV*=e64zbmjR%Dzb|`G2nHI6=&<~rdO(gV_O?ejL=Y9+sBE;^9tS1bgDLSoK(zEL?4DXbuG{D*gG>)r#{BZ(40#Rwf>U#2sin z9h>3J81JpCrRC|epQ@jh<^A+p`@UML4t@PJZAnEw9*^QDayeOgv~o$XsR0Y(#b~;@ z%00SoH=2%hd^MR>^t@~x)~crk@!Xg^*+h?!(d~NsLR{@Sdow`Ow%k`~)?rIyoAP+A z+{HsN(nJW!@-2Gxh?n)*(eHkoR4rMynxyr~C$2a!7kOJBYPLUI$V&;7H+8m04F|6A F{@*~-B6|P; literal 0 HcmV?d00001 diff --git a/src/SFML/Graphics/GLCheck.hpp b/src/SFML/Graphics/GLCheck.hpp index 312ac52c..b8c0af93 100644 --- a/src/SFML/Graphics/GLCheck.hpp +++ b/src/SFML/Graphics/GLCheck.hpp @@ -29,7 +29,7 @@ // Headers //////////////////////////////////////////////////////////// #include -#include +#include #include diff --git a/src/SFML/Graphics/GLEW/glew.c b/src/SFML/Graphics/GLEW/glew.c deleted file mode 100644 index f356799b..00000000 --- a/src/SFML/Graphics/GLEW/glew.c +++ /dev/null @@ -1,9752 +0,0 @@ -/* -** The OpenGL Extension Wrangler Library -** Copyright (C) 2002-2006, Milan Ikits -** Copyright (C) 2002-2006, Marcelo E. Magallon -** Copyright (C) 2002, Lev Povalahev -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are met: -** -** * Redistributions of source code must retain the above copyright notice, -** this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright notice, -** this list of conditions and the following disclaimer in the documentation -** and/or other materials provided with the distribution. -** * The name of the author may be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -** THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "glew.h" -#if defined(_WIN32) -# include "wglew.h" -#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) -# include "glxew.h" -#endif - -/* - * Define glewGetContext and related helper macros. - */ -#ifdef GLEW_MX -# define glewGetContext() ctx -# ifdef _WIN32 -# define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx -# define GLEW_CONTEXT_ARG_VAR_INIT ctx -# define wglewGetContext() ctx -# define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx -# define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx -# else /* _WIN32 */ -# define GLEW_CONTEXT_ARG_DEF_INIT void -# define GLEW_CONTEXT_ARG_VAR_INIT -# define glxewGetContext() ctx -# define GLXEW_CONTEXT_ARG_DEF_INIT void -# define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx -# endif /* _WIN32 */ -# define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx -#else /* GLEW_MX */ -# define GLEW_CONTEXT_ARG_DEF_INIT void -# define GLEW_CONTEXT_ARG_VAR_INIT -# define GLEW_CONTEXT_ARG_DEF_LIST void -# define WGLEW_CONTEXT_ARG_DEF_INIT void -# define WGLEW_CONTEXT_ARG_DEF_LIST void -# define GLXEW_CONTEXT_ARG_DEF_INIT void -# define GLXEW_CONTEXT_ARG_DEF_LIST void -#endif /* GLEW_MX */ - -#if defined(__APPLE__) -#include -#include -#include - -void* NSGLGetProcAddress (const GLubyte *name) -{ - NSSymbol symbol; - char* symbolName; - /* prepend a '_' for the Unix C symbol mangling convention */ - symbolName = malloc(strlen((const char*)name) + 2); - strcpy(symbolName+1, (const char*)name); - symbolName[0] = '_'; - symbol = NULL; - if (NSIsSymbolNameDefined(symbolName)) - symbol = NSLookupAndBindSymbol(symbolName); - free(symbolName); - return symbol ? NSAddressOfSymbol(symbol) : NULL; -} -#endif /* __APPLE__ */ - -#if defined(__sgi) || defined (__sun) -#include -#include -#include - -void* dlGetProcAddress (const GLubyte* name) -{ - static void* h = NULL; - static void* gpa; - - if (h == NULL) - { - if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; - gpa = dlsym(h, "glXGetProcAddress"); - } - - if (gpa != NULL) - return ((void*(*)(const GLubyte*))gpa)(name); - else - return dlsym(h, (const char*)name); -} -#endif /* __sgi || __sun */ - -/* - * Define glewGetProcAddress. - */ -#if defined(_WIN32) -# define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) -#else -# if defined(__APPLE__) -# define glewGetProcAddress(name) NSGLGetProcAddress(name) -# else -# if defined(__sgi) || defined(__sun) -# define glewGetProcAddress(name) dlGetProcAddress(name) -# else /* __linux */ -# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) -# endif -# endif -#endif - -/* - * GLEW, just like OpenGL or GLU, does not rely on the standard C library. - * These functions implement the functionality required in this file. - */ - -static GLuint _glewStrLen (const GLubyte* s) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0') i++; - return i; -} - -static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) -{ - GLuint i=0; - if (s == NULL) return 0; - while (s[i] != '\0' && s[i] != c) i++; - return s[i] == c ? i : 0; -} - -static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) -{ - GLuint i=0; - if(a == NULL || b == NULL) - return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; - while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; - return i == n ? GL_TRUE : GL_FALSE; -} - -static GLboolean _glewStrSame1 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) - { - (*a)++; - (*na)--; - } - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if(i == nb) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -static GLboolean _glewStrSame2 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if(i == nb) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -static GLboolean _glewStrSame3 (GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) -{ - if(*na >= nb) - { - GLuint i=0; - while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; - if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) - { - *a = *a + nb; - *na = *na - nb; - return GL_TRUE; - } - } - return GL_FALSE; -} - -#if !defined(_WIN32) || !defined(GLEW_MX) - -PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; -PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; -PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; -PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; - -PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; -PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; -PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; -PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; -PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; -PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; -PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; -PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; -PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; -PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; -PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; -PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; -PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; -PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; -PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; -PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; -PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; -PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; -PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; -PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; -PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; -PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; -PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; -PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; -PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; -PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; -PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; -PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; -PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; -PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; -PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; -PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; -PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; -PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; -PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; -PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; -PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; -PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; -PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; -PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; - -PFNGLBLENDCOLORPROC __glewBlendColor = NULL; -PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; -PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; -PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; -PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; -PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; -PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; -PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; -PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; -PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; -PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; -PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; -PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; -PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; -PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; -PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; -PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; -PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; -PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; -PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; -PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; -PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; -PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; -PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; -PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; -PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; -PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; -PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; -PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; -PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; -PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; -PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; -PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; -PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; -PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; -PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; -PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; -PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; -PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; -PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; -PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; -PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; -PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; -PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; -PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; - -PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; -PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; -PFNGLBUFFERDATAPROC __glewBufferData = NULL; -PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; -PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; -PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; -PFNGLENDQUERYPROC __glewEndQuery = NULL; -PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; -PFNGLGENQUERIESPROC __glewGenQueries = NULL; -PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; -PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; -PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; -PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; -PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; -PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; -PFNGLISBUFFERPROC __glewIsBuffer = NULL; -PFNGLISQUERYPROC __glewIsQuery = NULL; -PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; -PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; - -PFNGLATTACHSHADERPROC __glewAttachShader = NULL; -PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; -PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; -PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; -PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; -PFNGLCREATESHADERPROC __glewCreateShader = NULL; -PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; -PFNGLDELETESHADERPROC __glewDeleteShader = NULL; -PFNGLDETACHSHADERPROC __glewDetachShader = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; -PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; -PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; -PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; -PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; -PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; -PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; -PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; -PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; -PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; -PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; -PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; -PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; -PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; -PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; -PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; -PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; -PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; -PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; -PFNGLISPROGRAMPROC __glewIsProgram = NULL; -PFNGLISSHADERPROC __glewIsShader = NULL; -PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; -PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; -PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; -PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; -PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; -PFNGLUNIFORM1FPROC __glewUniform1f = NULL; -PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; -PFNGLUNIFORM1IPROC __glewUniform1i = NULL; -PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; -PFNGLUNIFORM2FPROC __glewUniform2f = NULL; -PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; -PFNGLUNIFORM2IPROC __glewUniform2i = NULL; -PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; -PFNGLUNIFORM3FPROC __glewUniform3f = NULL; -PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; -PFNGLUNIFORM3IPROC __glewUniform3i = NULL; -PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; -PFNGLUNIFORM4FPROC __glewUniform4f = NULL; -PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; -PFNGLUNIFORM4IPROC __glewUniform4i = NULL; -PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; -PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; -PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; -PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; -PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; -PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; -PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; -PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; -PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; -PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; -PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; -PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; -PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; -PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; -PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; -PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; -PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; -PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; -PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; -PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; -PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; -PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; -PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; -PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; -PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; -PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; -PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; -PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; -PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; -PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; -PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; -PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; -PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; -PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; -PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; -PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; -PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; -PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; -PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; -PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; -PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; -PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; -PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; - -PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; - -PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; -PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; -PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; -PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; -PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; - -PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; -PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; -PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; -PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; -PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; -PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; -PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; -PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; - -PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; -PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; - -PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; -PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; -PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; -PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; - -PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; -PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; -PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; - -PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; - -PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; - -PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; -PFNGLCOLORTABLEPROC __glewColorTable = NULL; -PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; -PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; -PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; -PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; -PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; -PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; -PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; -PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; -PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; -PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; -PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; -PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; -PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; -PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; -PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; -PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; -PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; -PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; -PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; -PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; -PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; -PFNGLGETMINMAXPROC __glewGetMinmax = NULL; -PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; -PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; -PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; -PFNGLHISTOGRAMPROC __glewHistogram = NULL; -PFNGLMINMAXPROC __glewMinmax = NULL; -PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; -PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; -PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; - -PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; -PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; -PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; -PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; -PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; - -PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; - -PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; -PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; -PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; -PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; -PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; -PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; -PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; -PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; -PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; -PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; -PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; -PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; -PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; -PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; -PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; -PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; -PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; -PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; -PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; -PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; -PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; -PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; -PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; -PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; -PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; -PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; -PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; -PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; -PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; -PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; -PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; -PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; -PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; -PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; - -PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; -PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; -PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; -PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; -PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; -PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; -PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; -PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; - -PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; -PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; - -PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; -PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; -PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; -PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; -PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; -PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; -PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; -PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; -PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; -PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; -PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; -PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; -PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; -PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; -PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; -PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; -PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; -PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; -PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; -PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; -PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; -PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; -PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; -PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; -PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; -PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; -PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; -PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; -PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; -PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; -PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; -PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; -PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; -PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; -PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; -PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; -PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; -PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; -PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; - -PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; -PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; - -PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; -PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; -PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; -PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; - -PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; -PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; -PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; -PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; -PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; -PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; -PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; -PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; -PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; -PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; - -PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; -PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; -PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; -PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; -PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; -PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; -PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; -PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; -PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; -PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; -PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; - -PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; -PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; -PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; -PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; -PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; -PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; -PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; -PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; -PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; -PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; -PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; -PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; -PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; -PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; -PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; -PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; -PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; -PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; -PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; -PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; -PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; -PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; -PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; -PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; -PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; -PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; -PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; -PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; -PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; -PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; -PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; -PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; -PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; -PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; -PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; -PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; -PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; -PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; -PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; -PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; -PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; -PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; -PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; -PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; -PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; -PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; -PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; -PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; -PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; -PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; -PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; -PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; -PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; -PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; -PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; -PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; -PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; - -PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; -PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; -PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; - -PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; -PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; -PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; -PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; -PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; -PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; -PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; -PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; -PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; -PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; -PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; -PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; -PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; -PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; -PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; -PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; - -PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; - -PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; -PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; -PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; - -PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; -PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; -PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; -PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; - -PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; -PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; -PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; -PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; -PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; -PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; -PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; -PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; -PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; -PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; -PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; -PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; -PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; -PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; - -PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; -PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; - -PFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI = NULL; -PFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI = NULL; - -PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; -PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; - -PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; -PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; -PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; -PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; -PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; -PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; -PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; -PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; -PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; -PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; -PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; -PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; - -PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; -PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; -PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; - -PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; -PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; -PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; -PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; -PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; -PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; -PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; -PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; -PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; -PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; -PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; -PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; -PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; -PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; -PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; -PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; -PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; -PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; -PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; -PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; -PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; -PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; -PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; -PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; -PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; -PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; -PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; -PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; -PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; -PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; -PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; -PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; -PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; -PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; -PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; -PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; -PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; - -PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; - -PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; - -PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; - -PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; - -PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; -PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; - -PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; -PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; - -PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; -PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; -PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; -PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; -PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; -PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; -PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; -PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; -PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; -PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; -PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; -PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; -PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; - -PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; -PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; - -PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; -PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; -PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; - -PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; -PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; - -PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; - -PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; - -PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; -PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; -PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; -PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; -PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; - -PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; -PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; -PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; -PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; -PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; -PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; -PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; -PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; -PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; -PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; -PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; -PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; -PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; -PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; -PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; -PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; -PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; -PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; - -PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; - -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; - -PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; -PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; -PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; -PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; -PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; -PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; -PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; -PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; -PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; -PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; -PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; - -PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; -PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; -PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; -PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; -PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; -PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; -PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; -PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; -PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; -PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; - -PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; - -PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; - -PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; -PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; -PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; - -PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; -PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; - -PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; -PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; - -PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; -PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; -PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; -PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; - -PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; -PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; -PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; - -PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; -PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; - -PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; - -PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; -PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; - -PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; -PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; -PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; -PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; -PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; -PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; -PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; -PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; -PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; -PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; -PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; -PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; -PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; -PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; -PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; -PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; -PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; - -PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; - -PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; -PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; -PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; - -PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; - -PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; -PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; -PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; -PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; -PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; -PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; - -PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; - -PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; -PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; -PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; -PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; -PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT = NULL; -PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; -PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; -PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; -PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; - -PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; -PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; -PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; -PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; -PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; -PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; -PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; -PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; -PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; -PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; -PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; -PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; -PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; -PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; -PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; -PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; -PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; -PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; -PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; -PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; -PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; -PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; -PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; -PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; -PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; -PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; -PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; -PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; -PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; -PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; -PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; -PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; -PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; -PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; -PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; -PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; -PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; -PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; -PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; -PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; -PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; -PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; - -PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; -PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; -PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; - -PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; - -PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; -PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; -PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; - -PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; -PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; - -PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; -PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; -PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; -PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; -PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; -PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; -PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; -PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; - -PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; -PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; -PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; -PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; - -PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; -PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; - -PFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT = NULL; -PFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT = NULL; -PFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT = NULL; -PFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT = NULL; -PFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT = NULL; - -PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; - -PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; -PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; -PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; -PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; -PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; -PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; -PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; -PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; -PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; -PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; -PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; -PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; -PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; -PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; -PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; -PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; -PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; -PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; -PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; -PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; -PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; -PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; -PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; -PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; - -PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; -PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; -PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; -PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; -PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; -PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; -PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; -PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; -PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; - -PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; -PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; -PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; -PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; -PFNGLISFENCENVPROC __glewIsFenceNV = NULL; -PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; -PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; - -PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; -PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; -PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; - -PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; -PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; -PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; -PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; -PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; -PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; -PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; -PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; -PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; -PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; -PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; -PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; -PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; -PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; -PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; -PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; -PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; -PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; -PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; -PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; -PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; -PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; -PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; -PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; -PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; -PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; -PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; -PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; -PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; -PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; -PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; -PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; -PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; -PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; -PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; -PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; -PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; -PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; -PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; -PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; -PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; -PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; -PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; -PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; -PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; -PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; - -PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; -PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; -PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; -PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; -PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; -PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; -PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; - -PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; -PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; - -PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; -PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; - -PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; -PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; - -PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; -PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; -PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; -PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; -PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; -PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; -PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; -PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; -PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; -PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; - -PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; -PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; - -PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; -PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; - -PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; -PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; -PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; -PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; -PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; -PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; -PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; -PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; -PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; -PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; -PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; -PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; -PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; -PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; -PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; -PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; -PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; -PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; -PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; -PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; -PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; -PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; -PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; -PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; -PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; -PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; -PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; -PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; -PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; -PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; -PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; -PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; -PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; -PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; -PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; -PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; -PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; -PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; -PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; -PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; -PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; -PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; -PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; -PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; -PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; -PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; -PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; -PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; -PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; -PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; -PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; -PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; -PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; -PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; -PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; -PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; -PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; -PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; -PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; -PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; -PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; -PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; -PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; -PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; - -PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; -PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; - -PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; -PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; - -PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; -PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; - -PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; -PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; - -PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; -PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; - -PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; -PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; - -PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; -PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; -PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; -PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; -PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; -PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; - -PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; - -PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; - -PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; -PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; -PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; -PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; -PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; -PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; -PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; -PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; -PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; -PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; -PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; -PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; -PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; -PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; - -PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; - -PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; - -PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; - -PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; -PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; -PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; -PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; - -PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; - -PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; -PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; -PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; -PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; -PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; -PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; -PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; - -PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; - -PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; -PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; -PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; -PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; -PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; -PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; -PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; -PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; - -PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; - -PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; -PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; -PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; -PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; -PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; -PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; -PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; - -PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; -PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; -PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; -PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; -PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; -PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; -PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; -PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; -PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; -PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; -PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; -PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; -PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; -PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; -PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; -PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; -PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; -PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; -PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; -PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; -PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; - -PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; - -#endif /* !WIN32 || !GLEW_MX */ - -#if !defined(GLEW_MX) - -GLboolean __GLEW_VERSION_1_1 = GL_FALSE; -GLboolean __GLEW_VERSION_1_2 = GL_FALSE; -GLboolean __GLEW_VERSION_1_3 = GL_FALSE; -GLboolean __GLEW_VERSION_1_4 = GL_FALSE; -GLboolean __GLEW_VERSION_1_5 = GL_FALSE; -GLboolean __GLEW_VERSION_2_0 = GL_FALSE; -GLboolean __GLEW_3DFX_multisample = GL_FALSE; -GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; -GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; -GLboolean __GLEW_APPLE_client_storage = GL_FALSE; -GLboolean __GLEW_APPLE_element_array = GL_FALSE; -GLboolean __GLEW_APPLE_fence = GL_FALSE; -GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; -GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; -GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; -GLboolean __GLEW_APPLE_texture_range = GL_FALSE; -GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; -GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; -GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; -GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; -GLboolean __GLEW_ARB_depth_texture = GL_FALSE; -GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; -GLboolean __GLEW_ARB_fragment_program = GL_FALSE; -GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; -GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; -GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; -GLboolean __GLEW_ARB_imaging = GL_FALSE; -GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; -GLboolean __GLEW_ARB_multisample = GL_FALSE; -GLboolean __GLEW_ARB_multitexture = GL_FALSE; -GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; -GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_point_parameters = GL_FALSE; -GLboolean __GLEW_ARB_point_sprite = GL_FALSE; -GLboolean __GLEW_ARB_shader_objects = GL_FALSE; -GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; -GLboolean __GLEW_ARB_shadow = GL_FALSE; -GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; -GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_ARB_texture_compression = GL_FALSE; -GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; -GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; -GLboolean __GLEW_ARB_texture_float = GL_FALSE; -GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; -GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; -GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; -GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; -GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; -GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; -GLboolean __GLEW_ARB_vertex_program = GL_FALSE; -GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; -GLboolean __GLEW_ARB_window_pos = GL_FALSE; -GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; -GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; -GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; -GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; -GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; -GLboolean __GLEW_ATI_element_array = GL_FALSE; -GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; -GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; -GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; -GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; -GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; -GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; -GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; -GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; -GLboolean __GLEW_ATI_texture_float = GL_FALSE; -GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; -GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; -GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; -GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; -GLboolean __GLEW_EXT_422_pixels = GL_FALSE; -GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; -GLboolean __GLEW_EXT_abgr = GL_FALSE; -GLboolean __GLEW_EXT_bgra = GL_FALSE; -GLboolean __GLEW_EXT_blend_color = GL_FALSE; -GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; -GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; -GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; -GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; -GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; -GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; -GLboolean __GLEW_EXT_cmyka = GL_FALSE; -GLboolean __GLEW_EXT_color_subtable = GL_FALSE; -GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; -GLboolean __GLEW_EXT_convolution = GL_FALSE; -GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; -GLboolean __GLEW_EXT_copy_texture = GL_FALSE; -GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; -GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; -GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; -GLboolean __GLEW_EXT_fog_coord = GL_FALSE; -GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; -GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; -GLboolean __GLEW_EXT_histogram = GL_FALSE; -GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; -GLboolean __GLEW_EXT_index_func = GL_FALSE; -GLboolean __GLEW_EXT_index_material = GL_FALSE; -GLboolean __GLEW_EXT_index_texture = GL_FALSE; -GLboolean __GLEW_EXT_light_texture = GL_FALSE; -GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; -GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; -GLboolean __GLEW_EXT_multisample = GL_FALSE; -GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; -GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; -GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; -GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; -GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; -GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; -GLboolean __GLEW_EXT_point_parameters = GL_FALSE; -GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; -GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; -GLboolean __GLEW_EXT_scene_marker = GL_FALSE; -GLboolean __GLEW_EXT_secondary_color = GL_FALSE; -GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; -GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; -GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; -GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; -GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; -GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; -GLboolean __GLEW_EXT_subtexture = GL_FALSE; -GLboolean __GLEW_EXT_texture = GL_FALSE; -GLboolean __GLEW_EXT_texture3D = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; -GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; -GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; -GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; -GLboolean __GLEW_EXT_texture_env = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; -GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; -GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; -GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; -GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; -GLboolean __GLEW_EXT_texture_object = GL_FALSE; -GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; -GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; -GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; -GLboolean __GLEW_EXT_vertex_array = GL_FALSE; -GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; -GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; -GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; -GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; -GLboolean __GLEW_HP_image_transform = GL_FALSE; -GLboolean __GLEW_HP_occlusion_test = GL_FALSE; -GLboolean __GLEW_HP_texture_lighting = GL_FALSE; -GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; -GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; -GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; -GLboolean __GLEW_IBM_static_data = GL_FALSE; -GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; -GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; -GLboolean __GLEW_INGR_color_clamp = GL_FALSE; -GLboolean __GLEW_INGR_interlace_read = GL_FALSE; -GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; -GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; -GLboolean __GLEW_KTX_buffer_region = GL_FALSE; -GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; -GLboolean __GLEW_MESA_pack_invert = GL_FALSE; -GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; -GLboolean __GLEW_MESA_window_pos = GL_FALSE; -GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; -GLboolean __GLEW_NV_blend_square = GL_FALSE; -GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; -GLboolean __GLEW_NV_depth_clamp = GL_FALSE; -GLboolean __GLEW_NV_evaluators = GL_FALSE; -GLboolean __GLEW_NV_fence = GL_FALSE; -GLboolean __GLEW_NV_float_buffer = GL_FALSE; -GLboolean __GLEW_NV_fog_distance = GL_FALSE; -GLboolean __GLEW_NV_fragment_program = GL_FALSE; -GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; -GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; -GLboolean __GLEW_NV_half_float = GL_FALSE; -GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; -GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; -GLboolean __GLEW_NV_occlusion_query = GL_FALSE; -GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; -GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; -GLboolean __GLEW_NV_point_sprite = GL_FALSE; -GLboolean __GLEW_NV_primitive_restart = GL_FALSE; -GLboolean __GLEW_NV_register_combiners = GL_FALSE; -GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; -GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; -GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; -GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; -GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; -GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; -GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; -GLboolean __GLEW_NV_texture_shader = GL_FALSE; -GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; -GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; -GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; -GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program = GL_FALSE; -GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; -GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; -GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; -GLboolean __GLEW_OML_interlace = GL_FALSE; -GLboolean __GLEW_OML_resample = GL_FALSE; -GLboolean __GLEW_OML_subsample = GL_FALSE; -GLboolean __GLEW_PGI_misc_hints = GL_FALSE; -GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; -GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; -GLboolean __GLEW_S3_s3tc = GL_FALSE; -GLboolean __GLEW_SGIS_color_range = GL_FALSE; -GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; -GLboolean __GLEW_SGIS_fog_function = GL_FALSE; -GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; -GLboolean __GLEW_SGIS_multisample = GL_FALSE; -GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; -GLboolean __GLEW_SGIS_texture4D = GL_FALSE; -GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; -GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; -GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; -GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; -GLboolean __GLEW_SGIS_texture_select = GL_FALSE; -GLboolean __GLEW_SGIX_async = GL_FALSE; -GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; -GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; -GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; -GLboolean __GLEW_SGIX_clipmap = GL_FALSE; -GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; -GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; -GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; -GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; -GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; -GLboolean __GLEW_SGIX_framezoom = GL_FALSE; -GLboolean __GLEW_SGIX_interlace = GL_FALSE; -GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; -GLboolean __GLEW_SGIX_list_priority = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; -GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; -GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; -GLboolean __GLEW_SGIX_resample = GL_FALSE; -GLboolean __GLEW_SGIX_shadow = GL_FALSE; -GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; -GLboolean __GLEW_SGIX_sprite = GL_FALSE; -GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; -GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; -GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; -GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; -GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; -GLboolean __GLEW_SGIX_texture_range = GL_FALSE; -GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; -GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; -GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; -GLboolean __GLEW_SGI_color_matrix = GL_FALSE; -GLboolean __GLEW_SGI_color_table = GL_FALSE; -GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; -GLboolean __GLEW_SUNX_constant_data = GL_FALSE; -GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; -GLboolean __GLEW_SUN_global_alpha = GL_FALSE; -GLboolean __GLEW_SUN_mesh_array = GL_FALSE; -GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; -GLboolean __GLEW_SUN_slice_accum = GL_FALSE; -GLboolean __GLEW_SUN_triangle_list = GL_FALSE; -GLboolean __GLEW_SUN_vertex = GL_FALSE; -GLboolean __GLEW_WIN_phong_shading = GL_FALSE; -GLboolean __GLEW_WIN_specular_fog = GL_FALSE; -GLboolean __GLEW_WIN_swap_hint = GL_FALSE; - -#endif /* !GLEW_MX */ - -#ifdef GL_VERSION_1_2 - -static GLboolean _glewInit_GL_VERSION_1_2 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; - r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; - r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; - r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_2 */ - -#ifdef GL_VERSION_1_3 - -static GLboolean _glewInit_GL_VERSION_1_3 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; - r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; - r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; - r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; - r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; - r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; - r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; - r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; - r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; - r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; - r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; - r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; - r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; - r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; - r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; - r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; - r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; - r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; - r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; - r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; - r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; - r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; - r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; - r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; - r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; - r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; - r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; - r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; - r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; - r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; - r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; - r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; - r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; - r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; - r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; - r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; - r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; - r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; - r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; - r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; - r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; - r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; - r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; - r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; - r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; - r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_3 */ - -#ifdef GL_VERSION_1_4 - -static GLboolean _glewInit_GL_VERSION_1_4 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; - r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; - r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; - r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; - r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; - r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; - r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; - r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; - r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; - r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; - r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; - r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; - r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; - r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; - r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; - r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; - r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; - r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; - r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; - r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; - r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; - r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; - r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; - r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; - r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; - r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; - r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; - r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; - r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; - r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; - r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; - r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; - r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; - r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; - r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; - r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; - r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; - r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; - r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; - r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; - r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; - r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; - r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; - r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; - r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_4 */ - -#ifdef GL_VERSION_1_5 - -static GLboolean _glewInit_GL_VERSION_1_5 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; - r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; - r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; - r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; - r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; - r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; - r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; - r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; - r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; - r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; - r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; - r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; - r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; - r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; - r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; - r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; - r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; - r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; - r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_1_5 */ - -#ifdef GL_VERSION_2_0 - -static GLboolean _glewInit_GL_VERSION_2_0 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; - r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; - r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; - r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; - r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; - r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; - r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; - r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; - r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; - r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; - r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; - r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; - r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; - r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; - r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; - r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; - r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; - r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; - r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; - r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; - r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; - r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; - r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; - r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; - r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; - r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; - r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; - r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; - r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; - r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; - r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; - r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; - r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; - r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; - r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; - r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; - r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; - r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; - r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; - r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; - r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; - r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; - r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; - r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; - r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; - r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; - r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; - r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; - r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; - r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; - r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; - r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; - r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; - r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; - r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; - r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; - r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; - r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; - r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; - r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; - r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; - r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; - r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; - r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; - r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; - r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; - r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; - r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; - r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; - r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; - r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; - r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; - r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; - r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; - r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; - r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; - r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; - r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; - r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; - r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; - r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; - r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; - r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; - r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; - r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; - r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; - r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; - r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; - r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; - r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; - r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; - r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; - r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; - - return r; -} - -#endif /* GL_VERSION_2_0 */ - -#ifdef GL_3DFX_multisample - -#endif /* GL_3DFX_multisample */ - -#ifdef GL_3DFX_tbuffer - -static GLboolean _glewInit_GL_3DFX_tbuffer (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; - - return r; -} - -#endif /* GL_3DFX_tbuffer */ - -#ifdef GL_3DFX_texture_compression_FXT1 - -#endif /* GL_3DFX_texture_compression_FXT1 */ - -#ifdef GL_APPLE_client_storage - -#endif /* GL_APPLE_client_storage */ - -#ifdef GL_APPLE_element_array - -static GLboolean _glewInit_GL_APPLE_element_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; - r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; - r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; - r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; - r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_element_array */ - -#ifdef GL_APPLE_fence - -static GLboolean _glewInit_GL_APPLE_fence (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; - r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; - r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; - r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; - r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; - r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; - r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; - r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_fence */ - -#ifdef GL_APPLE_float_pixels - -#endif /* GL_APPLE_float_pixels */ - -#ifdef GL_APPLE_pixel_buffer - -#endif /* GL_APPLE_pixel_buffer */ - -#ifdef GL_APPLE_specular_vector - -#endif /* GL_APPLE_specular_vector */ - -#ifdef GL_APPLE_texture_range - -static GLboolean _glewInit_GL_APPLE_texture_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; - r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_texture_range */ - -#ifdef GL_APPLE_transform_hint - -#endif /* GL_APPLE_transform_hint */ - -#ifdef GL_APPLE_vertex_array_object - -static GLboolean _glewInit_GL_APPLE_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; - r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; - r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; - r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_array_object */ - -#ifdef GL_APPLE_vertex_array_range - -static GLboolean _glewInit_GL_APPLE_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; - r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; - r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; - - return r; -} - -#endif /* GL_APPLE_vertex_array_range */ - -#ifdef GL_APPLE_ycbcr_422 - -#endif /* GL_APPLE_ycbcr_422 */ - -#ifdef GL_ARB_color_buffer_float - -static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_color_buffer_float */ - -#ifdef GL_ARB_depth_texture - -#endif /* GL_ARB_depth_texture */ - -#ifdef GL_ARB_draw_buffers - -static GLboolean _glewInit_GL_ARB_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_draw_buffers */ - -#ifdef GL_ARB_fragment_program - -#endif /* GL_ARB_fragment_program */ - -#ifdef GL_ARB_fragment_program_shadow - -#endif /* GL_ARB_fragment_program_shadow */ - -#ifdef GL_ARB_fragment_shader - -#endif /* GL_ARB_fragment_shader */ - -#ifdef GL_ARB_half_float_pixel - -#endif /* GL_ARB_half_float_pixel */ - -#ifdef GL_ARB_imaging - -static GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; - r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; - r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; - r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; - r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; - r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; - r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; - r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; - r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; - r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; - r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; - r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; - r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; - r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; - r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; - r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; - r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; - r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; - r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; - r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; - r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; - r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; - r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; - r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; - r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; - r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; - r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; - r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; - r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; - r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; - r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; - r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; - r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_imaging */ - -#ifdef GL_ARB_matrix_palette - -static GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; - r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; - r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; - r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; - r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_matrix_palette */ - -#ifdef GL_ARB_multisample - -static GLboolean _glewInit_GL_ARB_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multisample */ - -#ifdef GL_ARB_multitexture - -static GLboolean _glewInit_GL_ARB_multitexture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; - r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; - r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; - r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; - r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; - r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; - r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; - r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; - r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; - r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; - r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; - r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; - r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; - r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; - r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; - r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; - r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; - r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; - r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; - r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; - r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; - r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; - r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; - r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; - r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; - r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; - r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; - r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; - r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; - r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; - r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; - r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; - r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; - r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_multitexture */ - -#ifdef GL_ARB_occlusion_query - -static GLboolean _glewInit_GL_ARB_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; - r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; - r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; - r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; - r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; - r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; - r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; - r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_occlusion_query */ - -#ifdef GL_ARB_pixel_buffer_object - -#endif /* GL_ARB_pixel_buffer_object */ - -#ifdef GL_ARB_point_parameters - -static GLboolean _glewInit_GL_ARB_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; - r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_point_parameters */ - -#ifdef GL_ARB_point_sprite - -#endif /* GL_ARB_point_sprite */ - -#ifdef GL_ARB_shader_objects - -static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; - r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; - r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; - r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; - r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; - r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; - r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; - r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; - r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; - r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; - r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; - r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; - r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; - r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; - r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; - r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; - r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; - r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; - r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; - r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; - r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; - r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; - r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; - r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; - r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; - r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; - r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; - r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; - r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; - r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; - r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; - r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; - r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; - r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; - r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; - r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; - r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; - r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; - r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_shader_objects */ - -#ifdef GL_ARB_shading_language_100 - -#endif /* GL_ARB_shading_language_100 */ - -#ifdef GL_ARB_shadow - -#endif /* GL_ARB_shadow */ - -#ifdef GL_ARB_shadow_ambient - -#endif /* GL_ARB_shadow_ambient */ - -#ifdef GL_ARB_texture_border_clamp - -#endif /* GL_ARB_texture_border_clamp */ - -#ifdef GL_ARB_texture_compression - -static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; - r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; - r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; - r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; - r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; - r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; - r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_texture_compression */ - -#ifdef GL_ARB_texture_cube_map - -#endif /* GL_ARB_texture_cube_map */ - -#ifdef GL_ARB_texture_env_add - -#endif /* GL_ARB_texture_env_add */ - -#ifdef GL_ARB_texture_env_combine - -#endif /* GL_ARB_texture_env_combine */ - -#ifdef GL_ARB_texture_env_crossbar - -#endif /* GL_ARB_texture_env_crossbar */ - -#ifdef GL_ARB_texture_env_dot3 - -#endif /* GL_ARB_texture_env_dot3 */ - -#ifdef GL_ARB_texture_float - -#endif /* GL_ARB_texture_float */ - -#ifdef GL_ARB_texture_mirrored_repeat - -#endif /* GL_ARB_texture_mirrored_repeat */ - -#ifdef GL_ARB_texture_non_power_of_two - -#endif /* GL_ARB_texture_non_power_of_two */ - -#ifdef GL_ARB_texture_rectangle - -#endif /* GL_ARB_texture_rectangle */ - -#ifdef GL_ARB_transpose_matrix - -static GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; - r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; - r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; - r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_transpose_matrix */ - -#ifdef GL_ARB_vertex_blend - -static GLboolean _glewInit_GL_ARB_vertex_blend (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; - r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; - r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; - r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; - r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; - r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; - r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; - r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; - r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; - r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_blend */ - -#ifdef GL_ARB_vertex_buffer_object - -static GLboolean _glewInit_GL_ARB_vertex_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; - r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; - r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; - r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; - r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; - r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; - r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; - r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; - r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; - r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; - r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_buffer_object */ - -#ifdef GL_ARB_vertex_program - -static GLboolean _glewInit_GL_ARB_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; - r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; - r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; - r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; - r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; - r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; - r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; - r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; - r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; - r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; - r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; - r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; - r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; - r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; - r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; - r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; - r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; - r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; - r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; - r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; - r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; - r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; - r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; - r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; - r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; - r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; - r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; - r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; - r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; - r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; - r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; - r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; - r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; - r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; - r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; - r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; - r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; - r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; - r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; - r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; - r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; - r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; - r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; - r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; - r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; - r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; - r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; - r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; - r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; - r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; - r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; - r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; - r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; - r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; - r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; - r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; - r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; - r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; - r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; - r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; - r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; - r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_program */ - -#ifdef GL_ARB_vertex_shader - -static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; - r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; - r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_vertex_shader */ - -#ifdef GL_ARB_window_pos - -static GLboolean _glewInit_GL_ARB_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; - r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; - r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; - r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; - r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; - r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; - r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; - r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; - r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; - r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; - r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; - r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; - r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; - r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; - r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; - r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; - - return r; -} - -#endif /* GL_ARB_window_pos */ - -#ifdef GL_ATIX_point_sprites - -#endif /* GL_ATIX_point_sprites */ - -#ifdef GL_ATIX_texture_env_combine3 - -#endif /* GL_ATIX_texture_env_combine3 */ - -#ifdef GL_ATIX_texture_env_route - -#endif /* GL_ATIX_texture_env_route */ - -#ifdef GL_ATIX_vertex_shader_output_point_size - -#endif /* GL_ATIX_vertex_shader_output_point_size */ - -#ifdef GL_ATI_draw_buffers - -static GLboolean _glewInit_GL_ATI_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_draw_buffers */ - -#ifdef GL_ATI_element_array - -static GLboolean _glewInit_GL_ATI_element_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; - r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; - r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_element_array */ - -#ifdef GL_ATI_envmap_bumpmap - -static GLboolean _glewInit_GL_ATI_envmap_bumpmap (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; - r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; - r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; - r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_envmap_bumpmap */ - -#ifdef GL_ATI_fragment_shader - -static GLboolean _glewInit_GL_ATI_fragment_shader (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; - r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; - r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; - r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; - r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; - r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; - r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; - r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; - r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; - r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; - r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; - r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; - r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; - r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_fragment_shader */ - -#ifdef GL_ATI_map_object_buffer - -static GLboolean _glewInit_GL_ATI_map_object_buffer (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; - r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_map_object_buffer */ - -#ifdef GL_ATI_pn_triangles - -static GLboolean _glewInit_GL_ATI_pn_triangles (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; - r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_pn_triangles */ - -#ifdef GL_ATI_separate_stencil - -static GLboolean _glewInit_GL_ATI_separate_stencil (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; - r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_separate_stencil */ - -#ifdef GL_ATI_text_fragment_shader - -#endif /* GL_ATI_text_fragment_shader */ - -#ifdef GL_ATI_texture_compression_3dc - -#endif /* GL_ATI_texture_compression_3dc */ - -#ifdef GL_ATI_texture_env_combine3 - -#endif /* GL_ATI_texture_env_combine3 */ - -#ifdef GL_ATI_texture_float - -#endif /* GL_ATI_texture_float */ - -#ifdef GL_ATI_texture_mirror_once - -#endif /* GL_ATI_texture_mirror_once */ - -#ifdef GL_ATI_vertex_array_object - -static GLboolean _glewInit_GL_ATI_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; - r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; - r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; - r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; - r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; - r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; - r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; - r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; - r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; - r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; - r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; - r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_array_object */ - -#ifdef GL_ATI_vertex_attrib_array_object - -static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; - r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; - r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_attrib_array_object */ - -#ifdef GL_ATI_vertex_streams - -static GLboolean _glewInit_GL_ATI_vertex_streams (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; - r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; - r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; - r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; - r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; - r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; - r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; - r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; - r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; - r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; - r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; - r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; - r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; - r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; - r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; - r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; - r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; - r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; - r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; - r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; - r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; - r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; - r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; - r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; - r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; - r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; - r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; - r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; - r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; - r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; - r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; - r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; - r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; - r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; - r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; - r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; - r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; - - return r; -} - -#endif /* GL_ATI_vertex_streams */ - -#ifdef GL_EXT_422_pixels - -#endif /* GL_EXT_422_pixels */ - -#ifdef GL_EXT_Cg_shader - -#endif /* GL_EXT_Cg_shader */ - -#ifdef GL_EXT_abgr - -#endif /* GL_EXT_abgr */ - -#ifdef GL_EXT_bgra - -#endif /* GL_EXT_bgra */ - -#ifdef GL_EXT_blend_color - -static GLboolean _glewInit_GL_EXT_blend_color (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_color */ - -#ifdef GL_EXT_blend_equation_separate - -static GLboolean _glewInit_GL_EXT_blend_equation_separate (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_equation_separate */ - -#ifdef GL_EXT_blend_func_separate - -static GLboolean _glewInit_GL_EXT_blend_func_separate (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_func_separate */ - -#ifdef GL_EXT_blend_logic_op - -#endif /* GL_EXT_blend_logic_op */ - -#ifdef GL_EXT_blend_minmax - -static GLboolean _glewInit_GL_EXT_blend_minmax (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_blend_minmax */ - -#ifdef GL_EXT_blend_subtract - -#endif /* GL_EXT_blend_subtract */ - -#ifdef GL_EXT_clip_volume_hint - -#endif /* GL_EXT_clip_volume_hint */ - -#ifdef GL_EXT_cmyka - -#endif /* GL_EXT_cmyka */ - -#ifdef GL_EXT_color_subtable - -static GLboolean _glewInit_GL_EXT_color_subtable (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; - r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_color_subtable */ - -#ifdef GL_EXT_compiled_vertex_array - -static GLboolean _glewInit_GL_EXT_compiled_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; - r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_compiled_vertex_array */ - -#ifdef GL_EXT_convolution - -static GLboolean _glewInit_GL_EXT_convolution (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; - r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; - r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; - r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; - r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; - r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; - r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; - r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; - r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; - r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; - r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; - r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; - r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_convolution */ - -#ifdef GL_EXT_coordinate_frame - -static GLboolean _glewInit_GL_EXT_coordinate_frame (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; - r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_coordinate_frame */ - -#ifdef GL_EXT_copy_texture - -static GLboolean _glewInit_GL_EXT_copy_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; - r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; - r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; - r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; - r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_copy_texture */ - -#ifdef GL_EXT_cull_vertex - -static GLboolean _glewInit_GL_EXT_cull_vertex (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; - r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_cull_vertex */ - -#ifdef GL_EXT_depth_bounds_test - -static GLboolean _glewInit_GL_EXT_depth_bounds_test (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_depth_bounds_test */ - -#ifdef GL_EXT_draw_range_elements - -static GLboolean _glewInit_GL_EXT_draw_range_elements (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_draw_range_elements */ - -#ifdef GL_EXT_fog_coord - -static GLboolean _glewInit_GL_EXT_fog_coord (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; - r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; - r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; - r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; - r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_fog_coord */ - -#ifdef GL_EXT_fragment_lighting - -static GLboolean _glewInit_GL_EXT_fragment_lighting (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; - r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; - r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; - r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; - r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; - r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; - r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; - r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; - r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; - r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; - r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; - r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; - r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; - r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; - r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; - r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; - r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; - r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_fragment_lighting */ - -#ifdef GL_EXT_framebuffer_blit - -static GLboolean _glewInit_GL_EXT_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_blit */ - -#ifdef GL_EXT_framebuffer_multisample - -static GLboolean _glewInit_GL_EXT_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_multisample */ - -#ifdef GL_EXT_framebuffer_object - -static GLboolean _glewInit_GL_EXT_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; - r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; - r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; - r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; - r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; - r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; - r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; - r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; - r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; - r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; - r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; - r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; - r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; - r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; - r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; - r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; - r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_framebuffer_object */ - -#ifdef GL_EXT_histogram - -static GLboolean _glewInit_GL_EXT_histogram (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; - r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; - r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; - r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; - r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; - r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; - r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; - r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; - r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; - r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_histogram */ - -#ifdef GL_EXT_index_array_formats - -#endif /* GL_EXT_index_array_formats */ - -#ifdef GL_EXT_index_func - -static GLboolean _glewInit_GL_EXT_index_func (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_index_func */ - -#ifdef GL_EXT_index_material - -static GLboolean _glewInit_GL_EXT_index_material (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_index_material */ - -#ifdef GL_EXT_index_texture - -#endif /* GL_EXT_index_texture */ - -#ifdef GL_EXT_light_texture - -static GLboolean _glewInit_GL_EXT_light_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; - r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; - r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_light_texture */ - -#ifdef GL_EXT_misc_attribute - -#endif /* GL_EXT_misc_attribute */ - -#ifdef GL_EXT_multi_draw_arrays - -static GLboolean _glewInit_GL_EXT_multi_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; - r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multi_draw_arrays */ - -#ifdef GL_EXT_multisample - -static GLboolean _glewInit_GL_EXT_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; - r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_multisample */ - -#ifdef GL_EXT_packed_depth_stencil - -#endif /* GL_EXT_packed_depth_stencil */ - -#ifdef GL_EXT_packed_pixels - -#endif /* GL_EXT_packed_pixels */ - -#ifdef GL_EXT_paletted_texture - -static GLboolean _glewInit_GL_EXT_paletted_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; - r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; - r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; - r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_paletted_texture */ - -#ifdef GL_EXT_pixel_buffer_object - -#endif /* GL_EXT_pixel_buffer_object */ - -#ifdef GL_EXT_pixel_transform - -static GLboolean _glewInit_GL_EXT_pixel_transform (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; - r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; - r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; - r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; - r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; - r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_pixel_transform */ - -#ifdef GL_EXT_pixel_transform_color_table - -#endif /* GL_EXT_pixel_transform_color_table */ - -#ifdef GL_EXT_point_parameters - -static GLboolean _glewInit_GL_EXT_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; - r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_point_parameters */ - -#ifdef GL_EXT_polygon_offset - -static GLboolean _glewInit_GL_EXT_polygon_offset (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_polygon_offset */ - -#ifdef GL_EXT_rescale_normal - -#endif /* GL_EXT_rescale_normal */ - -#ifdef GL_EXT_scene_marker - -static GLboolean _glewInit_GL_EXT_scene_marker (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; - r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_scene_marker */ - -#ifdef GL_EXT_secondary_color - -static GLboolean _glewInit_GL_EXT_secondary_color (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; - r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; - r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; - r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; - r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; - r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; - r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; - r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; - r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; - r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; - r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; - r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; - r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; - r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; - r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; - r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; - r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_secondary_color */ - -#ifdef GL_EXT_separate_specular_color - -#endif /* GL_EXT_separate_specular_color */ - -#ifdef GL_EXT_shadow_funcs - -#endif /* GL_EXT_shadow_funcs */ - -#ifdef GL_EXT_shared_texture_palette - -#endif /* GL_EXT_shared_texture_palette */ - -#ifdef GL_EXT_stencil_clear_tag - -#endif /* GL_EXT_stencil_clear_tag */ - -#ifdef GL_EXT_stencil_two_side - -static GLboolean _glewInit_GL_EXT_stencil_two_side (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_stencil_two_side */ - -#ifdef GL_EXT_stencil_wrap - -#endif /* GL_EXT_stencil_wrap */ - -#ifdef GL_EXT_subtexture - -static GLboolean _glewInit_GL_EXT_subtexture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; - r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; - r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_subtexture */ - -#ifdef GL_EXT_texture - -#endif /* GL_EXT_texture */ - -#ifdef GL_EXT_texture3D - -static GLboolean _glewInit_GL_EXT_texture3D (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture3D */ - -#ifdef GL_EXT_texture_compression_dxt1 - -#endif /* GL_EXT_texture_compression_dxt1 */ - -#ifdef GL_EXT_texture_compression_s3tc - -#endif /* GL_EXT_texture_compression_s3tc */ - -#ifdef GL_EXT_texture_cube_map - -#endif /* GL_EXT_texture_cube_map */ - -#ifdef GL_EXT_texture_edge_clamp - -#endif /* GL_EXT_texture_edge_clamp */ - -#ifdef GL_EXT_texture_env - -#endif /* GL_EXT_texture_env */ - -#ifdef GL_EXT_texture_env_add - -#endif /* GL_EXT_texture_env_add */ - -#ifdef GL_EXT_texture_env_combine - -#endif /* GL_EXT_texture_env_combine */ - -#ifdef GL_EXT_texture_env_dot3 - -#endif /* GL_EXT_texture_env_dot3 */ - -#ifdef GL_EXT_texture_filter_anisotropic - -#endif /* GL_EXT_texture_filter_anisotropic */ - -#ifdef GL_EXT_texture_lod_bias - -#endif /* GL_EXT_texture_lod_bias */ - -#ifdef GL_EXT_texture_mirror_clamp - -#endif /* GL_EXT_texture_mirror_clamp */ - -#ifdef GL_EXT_texture_object - -static GLboolean _glewInit_GL_EXT_texture_object (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; - r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; - r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; - r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; - r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; - r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_object */ - -#ifdef GL_EXT_texture_perturb_normal - -static GLboolean _glewInit_GL_EXT_texture_perturb_normal (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_texture_perturb_normal */ - -#ifdef GL_EXT_texture_rectangle - -#endif /* GL_EXT_texture_rectangle */ - -#ifdef GL_EXT_texture_sRGB - -#endif /* GL_EXT_texture_sRGB */ - -#ifdef GL_EXT_vertex_array - -static GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; - r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; - r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; - r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; - r = ((glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointervEXT")) == NULL) || r; - r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; - r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; - r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; - r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_array */ - -#ifdef GL_EXT_vertex_shader - -static GLboolean _glewInit_GL_EXT_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; - r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; - r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; - r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; - r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; - r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; - r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; - r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; - r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; - r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; - r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; - r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; - r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; - r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; - r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; - r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; - r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; - r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; - r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; - r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; - r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; - r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; - r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; - r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; - r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; - r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; - r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; - r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; - r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; - r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; - r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; - r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; - r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; - r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; - r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; - r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; - r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; - r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; - r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; - r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; - r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; - r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_shader */ - -#ifdef GL_EXT_vertex_weighting - -static GLboolean _glewInit_GL_EXT_vertex_weighting (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; - r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; - r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_EXT_vertex_weighting */ - -#ifdef GL_GREMEDY_string_marker - -static GLboolean _glewInit_GL_GREMEDY_string_marker (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; - - return r; -} - -#endif /* GL_GREMEDY_string_marker */ - -#ifdef GL_HP_convolution_border_modes - -#endif /* GL_HP_convolution_border_modes */ - -#ifdef GL_HP_image_transform - -static GLboolean _glewInit_GL_HP_image_transform (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; - r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; - r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; - r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; - r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; - r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; - - return r; -} - -#endif /* GL_HP_image_transform */ - -#ifdef GL_HP_occlusion_test - -#endif /* GL_HP_occlusion_test */ - -#ifdef GL_HP_texture_lighting - -#endif /* GL_HP_texture_lighting */ - -#ifdef GL_IBM_cull_vertex - -#endif /* GL_IBM_cull_vertex */ - -#ifdef GL_IBM_multimode_draw_arrays - -static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; - r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; - - return r; -} - -#endif /* GL_IBM_multimode_draw_arrays */ - -#ifdef GL_IBM_rasterpos_clip - -#endif /* GL_IBM_rasterpos_clip */ - -#ifdef GL_IBM_static_data - -#endif /* GL_IBM_static_data */ - -#ifdef GL_IBM_texture_mirrored_repeat - -#endif /* GL_IBM_texture_mirrored_repeat */ - -#ifdef GL_IBM_vertex_array_lists - -static GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; - r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; - r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; - r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; - r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; - r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; - r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; - r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; - - return r; -} - -#endif /* GL_IBM_vertex_array_lists */ - -#ifdef GL_INGR_color_clamp - -#endif /* GL_INGR_color_clamp */ - -#ifdef GL_INGR_interlace_read - -#endif /* GL_INGR_interlace_read */ - -#ifdef GL_INTEL_parallel_arrays - -static GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; - r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; - r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; - r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_parallel_arrays */ - -#ifdef GL_INTEL_texture_scissor - -static GLboolean _glewInit_GL_INTEL_texture_scissor (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; - r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; - - return r; -} - -#endif /* GL_INTEL_texture_scissor */ - -#ifdef GL_KTX_buffer_region - -static GLboolean _glewInit_GL_KTX_buffer_region (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBufferRegionEnabledEXT = (PFNGLBUFFERREGIONENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabledEXT")) == NULL) || r; - r = ((glDeleteBufferRegionEXT = (PFNGLDELETEBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegionEXT")) == NULL) || r; - r = ((glDrawBufferRegionEXT = (PFNGLDRAWBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegionEXT")) == NULL) || r; - r = ((glNewBufferRegionEXT = (PFNGLNEWBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegionEXT")) == NULL) || r; - r = ((glReadBufferRegionEXT = (PFNGLREADBUFFERREGIONEXTPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegionEXT")) == NULL) || r; - - return r; -} - -#endif /* GL_KTX_buffer_region */ - -#ifdef GL_MESAX_texture_stack - -#endif /* GL_MESAX_texture_stack */ - -#ifdef GL_MESA_pack_invert - -#endif /* GL_MESA_pack_invert */ - -#ifdef GL_MESA_resize_buffers - -static GLboolean _glewInit_GL_MESA_resize_buffers (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; - - return r; -} - -#endif /* GL_MESA_resize_buffers */ - -#ifdef GL_MESA_window_pos - -static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; - r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; - r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; - r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; - r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; - r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; - r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; - r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; - r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; - r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; - r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; - r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; - r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; - r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; - r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; - r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; - r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; - r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; - r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; - r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; - r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; - r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; - r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; - r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; - - return r; -} - -#endif /* GL_MESA_window_pos */ - -#ifdef GL_MESA_ycbcr_texture - -#endif /* GL_MESA_ycbcr_texture */ - -#ifdef GL_NV_blend_square - -#endif /* GL_NV_blend_square */ - -#ifdef GL_NV_copy_depth_to_color - -#endif /* GL_NV_copy_depth_to_color */ - -#ifdef GL_NV_depth_clamp - -#endif /* GL_NV_depth_clamp */ - -#ifdef GL_NV_evaluators - -static GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; - r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; - r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; - r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; - r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; - r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; - r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; - r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; - r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_evaluators */ - -#ifdef GL_NV_fence - -static GLboolean _glewInit_GL_NV_fence (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; - r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; - r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; - r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; - r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; - r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; - r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fence */ - -#ifdef GL_NV_float_buffer - -#endif /* GL_NV_float_buffer */ - -#ifdef GL_NV_fog_distance - -#endif /* GL_NV_fog_distance */ - -#ifdef GL_NV_fragment_program - -static GLboolean _glewInit_GL_NV_fragment_program (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; - r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; - r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; - r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; - r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; - r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_fragment_program */ - -#ifdef GL_NV_fragment_program2 - -#endif /* GL_NV_fragment_program2 */ - -#ifdef GL_NV_fragment_program_option - -#endif /* GL_NV_fragment_program_option */ - -#ifdef GL_NV_half_float - -static GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; - r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; - r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; - r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; - r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; - r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; - r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; - r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; - r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; - r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; - r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; - r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; - r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; - r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; - r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; - r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; - r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; - r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; - r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; - r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; - r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; - r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; - r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; - r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; - r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; - r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; - r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; - r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; - r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; - r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; - r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; - r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; - r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; - r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; - r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; - r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; - r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; - r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; - r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; - r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; - r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; - r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; - r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; - r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; - r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; - r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_half_float */ - -#ifdef GL_NV_light_max_exponent - -#endif /* GL_NV_light_max_exponent */ - -#ifdef GL_NV_multisample_filter_hint - -#endif /* GL_NV_multisample_filter_hint */ - -#ifdef GL_NV_occlusion_query - -static GLboolean _glewInit_GL_NV_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; - r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; - r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; - r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; - r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; - r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; - r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_occlusion_query */ - -#ifdef GL_NV_packed_depth_stencil - -#endif /* GL_NV_packed_depth_stencil */ - -#ifdef GL_NV_pixel_data_range - -static GLboolean _glewInit_GL_NV_pixel_data_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; - r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_pixel_data_range */ - -#ifdef GL_NV_point_sprite - -static GLboolean _glewInit_GL_NV_point_sprite (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; - r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_point_sprite */ - -#ifdef GL_NV_primitive_restart - -static GLboolean _glewInit_GL_NV_primitive_restart (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; - r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_primitive_restart */ - -#ifdef GL_NV_register_combiners - -static GLboolean _glewInit_GL_NV_register_combiners (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; - r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; - r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; - r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; - r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; - r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; - r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; - r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; - r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; - r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; - r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; - r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; - r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_register_combiners */ - -#ifdef GL_NV_register_combiners2 - -static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; - r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_register_combiners2 */ - -#ifdef GL_NV_texgen_emboss - -#endif /* GL_NV_texgen_emboss */ - -#ifdef GL_NV_texgen_reflection - -#endif /* GL_NV_texgen_reflection */ - -#ifdef GL_NV_texture_compression_vtc - -#endif /* GL_NV_texture_compression_vtc */ - -#ifdef GL_NV_texture_env_combine4 - -#endif /* GL_NV_texture_env_combine4 */ - -#ifdef GL_NV_texture_expand_normal - -#endif /* GL_NV_texture_expand_normal */ - -#ifdef GL_NV_texture_rectangle - -#endif /* GL_NV_texture_rectangle */ - -#ifdef GL_NV_texture_shader - -#endif /* GL_NV_texture_shader */ - -#ifdef GL_NV_texture_shader2 - -#endif /* GL_NV_texture_shader2 */ - -#ifdef GL_NV_texture_shader3 - -#endif /* GL_NV_texture_shader3 */ - -#ifdef GL_NV_vertex_array_range - -static GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; - r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_array_range */ - -#ifdef GL_NV_vertex_array_range2 - -#endif /* GL_NV_vertex_array_range2 */ - -#ifdef GL_NV_vertex_program - -static GLboolean _glewInit_GL_NV_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; - r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; - r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; - r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; - r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; - r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; - r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; - r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; - r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; - r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; - r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; - r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; - r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; - r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; - r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; - r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; - r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; - r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; - r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; - r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; - r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; - r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; - r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; - r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; - r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; - r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; - r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; - r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; - r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; - r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; - r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; - r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; - r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; - r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; - r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; - r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; - r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; - r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; - r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; - r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; - r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; - r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; - r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; - r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; - r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; - r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; - r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; - r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; - r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; - r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; - r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; - r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; - r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; - r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; - r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; - r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; - r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; - r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; - r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; - r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; - r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; - r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; - r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; - r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; - - return r; -} - -#endif /* GL_NV_vertex_program */ - -#ifdef GL_NV_vertex_program1_1 - -#endif /* GL_NV_vertex_program1_1 */ - -#ifdef GL_NV_vertex_program2 - -#endif /* GL_NV_vertex_program2 */ - -#ifdef GL_NV_vertex_program2_option - -#endif /* GL_NV_vertex_program2_option */ - -#ifdef GL_NV_vertex_program3 - -#endif /* GL_NV_vertex_program3 */ - -#ifdef GL_OML_interlace - -#endif /* GL_OML_interlace */ - -#ifdef GL_OML_resample - -#endif /* GL_OML_resample */ - -#ifdef GL_OML_subsample - -#endif /* GL_OML_subsample */ - -#ifdef GL_PGI_misc_hints - -#endif /* GL_PGI_misc_hints */ - -#ifdef GL_PGI_vertex_hints - -#endif /* GL_PGI_vertex_hints */ - -#ifdef GL_REND_screen_coordinates - -#endif /* GL_REND_screen_coordinates */ - -#ifdef GL_S3_s3tc - -#endif /* GL_S3_s3tc */ - -#ifdef GL_SGIS_color_range - -#endif /* GL_SGIS_color_range */ - -#ifdef GL_SGIS_detail_texture - -static GLboolean _glewInit_GL_SGIS_detail_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; - r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_detail_texture */ - -#ifdef GL_SGIS_fog_function - -static GLboolean _glewInit_GL_SGIS_fog_function (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; - r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_fog_function */ - -#ifdef GL_SGIS_generate_mipmap - -#endif /* GL_SGIS_generate_mipmap */ - -#ifdef GL_SGIS_multisample - -static GLboolean _glewInit_GL_SGIS_multisample (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; - r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_multisample */ - -#ifdef GL_SGIS_pixel_texture - -#endif /* GL_SGIS_pixel_texture */ - -#ifdef GL_SGIS_sharpen_texture - -static GLboolean _glewInit_GL_SGIS_sharpen_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; - r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_sharpen_texture */ - -#ifdef GL_SGIS_texture4D - -static GLboolean _glewInit_GL_SGIS_texture4D (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; - r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_texture4D */ - -#ifdef GL_SGIS_texture_border_clamp - -#endif /* GL_SGIS_texture_border_clamp */ - -#ifdef GL_SGIS_texture_edge_clamp - -#endif /* GL_SGIS_texture_edge_clamp */ - -#ifdef GL_SGIS_texture_filter4 - -static GLboolean _glewInit_GL_SGIS_texture_filter4 (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; - r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIS_texture_filter4 */ - -#ifdef GL_SGIS_texture_lod - -#endif /* GL_SGIS_texture_lod */ - -#ifdef GL_SGIS_texture_select - -#endif /* GL_SGIS_texture_select */ - -#ifdef GL_SGIX_async - -static GLboolean _glewInit_GL_SGIX_async (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; - r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; - r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; - r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; - r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; - r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_async */ - -#ifdef GL_SGIX_async_histogram - -#endif /* GL_SGIX_async_histogram */ - -#ifdef GL_SGIX_async_pixel - -#endif /* GL_SGIX_async_pixel */ - -#ifdef GL_SGIX_blend_alpha_minmax - -#endif /* GL_SGIX_blend_alpha_minmax */ - -#ifdef GL_SGIX_clipmap - -#endif /* GL_SGIX_clipmap */ - -#ifdef GL_SGIX_depth_texture - -#endif /* GL_SGIX_depth_texture */ - -#ifdef GL_SGIX_flush_raster - -static GLboolean _glewInit_GL_SGIX_flush_raster (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_flush_raster */ - -#ifdef GL_SGIX_fog_offset - -#endif /* GL_SGIX_fog_offset */ - -#ifdef GL_SGIX_fog_texture - -static GLboolean _glewInit_GL_SGIX_fog_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fog_texture */ - -#ifdef GL_SGIX_fragment_specular_lighting - -static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; - r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; - r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; - r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; - r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; - r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; - r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; - r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; - r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; - r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; - r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; - r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; - r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; - r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; - r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; - r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; - r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_fragment_specular_lighting */ - -#ifdef GL_SGIX_framezoom - -static GLboolean _glewInit_GL_SGIX_framezoom (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_framezoom */ - -#ifdef GL_SGIX_interlace - -#endif /* GL_SGIX_interlace */ - -#ifdef GL_SGIX_ir_instrument1 - -#endif /* GL_SGIX_ir_instrument1 */ - -#ifdef GL_SGIX_list_priority - -#endif /* GL_SGIX_list_priority */ - -#ifdef GL_SGIX_pixel_texture - -static GLboolean _glewInit_GL_SGIX_pixel_texture (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_pixel_texture */ - -#ifdef GL_SGIX_pixel_texture_bits - -#endif /* GL_SGIX_pixel_texture_bits */ - -#ifdef GL_SGIX_reference_plane - -static GLboolean _glewInit_GL_SGIX_reference_plane (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_reference_plane */ - -#ifdef GL_SGIX_resample - -#endif /* GL_SGIX_resample */ - -#ifdef GL_SGIX_shadow - -#endif /* GL_SGIX_shadow */ - -#ifdef GL_SGIX_shadow_ambient - -#endif /* GL_SGIX_shadow_ambient */ - -#ifdef GL_SGIX_sprite - -static GLboolean _glewInit_GL_SGIX_sprite (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; - r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; - r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; - r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_sprite */ - -#ifdef GL_SGIX_tag_sample_buffer - -static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; - - return r; -} - -#endif /* GL_SGIX_tag_sample_buffer */ - -#ifdef GL_SGIX_texture_add_env - -#endif /* GL_SGIX_texture_add_env */ - -#ifdef GL_SGIX_texture_coordinate_clamp - -#endif /* GL_SGIX_texture_coordinate_clamp */ - -#ifdef GL_SGIX_texture_lod_bias - -#endif /* GL_SGIX_texture_lod_bias */ - -#ifdef GL_SGIX_texture_multi_buffer - -#endif /* GL_SGIX_texture_multi_buffer */ - -#ifdef GL_SGIX_texture_range - -#endif /* GL_SGIX_texture_range */ - -#ifdef GL_SGIX_texture_scale_bias - -#endif /* GL_SGIX_texture_scale_bias */ - -#ifdef GL_SGIX_vertex_preclip - -#endif /* GL_SGIX_vertex_preclip */ - -#ifdef GL_SGIX_vertex_preclip_hint - -#endif /* GL_SGIX_vertex_preclip_hint */ - -#ifdef GL_SGIX_ycrcb - -#endif /* GL_SGIX_ycrcb */ - -#ifdef GL_SGI_color_matrix - -#endif /* GL_SGI_color_matrix */ - -#ifdef GL_SGI_color_table - -static GLboolean _glewInit_GL_SGI_color_table (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; - r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; - r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; - r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; - r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; - r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; - r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; - - return r; -} - -#endif /* GL_SGI_color_table */ - -#ifdef GL_SGI_texture_color_table - -#endif /* GL_SGI_texture_color_table */ - -#ifdef GL_SUNX_constant_data - -static GLboolean _glewInit_GL_SUNX_constant_data (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; - - return r; -} - -#endif /* GL_SUNX_constant_data */ - -#ifdef GL_SUN_convolution_border_modes - -#endif /* GL_SUN_convolution_border_modes */ - -#ifdef GL_SUN_global_alpha - -static GLboolean _glewInit_GL_SUN_global_alpha (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; - r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; - r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; - r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; - r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_global_alpha */ - -#ifdef GL_SUN_mesh_array - -#endif /* GL_SUN_mesh_array */ - -#ifdef GL_SUN_read_video_pixels - -static GLboolean _glewInit_GL_SUN_read_video_pixels (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_read_video_pixels */ - -#ifdef GL_SUN_slice_accum - -#endif /* GL_SUN_slice_accum */ - -#ifdef GL_SUN_triangle_list - -static GLboolean _glewInit_GL_SUN_triangle_list (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; - r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; - r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; - r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; - r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; - r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; - r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_triangle_list */ - -#ifdef GL_SUN_vertex - -static GLboolean _glewInit_GL_SUN_vertex (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; - r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; - r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; - r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; - r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; - r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; - r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; - r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; - r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; - r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; - r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; - r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; - r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; - r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; - - return r; -} - -#endif /* GL_SUN_vertex */ - -#ifdef GL_WIN_phong_shading - -#endif /* GL_WIN_phong_shading */ - -#ifdef GL_WIN_specular_fog - -#endif /* GL_WIN_specular_fog */ - -#ifdef GL_WIN_swap_hint - -static GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; - - return r; -} - -#endif /* GL_WIN_swap_hint */ - -/* ------------------------------------------------------------------------- */ - -/* - * Search for name in the extensions string. Use of strstr() - * is not sufficient because extension names can be prefixes of - * other extension names. Could use strtok() but the constant - * string returned by glGetString might be in read-only memory. - */ -GLboolean glewGetExtension (const char* name) -{ - GLubyte* p; - GLubyte* end; - GLuint len = _glewStrLen((const GLubyte*)name); - p = (GLubyte*)glGetString(GL_EXTENSIONS); - if (0 == p) return GL_FALSE; - end = p + _glewStrLen(p); - while (p < end) - { - GLuint n = _glewStrCLen(p, ' '); - if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; - p += n+1; - } - return GL_FALSE; -} - -/* ------------------------------------------------------------------------- */ - -#ifndef GLEW_MX -static -#endif -GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) -{ - const GLubyte* s; - GLuint dot, major, minor; - /* query opengl version */ - s = glGetString(GL_VERSION); - dot = _glewStrCLen(s, '.'); - major = dot-1; - minor = dot+1; - if (dot == 0 || s[minor] == '\0') - return GLEW_ERROR_NO_GL_VERSION; - if (s[major] == '1' && s[minor] == '0') - { - return GLEW_ERROR_GL_VERSION_10_ONLY; - } - else - { - if (s[major] >= '2') - { - GLEW_VERSION_1_1 = GL_TRUE; - GLEW_VERSION_1_2 = GL_TRUE; - GLEW_VERSION_1_3 = GL_TRUE; - GLEW_VERSION_1_4 = GL_TRUE; - GLEW_VERSION_1_5 = GL_TRUE; - GLEW_VERSION_2_0 = GL_TRUE; - } - else - { - if (s[minor] >= '5') - { - GLEW_VERSION_1_1 = GL_TRUE; - GLEW_VERSION_1_2 = GL_TRUE; - GLEW_VERSION_1_3 = GL_TRUE; - GLEW_VERSION_1_4 = GL_TRUE; - GLEW_VERSION_1_5 = GL_TRUE; - GLEW_VERSION_2_0 = GL_FALSE; - } - if (s[minor] == '4') - { - GLEW_VERSION_1_1 = GL_TRUE; - GLEW_VERSION_1_2 = GL_TRUE; - GLEW_VERSION_1_3 = GL_TRUE; - GLEW_VERSION_1_4 = GL_TRUE; - GLEW_VERSION_1_5 = GL_FALSE; - GLEW_VERSION_2_0 = GL_FALSE; - } - if (s[minor] == '3') - { - GLEW_VERSION_1_1 = GL_TRUE; - GLEW_VERSION_1_2 = GL_TRUE; - GLEW_VERSION_1_3 = GL_TRUE; - GLEW_VERSION_1_4 = GL_FALSE; - GLEW_VERSION_1_5 = GL_FALSE; - GLEW_VERSION_2_0 = GL_FALSE; - } - if (s[minor] == '2') - { - GLEW_VERSION_1_1 = GL_TRUE; - GLEW_VERSION_1_2 = GL_TRUE; - GLEW_VERSION_1_3 = GL_FALSE; - GLEW_VERSION_1_4 = GL_FALSE; - GLEW_VERSION_1_5 = GL_FALSE; - GLEW_VERSION_2_0 = GL_FALSE; - } - if (s[minor] < '2') - { - GLEW_VERSION_1_1 = GL_TRUE; - GLEW_VERSION_1_2 = GL_FALSE; - GLEW_VERSION_1_3 = GL_FALSE; - GLEW_VERSION_1_4 = GL_FALSE; - GLEW_VERSION_1_5 = GL_FALSE; - GLEW_VERSION_2_0 = GL_FALSE; - } - } - } - /* initialize extensions */ -#ifdef GL_VERSION_1_2 - if (glewExperimental || GLEW_VERSION_1_2) GLEW_VERSION_1_2 = !_glewInit_GL_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_1_2 */ -#ifdef GL_VERSION_1_3 - if (glewExperimental || GLEW_VERSION_1_3) GLEW_VERSION_1_3 = !_glewInit_GL_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_1_3 */ -#ifdef GL_VERSION_1_4 - if (glewExperimental || GLEW_VERSION_1_4) GLEW_VERSION_1_4 = !_glewInit_GL_VERSION_1_4(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_1_4 */ -#ifdef GL_VERSION_1_5 - if (glewExperimental || GLEW_VERSION_1_5) GLEW_VERSION_1_5 = !_glewInit_GL_VERSION_1_5(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_1_5 */ -#ifdef GL_VERSION_2_0 - if (glewExperimental || GLEW_VERSION_2_0) GLEW_VERSION_2_0 = !_glewInit_GL_VERSION_2_0(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_VERSION_2_0 */ -#ifdef GL_3DFX_multisample - GLEW_3DFX_multisample = glewGetExtension("GL_3DFX_multisample"); -#endif /* GL_3DFX_multisample */ -#ifdef GL_3DFX_tbuffer - GLEW_3DFX_tbuffer = glewGetExtension("GL_3DFX_tbuffer"); - if (glewExperimental || GLEW_3DFX_tbuffer) GLEW_3DFX_tbuffer = !_glewInit_GL_3DFX_tbuffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_3DFX_tbuffer */ -#ifdef GL_3DFX_texture_compression_FXT1 - GLEW_3DFX_texture_compression_FXT1 = glewGetExtension("GL_3DFX_texture_compression_FXT1"); -#endif /* GL_3DFX_texture_compression_FXT1 */ -#ifdef GL_APPLE_client_storage - GLEW_APPLE_client_storage = glewGetExtension("GL_APPLE_client_storage"); -#endif /* GL_APPLE_client_storage */ -#ifdef GL_APPLE_element_array - GLEW_APPLE_element_array = glewGetExtension("GL_APPLE_element_array"); - if (glewExperimental || GLEW_APPLE_element_array) GLEW_APPLE_element_array = !_glewInit_GL_APPLE_element_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_element_array */ -#ifdef GL_APPLE_fence - GLEW_APPLE_fence = glewGetExtension("GL_APPLE_fence"); - if (glewExperimental || GLEW_APPLE_fence) GLEW_APPLE_fence = !_glewInit_GL_APPLE_fence(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_fence */ -#ifdef GL_APPLE_float_pixels - GLEW_APPLE_float_pixels = glewGetExtension("GL_APPLE_float_pixels"); -#endif /* GL_APPLE_float_pixels */ -#ifdef GL_APPLE_pixel_buffer - GLEW_APPLE_pixel_buffer = glewGetExtension("GL_APPLE_pixel_buffer"); -#endif /* GL_APPLE_pixel_buffer */ -#ifdef GL_APPLE_specular_vector - GLEW_APPLE_specular_vector = glewGetExtension("GL_APPLE_specular_vector"); -#endif /* GL_APPLE_specular_vector */ -#ifdef GL_APPLE_texture_range - GLEW_APPLE_texture_range = glewGetExtension("GL_APPLE_texture_range"); - if (glewExperimental || GLEW_APPLE_texture_range) GLEW_APPLE_texture_range = !_glewInit_GL_APPLE_texture_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_texture_range */ -#ifdef GL_APPLE_transform_hint - GLEW_APPLE_transform_hint = glewGetExtension("GL_APPLE_transform_hint"); -#endif /* GL_APPLE_transform_hint */ -#ifdef GL_APPLE_vertex_array_object - GLEW_APPLE_vertex_array_object = glewGetExtension("GL_APPLE_vertex_array_object"); - if (glewExperimental || GLEW_APPLE_vertex_array_object) GLEW_APPLE_vertex_array_object = !_glewInit_GL_APPLE_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_vertex_array_object */ -#ifdef GL_APPLE_vertex_array_range - GLEW_APPLE_vertex_array_range = glewGetExtension("GL_APPLE_vertex_array_range"); - if (glewExperimental || GLEW_APPLE_vertex_array_range) GLEW_APPLE_vertex_array_range = !_glewInit_GL_APPLE_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_APPLE_vertex_array_range */ -#ifdef GL_APPLE_ycbcr_422 - GLEW_APPLE_ycbcr_422 = glewGetExtension("GL_APPLE_ycbcr_422"); -#endif /* GL_APPLE_ycbcr_422 */ -#ifdef GL_ARB_color_buffer_float - GLEW_ARB_color_buffer_float = glewGetExtension("GL_ARB_color_buffer_float"); - if (glewExperimental || GLEW_ARB_color_buffer_float) GLEW_ARB_color_buffer_float = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_color_buffer_float */ -#ifdef GL_ARB_depth_texture - GLEW_ARB_depth_texture = glewGetExtension("GL_ARB_depth_texture"); -#endif /* GL_ARB_depth_texture */ -#ifdef GL_ARB_draw_buffers - GLEW_ARB_draw_buffers = glewGetExtension("GL_ARB_draw_buffers"); - if (glewExperimental || GLEW_ARB_draw_buffers) GLEW_ARB_draw_buffers = !_glewInit_GL_ARB_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_draw_buffers */ -#ifdef GL_ARB_fragment_program - GLEW_ARB_fragment_program = glewGetExtension("GL_ARB_fragment_program"); -#endif /* GL_ARB_fragment_program */ -#ifdef GL_ARB_fragment_program_shadow - GLEW_ARB_fragment_program_shadow = glewGetExtension("GL_ARB_fragment_program_shadow"); -#endif /* GL_ARB_fragment_program_shadow */ -#ifdef GL_ARB_fragment_shader - GLEW_ARB_fragment_shader = glewGetExtension("GL_ARB_fragment_shader"); -#endif /* GL_ARB_fragment_shader */ -#ifdef GL_ARB_half_float_pixel - GLEW_ARB_half_float_pixel = glewGetExtension("GL_ARB_half_float_pixel"); -#endif /* GL_ARB_half_float_pixel */ -#ifdef GL_ARB_imaging - GLEW_ARB_imaging = glewGetExtension("GL_ARB_imaging"); - if (glewExperimental || GLEW_ARB_imaging) GLEW_ARB_imaging = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_imaging */ -#ifdef GL_ARB_matrix_palette - GLEW_ARB_matrix_palette = glewGetExtension("GL_ARB_matrix_palette"); - if (glewExperimental || GLEW_ARB_matrix_palette) GLEW_ARB_matrix_palette = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_matrix_palette */ -#ifdef GL_ARB_multisample - GLEW_ARB_multisample = glewGetExtension("GL_ARB_multisample"); - if (glewExperimental || GLEW_ARB_multisample) GLEW_ARB_multisample = !_glewInit_GL_ARB_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_multisample */ -#ifdef GL_ARB_multitexture - GLEW_ARB_multitexture = glewGetExtension("GL_ARB_multitexture"); - if (glewExperimental || GLEW_ARB_multitexture) GLEW_ARB_multitexture = !_glewInit_GL_ARB_multitexture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_multitexture */ -#ifdef GL_ARB_occlusion_query - GLEW_ARB_occlusion_query = glewGetExtension("GL_ARB_occlusion_query"); - if (glewExperimental || GLEW_ARB_occlusion_query) GLEW_ARB_occlusion_query = !_glewInit_GL_ARB_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_occlusion_query */ -#ifdef GL_ARB_pixel_buffer_object - GLEW_ARB_pixel_buffer_object = glewGetExtension("GL_ARB_pixel_buffer_object"); -#endif /* GL_ARB_pixel_buffer_object */ -#ifdef GL_ARB_point_parameters - GLEW_ARB_point_parameters = glewGetExtension("GL_ARB_point_parameters"); - if (glewExperimental || GLEW_ARB_point_parameters) GLEW_ARB_point_parameters = !_glewInit_GL_ARB_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_point_parameters */ -#ifdef GL_ARB_point_sprite - GLEW_ARB_point_sprite = glewGetExtension("GL_ARB_point_sprite"); -#endif /* GL_ARB_point_sprite */ -#ifdef GL_ARB_shader_objects - GLEW_ARB_shader_objects = glewGetExtension("GL_ARB_shader_objects"); - if (glewExperimental || GLEW_ARB_shader_objects) GLEW_ARB_shader_objects = !_glewInit_GL_ARB_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_shader_objects */ -#ifdef GL_ARB_shading_language_100 - GLEW_ARB_shading_language_100 = glewGetExtension("GL_ARB_shading_language_100"); -#endif /* GL_ARB_shading_language_100 */ -#ifdef GL_ARB_shadow - GLEW_ARB_shadow = glewGetExtension("GL_ARB_shadow"); -#endif /* GL_ARB_shadow */ -#ifdef GL_ARB_shadow_ambient - GLEW_ARB_shadow_ambient = glewGetExtension("GL_ARB_shadow_ambient"); -#endif /* GL_ARB_shadow_ambient */ -#ifdef GL_ARB_texture_border_clamp - GLEW_ARB_texture_border_clamp = glewGetExtension("GL_ARB_texture_border_clamp"); -#endif /* GL_ARB_texture_border_clamp */ -#ifdef GL_ARB_texture_compression - GLEW_ARB_texture_compression = glewGetExtension("GL_ARB_texture_compression"); - if (glewExperimental || GLEW_ARB_texture_compression) GLEW_ARB_texture_compression = !_glewInit_GL_ARB_texture_compression(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_texture_compression */ -#ifdef GL_ARB_texture_cube_map - GLEW_ARB_texture_cube_map = glewGetExtension("GL_ARB_texture_cube_map"); -#endif /* GL_ARB_texture_cube_map */ -#ifdef GL_ARB_texture_env_add - GLEW_ARB_texture_env_add = glewGetExtension("GL_ARB_texture_env_add"); -#endif /* GL_ARB_texture_env_add */ -#ifdef GL_ARB_texture_env_combine - GLEW_ARB_texture_env_combine = glewGetExtension("GL_ARB_texture_env_combine"); -#endif /* GL_ARB_texture_env_combine */ -#ifdef GL_ARB_texture_env_crossbar - GLEW_ARB_texture_env_crossbar = glewGetExtension("GL_ARB_texture_env_crossbar"); -#endif /* GL_ARB_texture_env_crossbar */ -#ifdef GL_ARB_texture_env_dot3 - GLEW_ARB_texture_env_dot3 = glewGetExtension("GL_ARB_texture_env_dot3"); -#endif /* GL_ARB_texture_env_dot3 */ -#ifdef GL_ARB_texture_float - GLEW_ARB_texture_float = glewGetExtension("GL_ARB_texture_float"); -#endif /* GL_ARB_texture_float */ -#ifdef GL_ARB_texture_mirrored_repeat - GLEW_ARB_texture_mirrored_repeat = glewGetExtension("GL_ARB_texture_mirrored_repeat"); -#endif /* GL_ARB_texture_mirrored_repeat */ -#ifdef GL_ARB_texture_non_power_of_two - GLEW_ARB_texture_non_power_of_two = glewGetExtension("GL_ARB_texture_non_power_of_two"); -#endif /* GL_ARB_texture_non_power_of_two */ -#ifdef GL_ARB_texture_rectangle - GLEW_ARB_texture_rectangle = glewGetExtension("GL_ARB_texture_rectangle"); -#endif /* GL_ARB_texture_rectangle */ -#ifdef GL_ARB_transpose_matrix - GLEW_ARB_transpose_matrix = glewGetExtension("GL_ARB_transpose_matrix"); - if (glewExperimental || GLEW_ARB_transpose_matrix) GLEW_ARB_transpose_matrix = !_glewInit_GL_ARB_transpose_matrix(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_transpose_matrix */ -#ifdef GL_ARB_vertex_blend - GLEW_ARB_vertex_blend = glewGetExtension("GL_ARB_vertex_blend"); - if (glewExperimental || GLEW_ARB_vertex_blend) GLEW_ARB_vertex_blend = !_glewInit_GL_ARB_vertex_blend(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_blend */ -#ifdef GL_ARB_vertex_buffer_object - GLEW_ARB_vertex_buffer_object = glewGetExtension("GL_ARB_vertex_buffer_object"); - if (glewExperimental || GLEW_ARB_vertex_buffer_object) GLEW_ARB_vertex_buffer_object = !_glewInit_GL_ARB_vertex_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_buffer_object */ -#ifdef GL_ARB_vertex_program - GLEW_ARB_vertex_program = glewGetExtension("GL_ARB_vertex_program"); - if (glewExperimental || GLEW_ARB_vertex_program) GLEW_ARB_vertex_program = !_glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_vertex_program */ -#ifdef GL_ARB_vertex_shader - GLEW_ARB_vertex_shader = glewGetExtension("GL_ARB_vertex_shader"); - if (glewExperimental || GLEW_ARB_vertex_shader) { GLEW_ARB_vertex_shader = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); _glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); } -#endif /* GL_ARB_vertex_shader */ -#ifdef GL_ARB_window_pos - GLEW_ARB_window_pos = glewGetExtension("GL_ARB_window_pos"); - if (glewExperimental || GLEW_ARB_window_pos) GLEW_ARB_window_pos = !_glewInit_GL_ARB_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ARB_window_pos */ -#ifdef GL_ATIX_point_sprites - GLEW_ATIX_point_sprites = glewGetExtension("GL_ATIX_point_sprites"); -#endif /* GL_ATIX_point_sprites */ -#ifdef GL_ATIX_texture_env_combine3 - GLEW_ATIX_texture_env_combine3 = glewGetExtension("GL_ATIX_texture_env_combine3"); -#endif /* GL_ATIX_texture_env_combine3 */ -#ifdef GL_ATIX_texture_env_route - GLEW_ATIX_texture_env_route = glewGetExtension("GL_ATIX_texture_env_route"); -#endif /* GL_ATIX_texture_env_route */ -#ifdef GL_ATIX_vertex_shader_output_point_size - GLEW_ATIX_vertex_shader_output_point_size = glewGetExtension("GL_ATIX_vertex_shader_output_point_size"); -#endif /* GL_ATIX_vertex_shader_output_point_size */ -#ifdef GL_ATI_draw_buffers - GLEW_ATI_draw_buffers = glewGetExtension("GL_ATI_draw_buffers"); - if (glewExperimental || GLEW_ATI_draw_buffers) GLEW_ATI_draw_buffers = !_glewInit_GL_ATI_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_draw_buffers */ -#ifdef GL_ATI_element_array - GLEW_ATI_element_array = glewGetExtension("GL_ATI_element_array"); - if (glewExperimental || GLEW_ATI_element_array) GLEW_ATI_element_array = !_glewInit_GL_ATI_element_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_element_array */ -#ifdef GL_ATI_envmap_bumpmap - GLEW_ATI_envmap_bumpmap = glewGetExtension("GL_ATI_envmap_bumpmap"); - if (glewExperimental || GLEW_ATI_envmap_bumpmap) GLEW_ATI_envmap_bumpmap = !_glewInit_GL_ATI_envmap_bumpmap(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_envmap_bumpmap */ -#ifdef GL_ATI_fragment_shader - GLEW_ATI_fragment_shader = glewGetExtension("GL_ATI_fragment_shader"); - if (glewExperimental || GLEW_ATI_fragment_shader) GLEW_ATI_fragment_shader = !_glewInit_GL_ATI_fragment_shader(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_fragment_shader */ -#ifdef GL_ATI_map_object_buffer - GLEW_ATI_map_object_buffer = glewGetExtension("GL_ATI_map_object_buffer"); - if (glewExperimental || GLEW_ATI_map_object_buffer) GLEW_ATI_map_object_buffer = !_glewInit_GL_ATI_map_object_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_map_object_buffer */ -#ifdef GL_ATI_pn_triangles - GLEW_ATI_pn_triangles = glewGetExtension("GL_ATI_pn_triangles"); - if (glewExperimental || GLEW_ATI_pn_triangles) GLEW_ATI_pn_triangles = !_glewInit_GL_ATI_pn_triangles(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_pn_triangles */ -#ifdef GL_ATI_separate_stencil - GLEW_ATI_separate_stencil = glewGetExtension("GL_ATI_separate_stencil"); - if (glewExperimental || GLEW_ATI_separate_stencil) GLEW_ATI_separate_stencil = !_glewInit_GL_ATI_separate_stencil(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_separate_stencil */ -#ifdef GL_ATI_text_fragment_shader - GLEW_ATI_text_fragment_shader = glewGetExtension("GL_ATI_text_fragment_shader"); -#endif /* GL_ATI_text_fragment_shader */ -#ifdef GL_ATI_texture_compression_3dc - GLEW_ATI_texture_compression_3dc = glewGetExtension("GL_ATI_texture_compression_3dc"); -#endif /* GL_ATI_texture_compression_3dc */ -#ifdef GL_ATI_texture_env_combine3 - GLEW_ATI_texture_env_combine3 = glewGetExtension("GL_ATI_texture_env_combine3"); -#endif /* GL_ATI_texture_env_combine3 */ -#ifdef GL_ATI_texture_float - GLEW_ATI_texture_float = glewGetExtension("GL_ATI_texture_float"); -#endif /* GL_ATI_texture_float */ -#ifdef GL_ATI_texture_mirror_once - GLEW_ATI_texture_mirror_once = glewGetExtension("GL_ATI_texture_mirror_once"); -#endif /* GL_ATI_texture_mirror_once */ -#ifdef GL_ATI_vertex_array_object - GLEW_ATI_vertex_array_object = glewGetExtension("GL_ATI_vertex_array_object"); - if (glewExperimental || GLEW_ATI_vertex_array_object) GLEW_ATI_vertex_array_object = !_glewInit_GL_ATI_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_vertex_array_object */ -#ifdef GL_ATI_vertex_attrib_array_object - GLEW_ATI_vertex_attrib_array_object = glewGetExtension("GL_ATI_vertex_attrib_array_object"); - if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) GLEW_ATI_vertex_attrib_array_object = !_glewInit_GL_ATI_vertex_attrib_array_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_vertex_attrib_array_object */ -#ifdef GL_ATI_vertex_streams - GLEW_ATI_vertex_streams = glewGetExtension("GL_ATI_vertex_streams"); - if (glewExperimental || GLEW_ATI_vertex_streams) GLEW_ATI_vertex_streams = !_glewInit_GL_ATI_vertex_streams(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_ATI_vertex_streams */ -#ifdef GL_EXT_422_pixels - GLEW_EXT_422_pixels = glewGetExtension("GL_EXT_422_pixels"); -#endif /* GL_EXT_422_pixels */ -#ifdef GL_EXT_Cg_shader - GLEW_EXT_Cg_shader = glewGetExtension("GL_EXT_Cg_shader"); -#endif /* GL_EXT_Cg_shader */ -#ifdef GL_EXT_abgr - GLEW_EXT_abgr = glewGetExtension("GL_EXT_abgr"); -#endif /* GL_EXT_abgr */ -#ifdef GL_EXT_bgra - GLEW_EXT_bgra = glewGetExtension("GL_EXT_bgra"); -#endif /* GL_EXT_bgra */ -#ifdef GL_EXT_blend_color - GLEW_EXT_blend_color = glewGetExtension("GL_EXT_blend_color"); - if (glewExperimental || GLEW_EXT_blend_color) GLEW_EXT_blend_color = !_glewInit_GL_EXT_blend_color(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_blend_color */ -#ifdef GL_EXT_blend_equation_separate - GLEW_EXT_blend_equation_separate = glewGetExtension("GL_EXT_blend_equation_separate"); - if (glewExperimental || GLEW_EXT_blend_equation_separate) GLEW_EXT_blend_equation_separate = !_glewInit_GL_EXT_blend_equation_separate(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_blend_equation_separate */ -#ifdef GL_EXT_blend_func_separate - GLEW_EXT_blend_func_separate = glewGetExtension("GL_EXT_blend_func_separate"); - if (glewExperimental || GLEW_EXT_blend_func_separate) GLEW_EXT_blend_func_separate = !_glewInit_GL_EXT_blend_func_separate(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_blend_func_separate */ -#ifdef GL_EXT_blend_logic_op - GLEW_EXT_blend_logic_op = glewGetExtension("GL_EXT_blend_logic_op"); -#endif /* GL_EXT_blend_logic_op */ -#ifdef GL_EXT_blend_minmax - GLEW_EXT_blend_minmax = glewGetExtension("GL_EXT_blend_minmax"); - if (glewExperimental || GLEW_EXT_blend_minmax) GLEW_EXT_blend_minmax = !_glewInit_GL_EXT_blend_minmax(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_blend_minmax */ -#ifdef GL_EXT_blend_subtract - GLEW_EXT_blend_subtract = glewGetExtension("GL_EXT_blend_subtract"); -#endif /* GL_EXT_blend_subtract */ -#ifdef GL_EXT_clip_volume_hint - GLEW_EXT_clip_volume_hint = glewGetExtension("GL_EXT_clip_volume_hint"); -#endif /* GL_EXT_clip_volume_hint */ -#ifdef GL_EXT_cmyka - GLEW_EXT_cmyka = glewGetExtension("GL_EXT_cmyka"); -#endif /* GL_EXT_cmyka */ -#ifdef GL_EXT_color_subtable - GLEW_EXT_color_subtable = glewGetExtension("GL_EXT_color_subtable"); - if (glewExperimental || GLEW_EXT_color_subtable) GLEW_EXT_color_subtable = !_glewInit_GL_EXT_color_subtable(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_color_subtable */ -#ifdef GL_EXT_compiled_vertex_array - GLEW_EXT_compiled_vertex_array = glewGetExtension("GL_EXT_compiled_vertex_array"); - if (glewExperimental || GLEW_EXT_compiled_vertex_array) GLEW_EXT_compiled_vertex_array = !_glewInit_GL_EXT_compiled_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_compiled_vertex_array */ -#ifdef GL_EXT_convolution - GLEW_EXT_convolution = glewGetExtension("GL_EXT_convolution"); - if (glewExperimental || GLEW_EXT_convolution) GLEW_EXT_convolution = !_glewInit_GL_EXT_convolution(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_convolution */ -#ifdef GL_EXT_coordinate_frame - GLEW_EXT_coordinate_frame = glewGetExtension("GL_EXT_coordinate_frame"); - if (glewExperimental || GLEW_EXT_coordinate_frame) GLEW_EXT_coordinate_frame = !_glewInit_GL_EXT_coordinate_frame(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_coordinate_frame */ -#ifdef GL_EXT_copy_texture - GLEW_EXT_copy_texture = glewGetExtension("GL_EXT_copy_texture"); - if (glewExperimental || GLEW_EXT_copy_texture) GLEW_EXT_copy_texture = !_glewInit_GL_EXT_copy_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_copy_texture */ -#ifdef GL_EXT_cull_vertex - GLEW_EXT_cull_vertex = glewGetExtension("GL_EXT_cull_vertex"); - if (glewExperimental || GLEW_EXT_cull_vertex) GLEW_EXT_cull_vertex = !_glewInit_GL_EXT_cull_vertex(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_cull_vertex */ -#ifdef GL_EXT_depth_bounds_test - GLEW_EXT_depth_bounds_test = glewGetExtension("GL_EXT_depth_bounds_test"); - if (glewExperimental || GLEW_EXT_depth_bounds_test) GLEW_EXT_depth_bounds_test = !_glewInit_GL_EXT_depth_bounds_test(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_depth_bounds_test */ -#ifdef GL_EXT_draw_range_elements - GLEW_EXT_draw_range_elements = glewGetExtension("GL_EXT_draw_range_elements"); - if (glewExperimental || GLEW_EXT_draw_range_elements) GLEW_EXT_draw_range_elements = !_glewInit_GL_EXT_draw_range_elements(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_draw_range_elements */ -#ifdef GL_EXT_fog_coord - GLEW_EXT_fog_coord = glewGetExtension("GL_EXT_fog_coord"); - if (glewExperimental || GLEW_EXT_fog_coord) GLEW_EXT_fog_coord = !_glewInit_GL_EXT_fog_coord(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_fog_coord */ -#ifdef GL_EXT_fragment_lighting - GLEW_EXT_fragment_lighting = glewGetExtension("GL_EXT_fragment_lighting"); - if (glewExperimental || GLEW_EXT_fragment_lighting) GLEW_EXT_fragment_lighting = !_glewInit_GL_EXT_fragment_lighting(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_fragment_lighting */ -#ifdef GL_EXT_framebuffer_blit - GLEW_EXT_framebuffer_blit = glewGetExtension("GL_EXT_framebuffer_blit"); - if (glewExperimental || GLEW_EXT_framebuffer_blit) GLEW_EXT_framebuffer_blit = !_glewInit_GL_EXT_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_framebuffer_blit */ -#ifdef GL_EXT_framebuffer_multisample - GLEW_EXT_framebuffer_multisample = glewGetExtension("GL_EXT_framebuffer_multisample"); - if (glewExperimental || GLEW_EXT_framebuffer_multisample) GLEW_EXT_framebuffer_multisample = !_glewInit_GL_EXT_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_framebuffer_multisample */ -#ifdef GL_EXT_framebuffer_object - GLEW_EXT_framebuffer_object = glewGetExtension("GL_EXT_framebuffer_object"); - if (glewExperimental || GLEW_EXT_framebuffer_object) GLEW_EXT_framebuffer_object = !_glewInit_GL_EXT_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_framebuffer_object */ -#ifdef GL_EXT_histogram - GLEW_EXT_histogram = glewGetExtension("GL_EXT_histogram"); - if (glewExperimental || GLEW_EXT_histogram) GLEW_EXT_histogram = !_glewInit_GL_EXT_histogram(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_histogram */ -#ifdef GL_EXT_index_array_formats - GLEW_EXT_index_array_formats = glewGetExtension("GL_EXT_index_array_formats"); -#endif /* GL_EXT_index_array_formats */ -#ifdef GL_EXT_index_func - GLEW_EXT_index_func = glewGetExtension("GL_EXT_index_func"); - if (glewExperimental || GLEW_EXT_index_func) GLEW_EXT_index_func = !_glewInit_GL_EXT_index_func(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_index_func */ -#ifdef GL_EXT_index_material - GLEW_EXT_index_material = glewGetExtension("GL_EXT_index_material"); - if (glewExperimental || GLEW_EXT_index_material) GLEW_EXT_index_material = !_glewInit_GL_EXT_index_material(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_index_material */ -#ifdef GL_EXT_index_texture - GLEW_EXT_index_texture = glewGetExtension("GL_EXT_index_texture"); -#endif /* GL_EXT_index_texture */ -#ifdef GL_EXT_light_texture - GLEW_EXT_light_texture = glewGetExtension("GL_EXT_light_texture"); - if (glewExperimental || GLEW_EXT_light_texture) GLEW_EXT_light_texture = !_glewInit_GL_EXT_light_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_light_texture */ -#ifdef GL_EXT_misc_attribute - GLEW_EXT_misc_attribute = glewGetExtension("GL_EXT_misc_attribute"); -#endif /* GL_EXT_misc_attribute */ -#ifdef GL_EXT_multi_draw_arrays - GLEW_EXT_multi_draw_arrays = glewGetExtension("GL_EXT_multi_draw_arrays"); - if (glewExperimental || GLEW_EXT_multi_draw_arrays) GLEW_EXT_multi_draw_arrays = !_glewInit_GL_EXT_multi_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_multi_draw_arrays */ -#ifdef GL_EXT_multisample - GLEW_EXT_multisample = glewGetExtension("GL_EXT_multisample"); - if (glewExperimental || GLEW_EXT_multisample) GLEW_EXT_multisample = !_glewInit_GL_EXT_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_multisample */ -#ifdef GL_EXT_packed_depth_stencil - GLEW_EXT_packed_depth_stencil = glewGetExtension("GL_EXT_packed_depth_stencil"); -#endif /* GL_EXT_packed_depth_stencil */ -#ifdef GL_EXT_packed_pixels - GLEW_EXT_packed_pixels = glewGetExtension("GL_EXT_packed_pixels"); -#endif /* GL_EXT_packed_pixels */ -#ifdef GL_EXT_paletted_texture - GLEW_EXT_paletted_texture = glewGetExtension("GL_EXT_paletted_texture"); - if (glewExperimental || GLEW_EXT_paletted_texture) GLEW_EXT_paletted_texture = !_glewInit_GL_EXT_paletted_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_paletted_texture */ -#ifdef GL_EXT_pixel_buffer_object - GLEW_EXT_pixel_buffer_object = glewGetExtension("GL_EXT_pixel_buffer_object"); -#endif /* GL_EXT_pixel_buffer_object */ -#ifdef GL_EXT_pixel_transform - GLEW_EXT_pixel_transform = glewGetExtension("GL_EXT_pixel_transform"); - if (glewExperimental || GLEW_EXT_pixel_transform) GLEW_EXT_pixel_transform = !_glewInit_GL_EXT_pixel_transform(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_pixel_transform */ -#ifdef GL_EXT_pixel_transform_color_table - GLEW_EXT_pixel_transform_color_table = glewGetExtension("GL_EXT_pixel_transform_color_table"); -#endif /* GL_EXT_pixel_transform_color_table */ -#ifdef GL_EXT_point_parameters - GLEW_EXT_point_parameters = glewGetExtension("GL_EXT_point_parameters"); - if (glewExperimental || GLEW_EXT_point_parameters) GLEW_EXT_point_parameters = !_glewInit_GL_EXT_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_point_parameters */ -#ifdef GL_EXT_polygon_offset - GLEW_EXT_polygon_offset = glewGetExtension("GL_EXT_polygon_offset"); - if (glewExperimental || GLEW_EXT_polygon_offset) GLEW_EXT_polygon_offset = !_glewInit_GL_EXT_polygon_offset(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_polygon_offset */ -#ifdef GL_EXT_rescale_normal - GLEW_EXT_rescale_normal = glewGetExtension("GL_EXT_rescale_normal"); -#endif /* GL_EXT_rescale_normal */ -#ifdef GL_EXT_scene_marker - GLEW_EXT_scene_marker = glewGetExtension("GL_EXT_scene_marker"); - if (glewExperimental || GLEW_EXT_scene_marker) GLEW_EXT_scene_marker = !_glewInit_GL_EXT_scene_marker(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_scene_marker */ -#ifdef GL_EXT_secondary_color - GLEW_EXT_secondary_color = glewGetExtension("GL_EXT_secondary_color"); - if (glewExperimental || GLEW_EXT_secondary_color) GLEW_EXT_secondary_color = !_glewInit_GL_EXT_secondary_color(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_secondary_color */ -#ifdef GL_EXT_separate_specular_color - GLEW_EXT_separate_specular_color = glewGetExtension("GL_EXT_separate_specular_color"); -#endif /* GL_EXT_separate_specular_color */ -#ifdef GL_EXT_shadow_funcs - GLEW_EXT_shadow_funcs = glewGetExtension("GL_EXT_shadow_funcs"); -#endif /* GL_EXT_shadow_funcs */ -#ifdef GL_EXT_shared_texture_palette - GLEW_EXT_shared_texture_palette = glewGetExtension("GL_EXT_shared_texture_palette"); -#endif /* GL_EXT_shared_texture_palette */ -#ifdef GL_EXT_stencil_clear_tag - GLEW_EXT_stencil_clear_tag = glewGetExtension("GL_EXT_stencil_clear_tag"); -#endif /* GL_EXT_stencil_clear_tag */ -#ifdef GL_EXT_stencil_two_side - GLEW_EXT_stencil_two_side = glewGetExtension("GL_EXT_stencil_two_side"); - if (glewExperimental || GLEW_EXT_stencil_two_side) GLEW_EXT_stencil_two_side = !_glewInit_GL_EXT_stencil_two_side(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_stencil_two_side */ -#ifdef GL_EXT_stencil_wrap - GLEW_EXT_stencil_wrap = glewGetExtension("GL_EXT_stencil_wrap"); -#endif /* GL_EXT_stencil_wrap */ -#ifdef GL_EXT_subtexture - GLEW_EXT_subtexture = glewGetExtension("GL_EXT_subtexture"); - if (glewExperimental || GLEW_EXT_subtexture) GLEW_EXT_subtexture = !_glewInit_GL_EXT_subtexture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_subtexture */ -#ifdef GL_EXT_texture - GLEW_EXT_texture = glewGetExtension("GL_EXT_texture"); -#endif /* GL_EXT_texture */ -#ifdef GL_EXT_texture3D - GLEW_EXT_texture3D = glewGetExtension("GL_EXT_texture3D"); - if (glewExperimental || GLEW_EXT_texture3D) GLEW_EXT_texture3D = !_glewInit_GL_EXT_texture3D(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_texture3D */ -#ifdef GL_EXT_texture_compression_dxt1 - GLEW_EXT_texture_compression_dxt1 = glewGetExtension("GL_EXT_texture_compression_dxt1"); -#endif /* GL_EXT_texture_compression_dxt1 */ -#ifdef GL_EXT_texture_compression_s3tc - GLEW_EXT_texture_compression_s3tc = glewGetExtension("GL_EXT_texture_compression_s3tc"); -#endif /* GL_EXT_texture_compression_s3tc */ -#ifdef GL_EXT_texture_cube_map - GLEW_EXT_texture_cube_map = glewGetExtension("GL_EXT_texture_cube_map"); -#endif /* GL_EXT_texture_cube_map */ -#ifdef GL_EXT_texture_edge_clamp - GLEW_EXT_texture_edge_clamp = glewGetExtension("GL_EXT_texture_edge_clamp"); -#endif /* GL_EXT_texture_edge_clamp */ -#ifdef GL_EXT_texture_env - GLEW_EXT_texture_env = glewGetExtension("GL_EXT_texture_env"); -#endif /* GL_EXT_texture_env */ -#ifdef GL_EXT_texture_env_add - GLEW_EXT_texture_env_add = glewGetExtension("GL_EXT_texture_env_add"); -#endif /* GL_EXT_texture_env_add */ -#ifdef GL_EXT_texture_env_combine - GLEW_EXT_texture_env_combine = glewGetExtension("GL_EXT_texture_env_combine"); -#endif /* GL_EXT_texture_env_combine */ -#ifdef GL_EXT_texture_env_dot3 - GLEW_EXT_texture_env_dot3 = glewGetExtension("GL_EXT_texture_env_dot3"); -#endif /* GL_EXT_texture_env_dot3 */ -#ifdef GL_EXT_texture_filter_anisotropic - GLEW_EXT_texture_filter_anisotropic = glewGetExtension("GL_EXT_texture_filter_anisotropic"); -#endif /* GL_EXT_texture_filter_anisotropic */ -#ifdef GL_EXT_texture_lod_bias - GLEW_EXT_texture_lod_bias = glewGetExtension("GL_EXT_texture_lod_bias"); -#endif /* GL_EXT_texture_lod_bias */ -#ifdef GL_EXT_texture_mirror_clamp - GLEW_EXT_texture_mirror_clamp = glewGetExtension("GL_EXT_texture_mirror_clamp"); -#endif /* GL_EXT_texture_mirror_clamp */ -#ifdef GL_EXT_texture_object - GLEW_EXT_texture_object = glewGetExtension("GL_EXT_texture_object"); - if (glewExperimental || GLEW_EXT_texture_object) GLEW_EXT_texture_object = !_glewInit_GL_EXT_texture_object(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_texture_object */ -#ifdef GL_EXT_texture_perturb_normal - GLEW_EXT_texture_perturb_normal = glewGetExtension("GL_EXT_texture_perturb_normal"); - if (glewExperimental || GLEW_EXT_texture_perturb_normal) GLEW_EXT_texture_perturb_normal = !_glewInit_GL_EXT_texture_perturb_normal(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_texture_perturb_normal */ -#ifdef GL_EXT_texture_rectangle - GLEW_EXT_texture_rectangle = glewGetExtension("GL_EXT_texture_rectangle"); -#endif /* GL_EXT_texture_rectangle */ -#ifdef GL_EXT_texture_sRGB - GLEW_EXT_texture_sRGB = glewGetExtension("GL_EXT_texture_sRGB"); -#endif /* GL_EXT_texture_sRGB */ -#ifdef GL_EXT_vertex_array - GLEW_EXT_vertex_array = glewGetExtension("GL_EXT_vertex_array"); - if (glewExperimental || GLEW_EXT_vertex_array) GLEW_EXT_vertex_array = !_glewInit_GL_EXT_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_vertex_array */ -#ifdef GL_EXT_vertex_shader - GLEW_EXT_vertex_shader = glewGetExtension("GL_EXT_vertex_shader"); - if (glewExperimental || GLEW_EXT_vertex_shader) GLEW_EXT_vertex_shader = !_glewInit_GL_EXT_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_vertex_shader */ -#ifdef GL_EXT_vertex_weighting - GLEW_EXT_vertex_weighting = glewGetExtension("GL_EXT_vertex_weighting"); - if (glewExperimental || GLEW_EXT_vertex_weighting) GLEW_EXT_vertex_weighting = !_glewInit_GL_EXT_vertex_weighting(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_EXT_vertex_weighting */ -#ifdef GL_GREMEDY_string_marker - GLEW_GREMEDY_string_marker = glewGetExtension("GL_GREMEDY_string_marker"); - if (glewExperimental || GLEW_GREMEDY_string_marker) GLEW_GREMEDY_string_marker = !_glewInit_GL_GREMEDY_string_marker(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_GREMEDY_string_marker */ -#ifdef GL_HP_convolution_border_modes - GLEW_HP_convolution_border_modes = glewGetExtension("GL_HP_convolution_border_modes"); -#endif /* GL_HP_convolution_border_modes */ -#ifdef GL_HP_image_transform - GLEW_HP_image_transform = glewGetExtension("GL_HP_image_transform"); - if (glewExperimental || GLEW_HP_image_transform) GLEW_HP_image_transform = !_glewInit_GL_HP_image_transform(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_HP_image_transform */ -#ifdef GL_HP_occlusion_test - GLEW_HP_occlusion_test = glewGetExtension("GL_HP_occlusion_test"); -#endif /* GL_HP_occlusion_test */ -#ifdef GL_HP_texture_lighting - GLEW_HP_texture_lighting = glewGetExtension("GL_HP_texture_lighting"); -#endif /* GL_HP_texture_lighting */ -#ifdef GL_IBM_cull_vertex - GLEW_IBM_cull_vertex = glewGetExtension("GL_IBM_cull_vertex"); -#endif /* GL_IBM_cull_vertex */ -#ifdef GL_IBM_multimode_draw_arrays - GLEW_IBM_multimode_draw_arrays = glewGetExtension("GL_IBM_multimode_draw_arrays"); - if (glewExperimental || GLEW_IBM_multimode_draw_arrays) GLEW_IBM_multimode_draw_arrays = !_glewInit_GL_IBM_multimode_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_IBM_multimode_draw_arrays */ -#ifdef GL_IBM_rasterpos_clip - GLEW_IBM_rasterpos_clip = glewGetExtension("GL_IBM_rasterpos_clip"); -#endif /* GL_IBM_rasterpos_clip */ -#ifdef GL_IBM_static_data - GLEW_IBM_static_data = glewGetExtension("GL_IBM_static_data"); -#endif /* GL_IBM_static_data */ -#ifdef GL_IBM_texture_mirrored_repeat - GLEW_IBM_texture_mirrored_repeat = glewGetExtension("GL_IBM_texture_mirrored_repeat"); -#endif /* GL_IBM_texture_mirrored_repeat */ -#ifdef GL_IBM_vertex_array_lists - GLEW_IBM_vertex_array_lists = glewGetExtension("GL_IBM_vertex_array_lists"); - if (glewExperimental || GLEW_IBM_vertex_array_lists) GLEW_IBM_vertex_array_lists = !_glewInit_GL_IBM_vertex_array_lists(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_IBM_vertex_array_lists */ -#ifdef GL_INGR_color_clamp - GLEW_INGR_color_clamp = glewGetExtension("GL_INGR_color_clamp"); -#endif /* GL_INGR_color_clamp */ -#ifdef GL_INGR_interlace_read - GLEW_INGR_interlace_read = glewGetExtension("GL_INGR_interlace_read"); -#endif /* GL_INGR_interlace_read */ -#ifdef GL_INTEL_parallel_arrays - GLEW_INTEL_parallel_arrays = glewGetExtension("GL_INTEL_parallel_arrays"); - if (glewExperimental || GLEW_INTEL_parallel_arrays) GLEW_INTEL_parallel_arrays = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_INTEL_parallel_arrays */ -#ifdef GL_INTEL_texture_scissor - GLEW_INTEL_texture_scissor = glewGetExtension("GL_INTEL_texture_scissor"); - if (glewExperimental || GLEW_INTEL_texture_scissor) GLEW_INTEL_texture_scissor = !_glewInit_GL_INTEL_texture_scissor(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_INTEL_texture_scissor */ -#ifdef GL_KTX_buffer_region - GLEW_KTX_buffer_region = glewGetExtension("GL_KTX_buffer_region"); - if (glewExperimental || GLEW_KTX_buffer_region) GLEW_KTX_buffer_region = !_glewInit_GL_KTX_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_KTX_buffer_region */ -#ifdef GL_MESAX_texture_stack - GLEW_MESAX_texture_stack = glewGetExtension("GL_MESAX_texture_stack"); -#endif /* GL_MESAX_texture_stack */ -#ifdef GL_MESA_pack_invert - GLEW_MESA_pack_invert = glewGetExtension("GL_MESA_pack_invert"); -#endif /* GL_MESA_pack_invert */ -#ifdef GL_MESA_resize_buffers - GLEW_MESA_resize_buffers = glewGetExtension("GL_MESA_resize_buffers"); - if (glewExperimental || GLEW_MESA_resize_buffers) GLEW_MESA_resize_buffers = !_glewInit_GL_MESA_resize_buffers(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_MESA_resize_buffers */ -#ifdef GL_MESA_window_pos - GLEW_MESA_window_pos = glewGetExtension("GL_MESA_window_pos"); - if (glewExperimental || GLEW_MESA_window_pos) GLEW_MESA_window_pos = !_glewInit_GL_MESA_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_MESA_window_pos */ -#ifdef GL_MESA_ycbcr_texture - GLEW_MESA_ycbcr_texture = glewGetExtension("GL_MESA_ycbcr_texture"); -#endif /* GL_MESA_ycbcr_texture */ -#ifdef GL_NV_blend_square - GLEW_NV_blend_square = glewGetExtension("GL_NV_blend_square"); -#endif /* GL_NV_blend_square */ -#ifdef GL_NV_copy_depth_to_color - GLEW_NV_copy_depth_to_color = glewGetExtension("GL_NV_copy_depth_to_color"); -#endif /* GL_NV_copy_depth_to_color */ -#ifdef GL_NV_depth_clamp - GLEW_NV_depth_clamp = glewGetExtension("GL_NV_depth_clamp"); -#endif /* GL_NV_depth_clamp */ -#ifdef GL_NV_evaluators - GLEW_NV_evaluators = glewGetExtension("GL_NV_evaluators"); - if (glewExperimental || GLEW_NV_evaluators) GLEW_NV_evaluators = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_evaluators */ -#ifdef GL_NV_fence - GLEW_NV_fence = glewGetExtension("GL_NV_fence"); - if (glewExperimental || GLEW_NV_fence) GLEW_NV_fence = !_glewInit_GL_NV_fence(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_fence */ -#ifdef GL_NV_float_buffer - GLEW_NV_float_buffer = glewGetExtension("GL_NV_float_buffer"); -#endif /* GL_NV_float_buffer */ -#ifdef GL_NV_fog_distance - GLEW_NV_fog_distance = glewGetExtension("GL_NV_fog_distance"); -#endif /* GL_NV_fog_distance */ -#ifdef GL_NV_fragment_program - GLEW_NV_fragment_program = glewGetExtension("GL_NV_fragment_program"); - if (glewExperimental || GLEW_NV_fragment_program) GLEW_NV_fragment_program = !_glewInit_GL_NV_fragment_program(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_fragment_program */ -#ifdef GL_NV_fragment_program2 - GLEW_NV_fragment_program2 = glewGetExtension("GL_NV_fragment_program2"); -#endif /* GL_NV_fragment_program2 */ -#ifdef GL_NV_fragment_program_option - GLEW_NV_fragment_program_option = glewGetExtension("GL_NV_fragment_program_option"); -#endif /* GL_NV_fragment_program_option */ -#ifdef GL_NV_half_float - GLEW_NV_half_float = glewGetExtension("GL_NV_half_float"); - if (glewExperimental || GLEW_NV_half_float) GLEW_NV_half_float = !_glewInit_GL_NV_half_float(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_half_float */ -#ifdef GL_NV_light_max_exponent - GLEW_NV_light_max_exponent = glewGetExtension("GL_NV_light_max_exponent"); -#endif /* GL_NV_light_max_exponent */ -#ifdef GL_NV_multisample_filter_hint - GLEW_NV_multisample_filter_hint = glewGetExtension("GL_NV_multisample_filter_hint"); -#endif /* GL_NV_multisample_filter_hint */ -#ifdef GL_NV_occlusion_query - GLEW_NV_occlusion_query = glewGetExtension("GL_NV_occlusion_query"); - if (glewExperimental || GLEW_NV_occlusion_query) GLEW_NV_occlusion_query = !_glewInit_GL_NV_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_occlusion_query */ -#ifdef GL_NV_packed_depth_stencil - GLEW_NV_packed_depth_stencil = glewGetExtension("GL_NV_packed_depth_stencil"); -#endif /* GL_NV_packed_depth_stencil */ -#ifdef GL_NV_pixel_data_range - GLEW_NV_pixel_data_range = glewGetExtension("GL_NV_pixel_data_range"); - if (glewExperimental || GLEW_NV_pixel_data_range) GLEW_NV_pixel_data_range = !_glewInit_GL_NV_pixel_data_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_pixel_data_range */ -#ifdef GL_NV_point_sprite - GLEW_NV_point_sprite = glewGetExtension("GL_NV_point_sprite"); - if (glewExperimental || GLEW_NV_point_sprite) GLEW_NV_point_sprite = !_glewInit_GL_NV_point_sprite(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_point_sprite */ -#ifdef GL_NV_primitive_restart - GLEW_NV_primitive_restart = glewGetExtension("GL_NV_primitive_restart"); - if (glewExperimental || GLEW_NV_primitive_restart) GLEW_NV_primitive_restart = !_glewInit_GL_NV_primitive_restart(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_primitive_restart */ -#ifdef GL_NV_register_combiners - GLEW_NV_register_combiners = glewGetExtension("GL_NV_register_combiners"); - if (glewExperimental || GLEW_NV_register_combiners) GLEW_NV_register_combiners = !_glewInit_GL_NV_register_combiners(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_register_combiners */ -#ifdef GL_NV_register_combiners2 - GLEW_NV_register_combiners2 = glewGetExtension("GL_NV_register_combiners2"); - if (glewExperimental || GLEW_NV_register_combiners2) GLEW_NV_register_combiners2 = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_register_combiners2 */ -#ifdef GL_NV_texgen_emboss - GLEW_NV_texgen_emboss = glewGetExtension("GL_NV_texgen_emboss"); -#endif /* GL_NV_texgen_emboss */ -#ifdef GL_NV_texgen_reflection - GLEW_NV_texgen_reflection = glewGetExtension("GL_NV_texgen_reflection"); -#endif /* GL_NV_texgen_reflection */ -#ifdef GL_NV_texture_compression_vtc - GLEW_NV_texture_compression_vtc = glewGetExtension("GL_NV_texture_compression_vtc"); -#endif /* GL_NV_texture_compression_vtc */ -#ifdef GL_NV_texture_env_combine4 - GLEW_NV_texture_env_combine4 = glewGetExtension("GL_NV_texture_env_combine4"); -#endif /* GL_NV_texture_env_combine4 */ -#ifdef GL_NV_texture_expand_normal - GLEW_NV_texture_expand_normal = glewGetExtension("GL_NV_texture_expand_normal"); -#endif /* GL_NV_texture_expand_normal */ -#ifdef GL_NV_texture_rectangle - GLEW_NV_texture_rectangle = glewGetExtension("GL_NV_texture_rectangle"); -#endif /* GL_NV_texture_rectangle */ -#ifdef GL_NV_texture_shader - GLEW_NV_texture_shader = glewGetExtension("GL_NV_texture_shader"); -#endif /* GL_NV_texture_shader */ -#ifdef GL_NV_texture_shader2 - GLEW_NV_texture_shader2 = glewGetExtension("GL_NV_texture_shader2"); -#endif /* GL_NV_texture_shader2 */ -#ifdef GL_NV_texture_shader3 - GLEW_NV_texture_shader3 = glewGetExtension("GL_NV_texture_shader3"); -#endif /* GL_NV_texture_shader3 */ -#ifdef GL_NV_vertex_array_range - GLEW_NV_vertex_array_range = glewGetExtension("GL_NV_vertex_array_range"); - if (glewExperimental || GLEW_NV_vertex_array_range) GLEW_NV_vertex_array_range = !_glewInit_GL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_vertex_array_range */ -#ifdef GL_NV_vertex_array_range2 - GLEW_NV_vertex_array_range2 = glewGetExtension("GL_NV_vertex_array_range2"); -#endif /* GL_NV_vertex_array_range2 */ -#ifdef GL_NV_vertex_program - GLEW_NV_vertex_program = glewGetExtension("GL_NV_vertex_program"); - if (glewExperimental || GLEW_NV_vertex_program) GLEW_NV_vertex_program = !_glewInit_GL_NV_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_NV_vertex_program */ -#ifdef GL_NV_vertex_program1_1 - GLEW_NV_vertex_program1_1 = glewGetExtension("GL_NV_vertex_program1_1"); -#endif /* GL_NV_vertex_program1_1 */ -#ifdef GL_NV_vertex_program2 - GLEW_NV_vertex_program2 = glewGetExtension("GL_NV_vertex_program2"); -#endif /* GL_NV_vertex_program2 */ -#ifdef GL_NV_vertex_program2_option - GLEW_NV_vertex_program2_option = glewGetExtension("GL_NV_vertex_program2_option"); -#endif /* GL_NV_vertex_program2_option */ -#ifdef GL_NV_vertex_program3 - GLEW_NV_vertex_program3 = glewGetExtension("GL_NV_vertex_program3"); -#endif /* GL_NV_vertex_program3 */ -#ifdef GL_OML_interlace - GLEW_OML_interlace = glewGetExtension("GL_OML_interlace"); -#endif /* GL_OML_interlace */ -#ifdef GL_OML_resample - GLEW_OML_resample = glewGetExtension("GL_OML_resample"); -#endif /* GL_OML_resample */ -#ifdef GL_OML_subsample - GLEW_OML_subsample = glewGetExtension("GL_OML_subsample"); -#endif /* GL_OML_subsample */ -#ifdef GL_PGI_misc_hints - GLEW_PGI_misc_hints = glewGetExtension("GL_PGI_misc_hints"); -#endif /* GL_PGI_misc_hints */ -#ifdef GL_PGI_vertex_hints - GLEW_PGI_vertex_hints = glewGetExtension("GL_PGI_vertex_hints"); -#endif /* GL_PGI_vertex_hints */ -#ifdef GL_REND_screen_coordinates - GLEW_REND_screen_coordinates = glewGetExtension("GL_REND_screen_coordinates"); -#endif /* GL_REND_screen_coordinates */ -#ifdef GL_S3_s3tc - GLEW_S3_s3tc = glewGetExtension("GL_S3_s3tc"); -#endif /* GL_S3_s3tc */ -#ifdef GL_SGIS_color_range - GLEW_SGIS_color_range = glewGetExtension("GL_SGIS_color_range"); -#endif /* GL_SGIS_color_range */ -#ifdef GL_SGIS_detail_texture - GLEW_SGIS_detail_texture = glewGetExtension("GL_SGIS_detail_texture"); - if (glewExperimental || GLEW_SGIS_detail_texture) GLEW_SGIS_detail_texture = !_glewInit_GL_SGIS_detail_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_detail_texture */ -#ifdef GL_SGIS_fog_function - GLEW_SGIS_fog_function = glewGetExtension("GL_SGIS_fog_function"); - if (glewExperimental || GLEW_SGIS_fog_function) GLEW_SGIS_fog_function = !_glewInit_GL_SGIS_fog_function(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_fog_function */ -#ifdef GL_SGIS_generate_mipmap - GLEW_SGIS_generate_mipmap = glewGetExtension("GL_SGIS_generate_mipmap"); -#endif /* GL_SGIS_generate_mipmap */ -#ifdef GL_SGIS_multisample - GLEW_SGIS_multisample = glewGetExtension("GL_SGIS_multisample"); - if (glewExperimental || GLEW_SGIS_multisample) GLEW_SGIS_multisample = !_glewInit_GL_SGIS_multisample(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_multisample */ -#ifdef GL_SGIS_pixel_texture - GLEW_SGIS_pixel_texture = glewGetExtension("GL_SGIS_pixel_texture"); -#endif /* GL_SGIS_pixel_texture */ -#ifdef GL_SGIS_sharpen_texture - GLEW_SGIS_sharpen_texture = glewGetExtension("GL_SGIS_sharpen_texture"); - if (glewExperimental || GLEW_SGIS_sharpen_texture) GLEW_SGIS_sharpen_texture = !_glewInit_GL_SGIS_sharpen_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_sharpen_texture */ -#ifdef GL_SGIS_texture4D - GLEW_SGIS_texture4D = glewGetExtension("GL_SGIS_texture4D"); - if (glewExperimental || GLEW_SGIS_texture4D) GLEW_SGIS_texture4D = !_glewInit_GL_SGIS_texture4D(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_texture4D */ -#ifdef GL_SGIS_texture_border_clamp - GLEW_SGIS_texture_border_clamp = glewGetExtension("GL_SGIS_texture_border_clamp"); -#endif /* GL_SGIS_texture_border_clamp */ -#ifdef GL_SGIS_texture_edge_clamp - GLEW_SGIS_texture_edge_clamp = glewGetExtension("GL_SGIS_texture_edge_clamp"); -#endif /* GL_SGIS_texture_edge_clamp */ -#ifdef GL_SGIS_texture_filter4 - GLEW_SGIS_texture_filter4 = glewGetExtension("GL_SGIS_texture_filter4"); - if (glewExperimental || GLEW_SGIS_texture_filter4) GLEW_SGIS_texture_filter4 = !_glewInit_GL_SGIS_texture_filter4(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIS_texture_filter4 */ -#ifdef GL_SGIS_texture_lod - GLEW_SGIS_texture_lod = glewGetExtension("GL_SGIS_texture_lod"); -#endif /* GL_SGIS_texture_lod */ -#ifdef GL_SGIS_texture_select - GLEW_SGIS_texture_select = glewGetExtension("GL_SGIS_texture_select"); -#endif /* GL_SGIS_texture_select */ -#ifdef GL_SGIX_async - GLEW_SGIX_async = glewGetExtension("GL_SGIX_async"); - if (glewExperimental || GLEW_SGIX_async) GLEW_SGIX_async = !_glewInit_GL_SGIX_async(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_async */ -#ifdef GL_SGIX_async_histogram - GLEW_SGIX_async_histogram = glewGetExtension("GL_SGIX_async_histogram"); -#endif /* GL_SGIX_async_histogram */ -#ifdef GL_SGIX_async_pixel - GLEW_SGIX_async_pixel = glewGetExtension("GL_SGIX_async_pixel"); -#endif /* GL_SGIX_async_pixel */ -#ifdef GL_SGIX_blend_alpha_minmax - GLEW_SGIX_blend_alpha_minmax = glewGetExtension("GL_SGIX_blend_alpha_minmax"); -#endif /* GL_SGIX_blend_alpha_minmax */ -#ifdef GL_SGIX_clipmap - GLEW_SGIX_clipmap = glewGetExtension("GL_SGIX_clipmap"); -#endif /* GL_SGIX_clipmap */ -#ifdef GL_SGIX_depth_texture - GLEW_SGIX_depth_texture = glewGetExtension("GL_SGIX_depth_texture"); -#endif /* GL_SGIX_depth_texture */ -#ifdef GL_SGIX_flush_raster - GLEW_SGIX_flush_raster = glewGetExtension("GL_SGIX_flush_raster"); - if (glewExperimental || GLEW_SGIX_flush_raster) GLEW_SGIX_flush_raster = !_glewInit_GL_SGIX_flush_raster(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_flush_raster */ -#ifdef GL_SGIX_fog_offset - GLEW_SGIX_fog_offset = glewGetExtension("GL_SGIX_fog_offset"); -#endif /* GL_SGIX_fog_offset */ -#ifdef GL_SGIX_fog_texture - GLEW_SGIX_fog_texture = glewGetExtension("GL_SGIX_fog_texture"); - if (glewExperimental || GLEW_SGIX_fog_texture) GLEW_SGIX_fog_texture = !_glewInit_GL_SGIX_fog_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_fog_texture */ -#ifdef GL_SGIX_fragment_specular_lighting - GLEW_SGIX_fragment_specular_lighting = glewGetExtension("GL_SGIX_fragment_specular_lighting"); - if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) GLEW_SGIX_fragment_specular_lighting = !_glewInit_GL_SGIX_fragment_specular_lighting(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_fragment_specular_lighting */ -#ifdef GL_SGIX_framezoom - GLEW_SGIX_framezoom = glewGetExtension("GL_SGIX_framezoom"); - if (glewExperimental || GLEW_SGIX_framezoom) GLEW_SGIX_framezoom = !_glewInit_GL_SGIX_framezoom(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_framezoom */ -#ifdef GL_SGIX_interlace - GLEW_SGIX_interlace = glewGetExtension("GL_SGIX_interlace"); -#endif /* GL_SGIX_interlace */ -#ifdef GL_SGIX_ir_instrument1 - GLEW_SGIX_ir_instrument1 = glewGetExtension("GL_SGIX_ir_instrument1"); -#endif /* GL_SGIX_ir_instrument1 */ -#ifdef GL_SGIX_list_priority - GLEW_SGIX_list_priority = glewGetExtension("GL_SGIX_list_priority"); -#endif /* GL_SGIX_list_priority */ -#ifdef GL_SGIX_pixel_texture - GLEW_SGIX_pixel_texture = glewGetExtension("GL_SGIX_pixel_texture"); - if (glewExperimental || GLEW_SGIX_pixel_texture) GLEW_SGIX_pixel_texture = !_glewInit_GL_SGIX_pixel_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_pixel_texture */ -#ifdef GL_SGIX_pixel_texture_bits - GLEW_SGIX_pixel_texture_bits = glewGetExtension("GL_SGIX_pixel_texture_bits"); -#endif /* GL_SGIX_pixel_texture_bits */ -#ifdef GL_SGIX_reference_plane - GLEW_SGIX_reference_plane = glewGetExtension("GL_SGIX_reference_plane"); - if (glewExperimental || GLEW_SGIX_reference_plane) GLEW_SGIX_reference_plane = !_glewInit_GL_SGIX_reference_plane(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_reference_plane */ -#ifdef GL_SGIX_resample - GLEW_SGIX_resample = glewGetExtension("GL_SGIX_resample"); -#endif /* GL_SGIX_resample */ -#ifdef GL_SGIX_shadow - GLEW_SGIX_shadow = glewGetExtension("GL_SGIX_shadow"); -#endif /* GL_SGIX_shadow */ -#ifdef GL_SGIX_shadow_ambient - GLEW_SGIX_shadow_ambient = glewGetExtension("GL_SGIX_shadow_ambient"); -#endif /* GL_SGIX_shadow_ambient */ -#ifdef GL_SGIX_sprite - GLEW_SGIX_sprite = glewGetExtension("GL_SGIX_sprite"); - if (glewExperimental || GLEW_SGIX_sprite) GLEW_SGIX_sprite = !_glewInit_GL_SGIX_sprite(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_sprite */ -#ifdef GL_SGIX_tag_sample_buffer - GLEW_SGIX_tag_sample_buffer = glewGetExtension("GL_SGIX_tag_sample_buffer"); - if (glewExperimental || GLEW_SGIX_tag_sample_buffer) GLEW_SGIX_tag_sample_buffer = !_glewInit_GL_SGIX_tag_sample_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGIX_tag_sample_buffer */ -#ifdef GL_SGIX_texture_add_env - GLEW_SGIX_texture_add_env = glewGetExtension("GL_SGIX_texture_add_env"); -#endif /* GL_SGIX_texture_add_env */ -#ifdef GL_SGIX_texture_coordinate_clamp - GLEW_SGIX_texture_coordinate_clamp = glewGetExtension("GL_SGIX_texture_coordinate_clamp"); -#endif /* GL_SGIX_texture_coordinate_clamp */ -#ifdef GL_SGIX_texture_lod_bias - GLEW_SGIX_texture_lod_bias = glewGetExtension("GL_SGIX_texture_lod_bias"); -#endif /* GL_SGIX_texture_lod_bias */ -#ifdef GL_SGIX_texture_multi_buffer - GLEW_SGIX_texture_multi_buffer = glewGetExtension("GL_SGIX_texture_multi_buffer"); -#endif /* GL_SGIX_texture_multi_buffer */ -#ifdef GL_SGIX_texture_range - GLEW_SGIX_texture_range = glewGetExtension("GL_SGIX_texture_range"); -#endif /* GL_SGIX_texture_range */ -#ifdef GL_SGIX_texture_scale_bias - GLEW_SGIX_texture_scale_bias = glewGetExtension("GL_SGIX_texture_scale_bias"); -#endif /* GL_SGIX_texture_scale_bias */ -#ifdef GL_SGIX_vertex_preclip - GLEW_SGIX_vertex_preclip = glewGetExtension("GL_SGIX_vertex_preclip"); -#endif /* GL_SGIX_vertex_preclip */ -#ifdef GL_SGIX_vertex_preclip_hint - GLEW_SGIX_vertex_preclip_hint = glewGetExtension("GL_SGIX_vertex_preclip_hint"); -#endif /* GL_SGIX_vertex_preclip_hint */ -#ifdef GL_SGIX_ycrcb - GLEW_SGIX_ycrcb = glewGetExtension("GL_SGIX_ycrcb"); -#endif /* GL_SGIX_ycrcb */ -#ifdef GL_SGI_color_matrix - GLEW_SGI_color_matrix = glewGetExtension("GL_SGI_color_matrix"); -#endif /* GL_SGI_color_matrix */ -#ifdef GL_SGI_color_table - GLEW_SGI_color_table = glewGetExtension("GL_SGI_color_table"); - if (glewExperimental || GLEW_SGI_color_table) GLEW_SGI_color_table = !_glewInit_GL_SGI_color_table(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SGI_color_table */ -#ifdef GL_SGI_texture_color_table - GLEW_SGI_texture_color_table = glewGetExtension("GL_SGI_texture_color_table"); -#endif /* GL_SGI_texture_color_table */ -#ifdef GL_SUNX_constant_data - GLEW_SUNX_constant_data = glewGetExtension("GL_SUNX_constant_data"); - if (glewExperimental || GLEW_SUNX_constant_data) GLEW_SUNX_constant_data = !_glewInit_GL_SUNX_constant_data(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUNX_constant_data */ -#ifdef GL_SUN_convolution_border_modes - GLEW_SUN_convolution_border_modes = glewGetExtension("GL_SUN_convolution_border_modes"); -#endif /* GL_SUN_convolution_border_modes */ -#ifdef GL_SUN_global_alpha - GLEW_SUN_global_alpha = glewGetExtension("GL_SUN_global_alpha"); - if (glewExperimental || GLEW_SUN_global_alpha) GLEW_SUN_global_alpha = !_glewInit_GL_SUN_global_alpha(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUN_global_alpha */ -#ifdef GL_SUN_mesh_array - GLEW_SUN_mesh_array = glewGetExtension("GL_SUN_mesh_array"); -#endif /* GL_SUN_mesh_array */ -#ifdef GL_SUN_read_video_pixels - GLEW_SUN_read_video_pixels = glewGetExtension("GL_SUN_read_video_pixels"); - if (glewExperimental || GLEW_SUN_read_video_pixels) GLEW_SUN_read_video_pixels = !_glewInit_GL_SUN_read_video_pixels(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUN_read_video_pixels */ -#ifdef GL_SUN_slice_accum - GLEW_SUN_slice_accum = glewGetExtension("GL_SUN_slice_accum"); -#endif /* GL_SUN_slice_accum */ -#ifdef GL_SUN_triangle_list - GLEW_SUN_triangle_list = glewGetExtension("GL_SUN_triangle_list"); - if (glewExperimental || GLEW_SUN_triangle_list) GLEW_SUN_triangle_list = !_glewInit_GL_SUN_triangle_list(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUN_triangle_list */ -#ifdef GL_SUN_vertex - GLEW_SUN_vertex = glewGetExtension("GL_SUN_vertex"); - if (glewExperimental || GLEW_SUN_vertex) GLEW_SUN_vertex = !_glewInit_GL_SUN_vertex(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_SUN_vertex */ -#ifdef GL_WIN_phong_shading - GLEW_WIN_phong_shading = glewGetExtension("GL_WIN_phong_shading"); -#endif /* GL_WIN_phong_shading */ -#ifdef GL_WIN_specular_fog - GLEW_WIN_specular_fog = glewGetExtension("GL_WIN_specular_fog"); -#endif /* GL_WIN_specular_fog */ -#ifdef GL_WIN_swap_hint - GLEW_WIN_swap_hint = glewGetExtension("GL_WIN_swap_hint"); - if (glewExperimental || GLEW_WIN_swap_hint) GLEW_WIN_swap_hint = !_glewInit_GL_WIN_swap_hint(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GL_WIN_swap_hint */ - - return GLEW_OK; -} - - -#if defined(_WIN32) - -#if !defined(GLEW_MX) - -PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; - -PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; -PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; -PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; -PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; - -PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; - -PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; -PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; - -PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; -PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; -PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; -PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; -PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; - -PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; -PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; -PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; - -PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; -PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; -PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; - -PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; -PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; -PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; -PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; - -PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; - -PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; -PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; - -PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; -PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; -PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; -PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; -PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; - -PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; -PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; -PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; - -PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; -PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; - -PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; -PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; - -PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; -PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; -PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; -PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; - -PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; -PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; -PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; -PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; -PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; -PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; -PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; -PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; -PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; -PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; -PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; -PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; - -PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; -PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; -PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; -PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; - -PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; -PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; -PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; -PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; - -PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; -PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; -PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; -PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; - -PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; -PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; - -PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; -PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; -PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; -PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; -PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; -PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; -GLboolean __WGLEW_3DFX_multisample = GL_FALSE; -GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; -GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; -GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; -GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; -GLboolean __WGLEW_ARB_multisample = GL_FALSE; -GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; -GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; -GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; -GLboolean __WGLEW_ARB_render_texture = GL_FALSE; -GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; -GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; -GLboolean __WGLEW_EXT_depth_float = GL_FALSE; -GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; -GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; -GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; -GLboolean __WGLEW_EXT_multisample = GL_FALSE; -GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; -GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; -GLboolean __WGLEW_EXT_swap_control = GL_FALSE; -GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; -GLboolean __WGLEW_I3D_gamma = GL_FALSE; -GLboolean __WGLEW_I3D_genlock = GL_FALSE; -GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; -GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; -GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; -GLboolean __WGLEW_NV_float_buffer = GL_FALSE; -GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; -GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; -GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; -GLboolean __WGLEW_OML_sync_control = GL_FALSE; - -#endif /* !GLEW_MX */ - -#ifdef WGL_3DFX_multisample - -#endif /* WGL_3DFX_multisample */ - -#ifdef WGL_3DL_stereo_control - -static GLboolean _glewInit_WGL_3DL_stereo_control (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; - - return r; -} - -#endif /* WGL_3DL_stereo_control */ - -#ifdef WGL_ARB_buffer_region - -static GLboolean _glewInit_WGL_ARB_buffer_region (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; - r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; - r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; - r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_buffer_region */ - -#ifdef WGL_ARB_extensions_string - -static GLboolean _glewInit_WGL_ARB_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_extensions_string */ - -#ifdef WGL_ARB_make_current_read - -static GLboolean _glewInit_WGL_ARB_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; - r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_make_current_read */ - -#ifdef WGL_ARB_multisample - -#endif /* WGL_ARB_multisample */ - -#ifdef WGL_ARB_pbuffer - -static GLboolean _glewInit_WGL_ARB_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; - r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; - r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; - r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; - r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_pbuffer */ - -#ifdef WGL_ARB_pixel_format - -static GLboolean _glewInit_WGL_ARB_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; - r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; - r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_pixel_format */ - -#ifdef WGL_ARB_pixel_format_float - -#endif /* WGL_ARB_pixel_format_float */ - -#ifdef WGL_ARB_render_texture - -static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; - r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; - r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; - - return r; -} - -#endif /* WGL_ARB_render_texture */ - -#ifdef WGL_ATI_pixel_format_float - -#endif /* WGL_ATI_pixel_format_float */ - -#ifdef WGL_ATI_render_texture_rectangle - -#endif /* WGL_ATI_render_texture_rectangle */ - -#ifdef WGL_EXT_depth_float - -#endif /* WGL_EXT_depth_float */ - -#ifdef WGL_EXT_display_color_table - -static GLboolean _glewInit_WGL_EXT_display_color_table (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; - r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; - r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; - r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_display_color_table */ - -#ifdef WGL_EXT_extensions_string - -static GLboolean _glewInit_WGL_EXT_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_extensions_string */ - -#ifdef WGL_EXT_make_current_read - -static GLboolean _glewInit_WGL_EXT_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; - r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_make_current_read */ - -#ifdef WGL_EXT_multisample - -#endif /* WGL_EXT_multisample */ - -#ifdef WGL_EXT_pbuffer - -static GLboolean _glewInit_WGL_EXT_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; - r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; - r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; - r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; - r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_pbuffer */ - -#ifdef WGL_EXT_pixel_format - -static GLboolean _glewInit_WGL_EXT_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; - r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; - r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_pixel_format */ - -#ifdef WGL_EXT_swap_control - -static GLboolean _glewInit_WGL_EXT_swap_control (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; - r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; - - return r; -} - -#endif /* WGL_EXT_swap_control */ - -#ifdef WGL_I3D_digital_video_control - -static GLboolean _glewInit_WGL_I3D_digital_video_control (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; - r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_digital_video_control */ - -#ifdef WGL_I3D_gamma - -static GLboolean _glewInit_WGL_I3D_gamma (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; - r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; - r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; - r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_gamma */ - -#ifdef WGL_I3D_genlock - -static GLboolean _glewInit_WGL_I3D_genlock (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; - r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; - r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; - r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; - r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; - r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; - r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; - r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; - r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; - r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; - r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; - r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_genlock */ - -#ifdef WGL_I3D_image_buffer - -static GLboolean _glewInit_WGL_I3D_image_buffer (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; - r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; - r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; - r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_image_buffer */ - -#ifdef WGL_I3D_swap_frame_lock - -static GLboolean _glewInit_WGL_I3D_swap_frame_lock (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; - r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; - r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; - r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_swap_frame_lock */ - -#ifdef WGL_I3D_swap_frame_usage - -static GLboolean _glewInit_WGL_I3D_swap_frame_usage (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; - r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; - r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; - r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; - - return r; -} - -#endif /* WGL_I3D_swap_frame_usage */ - -#ifdef WGL_NV_float_buffer - -#endif /* WGL_NV_float_buffer */ - -#ifdef WGL_NV_render_depth_texture - -#endif /* WGL_NV_render_depth_texture */ - -#ifdef WGL_NV_render_texture_rectangle - -#endif /* WGL_NV_render_texture_rectangle */ - -#ifdef WGL_NV_vertex_array_range - -static GLboolean _glewInit_WGL_NV_vertex_array_range (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; - r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; - - return r; -} - -#endif /* WGL_NV_vertex_array_range */ - -#ifdef WGL_OML_sync_control - -static GLboolean _glewInit_WGL_OML_sync_control (WGLEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; - r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; - r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; - r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; - r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; - r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; - - return r; -} - -#endif /* WGL_OML_sync_control */ - -/* ------------------------------------------------------------------------- */ - -static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; -static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; - -GLboolean wglewGetExtension (const char* name) -{ - GLubyte* p; - GLubyte* end; - GLuint len = _glewStrLen((const GLubyte*)name); - if (_wglewGetExtensionsStringARB == NULL) - if (_wglewGetExtensionsStringEXT == NULL) - return GL_FALSE; - else - p = (GLubyte*)_wglewGetExtensionsStringEXT(); - else - p = (GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); - if (0 == p) return GL_FALSE; - end = p + _glewStrLen(p); - while (p < end) - { - GLuint n = _glewStrCLen(p, ' '); - if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; - p += n+1; - } - return GL_FALSE; -} - -GLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) -{ - GLboolean crippled; - /* find wgl extension string query functions */ - if (_wglewGetExtensionsStringARB == NULL) - _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); - if (_wglewGetExtensionsStringEXT == NULL) - _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); - /* initialize extensions */ - crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; -#ifdef WGL_3DFX_multisample - WGLEW_3DFX_multisample = wglewGetExtension("WGL_3DFX_multisample"); -#endif /* WGL_3DFX_multisample */ -#ifdef WGL_3DL_stereo_control - WGLEW_3DL_stereo_control = wglewGetExtension("WGL_3DL_stereo_control"); - if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) WGLEW_3DL_stereo_control= !_glewInit_WGL_3DL_stereo_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_3DL_stereo_control */ -#ifdef WGL_ARB_buffer_region - WGLEW_ARB_buffer_region = wglewGetExtension("WGL_ARB_buffer_region"); - if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) WGLEW_ARB_buffer_region= !_glewInit_WGL_ARB_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_buffer_region */ -#ifdef WGL_ARB_extensions_string - WGLEW_ARB_extensions_string = wglewGetExtension("WGL_ARB_extensions_string"); - if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) WGLEW_ARB_extensions_string= !_glewInit_WGL_ARB_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_extensions_string */ -#ifdef WGL_ARB_make_current_read - WGLEW_ARB_make_current_read = wglewGetExtension("WGL_ARB_make_current_read"); - if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) WGLEW_ARB_make_current_read= !_glewInit_WGL_ARB_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_make_current_read */ -#ifdef WGL_ARB_multisample - WGLEW_ARB_multisample = wglewGetExtension("WGL_ARB_multisample"); -#endif /* WGL_ARB_multisample */ -#ifdef WGL_ARB_pbuffer - WGLEW_ARB_pbuffer = wglewGetExtension("WGL_ARB_pbuffer"); - if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) WGLEW_ARB_pbuffer= !_glewInit_WGL_ARB_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_pbuffer */ -#ifdef WGL_ARB_pixel_format - WGLEW_ARB_pixel_format = wglewGetExtension("WGL_ARB_pixel_format"); - if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) WGLEW_ARB_pixel_format= !_glewInit_WGL_ARB_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_pixel_format */ -#ifdef WGL_ARB_pixel_format_float - WGLEW_ARB_pixel_format_float = wglewGetExtension("WGL_ARB_pixel_format_float"); -#endif /* WGL_ARB_pixel_format_float */ -#ifdef WGL_ARB_render_texture - WGLEW_ARB_render_texture = wglewGetExtension("WGL_ARB_render_texture"); - if (glewExperimental || WGLEW_ARB_render_texture|| crippled) WGLEW_ARB_render_texture= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_ARB_render_texture */ -#ifdef WGL_ATI_pixel_format_float - WGLEW_ATI_pixel_format_float = wglewGetExtension("WGL_ATI_pixel_format_float"); -#endif /* WGL_ATI_pixel_format_float */ -#ifdef WGL_ATI_render_texture_rectangle - WGLEW_ATI_render_texture_rectangle = wglewGetExtension("WGL_ATI_render_texture_rectangle"); -#endif /* WGL_ATI_render_texture_rectangle */ -#ifdef WGL_EXT_depth_float - WGLEW_EXT_depth_float = wglewGetExtension("WGL_EXT_depth_float"); -#endif /* WGL_EXT_depth_float */ -#ifdef WGL_EXT_display_color_table - WGLEW_EXT_display_color_table = wglewGetExtension("WGL_EXT_display_color_table"); - if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) WGLEW_EXT_display_color_table= !_glewInit_WGL_EXT_display_color_table(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_display_color_table */ -#ifdef WGL_EXT_extensions_string - WGLEW_EXT_extensions_string = wglewGetExtension("WGL_EXT_extensions_string"); - if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) WGLEW_EXT_extensions_string= !_glewInit_WGL_EXT_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_extensions_string */ -#ifdef WGL_EXT_make_current_read - WGLEW_EXT_make_current_read = wglewGetExtension("WGL_EXT_make_current_read"); - if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) WGLEW_EXT_make_current_read= !_glewInit_WGL_EXT_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_make_current_read */ -#ifdef WGL_EXT_multisample - WGLEW_EXT_multisample = wglewGetExtension("WGL_EXT_multisample"); -#endif /* WGL_EXT_multisample */ -#ifdef WGL_EXT_pbuffer - WGLEW_EXT_pbuffer = wglewGetExtension("WGL_EXT_pbuffer"); - if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) WGLEW_EXT_pbuffer= !_glewInit_WGL_EXT_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_pbuffer */ -#ifdef WGL_EXT_pixel_format - WGLEW_EXT_pixel_format = wglewGetExtension("WGL_EXT_pixel_format"); - if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) WGLEW_EXT_pixel_format= !_glewInit_WGL_EXT_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_pixel_format */ -#ifdef WGL_EXT_swap_control - WGLEW_EXT_swap_control = wglewGetExtension("WGL_EXT_swap_control"); - if (glewExperimental || WGLEW_EXT_swap_control|| crippled) WGLEW_EXT_swap_control= !_glewInit_WGL_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_EXT_swap_control */ -#ifdef WGL_I3D_digital_video_control - WGLEW_I3D_digital_video_control = wglewGetExtension("WGL_I3D_digital_video_control"); - if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) WGLEW_I3D_digital_video_control= !_glewInit_WGL_I3D_digital_video_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_digital_video_control */ -#ifdef WGL_I3D_gamma - WGLEW_I3D_gamma = wglewGetExtension("WGL_I3D_gamma"); - if (glewExperimental || WGLEW_I3D_gamma|| crippled) WGLEW_I3D_gamma= !_glewInit_WGL_I3D_gamma(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_gamma */ -#ifdef WGL_I3D_genlock - WGLEW_I3D_genlock = wglewGetExtension("WGL_I3D_genlock"); - if (glewExperimental || WGLEW_I3D_genlock|| crippled) WGLEW_I3D_genlock= !_glewInit_WGL_I3D_genlock(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_genlock */ -#ifdef WGL_I3D_image_buffer - WGLEW_I3D_image_buffer = wglewGetExtension("WGL_I3D_image_buffer"); - if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) WGLEW_I3D_image_buffer= !_glewInit_WGL_I3D_image_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_image_buffer */ -#ifdef WGL_I3D_swap_frame_lock - WGLEW_I3D_swap_frame_lock = wglewGetExtension("WGL_I3D_swap_frame_lock"); - if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) WGLEW_I3D_swap_frame_lock= !_glewInit_WGL_I3D_swap_frame_lock(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_swap_frame_lock */ -#ifdef WGL_I3D_swap_frame_usage - WGLEW_I3D_swap_frame_usage = wglewGetExtension("WGL_I3D_swap_frame_usage"); - if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) WGLEW_I3D_swap_frame_usage= !_glewInit_WGL_I3D_swap_frame_usage(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_I3D_swap_frame_usage */ -#ifdef WGL_NV_float_buffer - WGLEW_NV_float_buffer = wglewGetExtension("WGL_NV_float_buffer"); -#endif /* WGL_NV_float_buffer */ -#ifdef WGL_NV_render_depth_texture - WGLEW_NV_render_depth_texture = wglewGetExtension("WGL_NV_render_depth_texture"); -#endif /* WGL_NV_render_depth_texture */ -#ifdef WGL_NV_render_texture_rectangle - WGLEW_NV_render_texture_rectangle = wglewGetExtension("WGL_NV_render_texture_rectangle"); -#endif /* WGL_NV_render_texture_rectangle */ -#ifdef WGL_NV_vertex_array_range - WGLEW_NV_vertex_array_range = wglewGetExtension("WGL_NV_vertex_array_range"); - if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) WGLEW_NV_vertex_array_range= !_glewInit_WGL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_NV_vertex_array_range */ -#ifdef WGL_OML_sync_control - WGLEW_OML_sync_control = wglewGetExtension("WGL_OML_sync_control"); - if (glewExperimental || WGLEW_OML_sync_control|| crippled) WGLEW_OML_sync_control= !_glewInit_WGL_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* WGL_OML_sync_control */ - - return GLEW_OK; -} - -#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) - -PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; - -PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; -PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; -PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; -PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; -PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; -PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; -PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; -PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; -PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; -PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; -PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; -PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; -PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; -PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; -PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; -PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; -PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; - -PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; -PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; -PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; - -PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; -PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; -PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; -PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; - -PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; - -PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; - -PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; - -PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; - -PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; - -PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; -PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; - -#ifdef GLX_OML_sync_control -PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; -PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; -PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; -PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; -PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; -#endif - -PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; -PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; -PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; -PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; -PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; -PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; - -PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; -PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; -PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; -PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; -PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; - -PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; -PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; - -PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; - -PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; -PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; -PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; -PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; -PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; - -PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; - -PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; -PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; - -PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; - -PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; -PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; - -PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; - -PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; -PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; - -#if !defined(GLEW_MX) - -GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; -GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; -GLboolean __GLXEW_3DFX_multisample = GL_FALSE; -GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; -GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; -GLboolean __GLXEW_ARB_multisample = GL_FALSE; -GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; -GLboolean __GLXEW_ATI_render_texture = GL_FALSE; -GLboolean __GLXEW_EXT_import_context = GL_FALSE; -GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; -GLboolean __GLXEW_EXT_visual_info = GL_FALSE; -GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; -GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; -GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; -GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; -GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; -GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; -GLboolean __GLXEW_NV_float_buffer = GL_FALSE; -GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; -GLboolean __GLXEW_OML_swap_method = GL_FALSE; -#ifdef GLX_OML_sync_control -GLboolean __GLXEW_OML_sync_control = GL_FALSE; -#endif -GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; -GLboolean __GLXEW_SGIS_color_range = GL_FALSE; -GLboolean __GLXEW_SGIS_multisample = GL_FALSE; -GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; -GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; -GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; -GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; -GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; -GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; -GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; -GLboolean __GLXEW_SGI_cushion = GL_FALSE; -GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; -GLboolean __GLXEW_SGI_swap_control = GL_FALSE; -GLboolean __GLXEW_SGI_video_sync = GL_FALSE; -GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; -GLboolean __GLXEW_SUN_video_resize = GL_FALSE; - -#endif /* !GLEW_MX */ - -#ifdef GLX_VERSION_1_2 - -static GLboolean _glewInit_GLX_VERSION_1_2 (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; - - return r; -} - -#endif /* GLX_VERSION_1_2 */ - -#ifdef GLX_VERSION_1_3 - -static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; - r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; - r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; - r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; - r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; - r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; - r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; - r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; - r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; - r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; - r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; - r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; - r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; - r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; - r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; - r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; - r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; - - return r; -} - -#endif /* GLX_VERSION_1_3 */ - -#ifdef GLX_VERSION_1_4 - -#endif /* GLX_VERSION_1_4 */ - -#ifdef GLX_3DFX_multisample - -#endif /* GLX_3DFX_multisample */ - -#ifdef GLX_ARB_fbconfig_float - -#endif /* GLX_ARB_fbconfig_float */ - -#ifdef GLX_ARB_get_proc_address - -#endif /* GLX_ARB_get_proc_address */ - -#ifdef GLX_ARB_multisample - -#endif /* GLX_ARB_multisample */ - -#ifdef GLX_ATI_pixel_format_float - -#endif /* GLX_ATI_pixel_format_float */ - -#ifdef GLX_ATI_render_texture - -static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; - r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; - r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; - - return r; -} - -#endif /* GLX_ATI_render_texture */ - -#ifdef GLX_EXT_import_context - -static GLboolean _glewInit_GLX_EXT_import_context (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; - r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; - r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; - r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; - - return r; -} - -#endif /* GLX_EXT_import_context */ - -#ifdef GLX_EXT_scene_marker - -#endif /* GLX_EXT_scene_marker */ - -#ifdef GLX_EXT_visual_info - -#endif /* GLX_EXT_visual_info */ - -#ifdef GLX_EXT_visual_rating - -#endif /* GLX_EXT_visual_rating */ - -#ifdef GLX_MESA_agp_offset - -static GLboolean _glewInit_GLX_MESA_agp_offset (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_agp_offset */ - -#ifdef GLX_MESA_copy_sub_buffer - -static GLboolean _glewInit_GLX_MESA_copy_sub_buffer (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_copy_sub_buffer */ - -#ifdef GLX_MESA_pixmap_colormap - -static GLboolean _glewInit_GLX_MESA_pixmap_colormap (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_pixmap_colormap */ - -#ifdef GLX_MESA_release_buffers - -static GLboolean _glewInit_GLX_MESA_release_buffers (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_release_buffers */ - -#ifdef GLX_MESA_set_3dfx_mode - -static GLboolean _glewInit_GLX_MESA_set_3dfx_mode (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; - - return r; -} - -#endif /* GLX_MESA_set_3dfx_mode */ - -#ifdef GLX_NV_float_buffer - -#endif /* GLX_NV_float_buffer */ - -#ifdef GLX_NV_vertex_array_range - -static GLboolean _glewInit_GLX_NV_vertex_array_range (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; - r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; - - return r; -} - -#endif /* GLX_NV_vertex_array_range */ - -#ifdef GLX_OML_swap_method - -#endif /* GLX_OML_swap_method */ - -#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) -#include - -static GLboolean _glewInit_GLX_OML_sync_control (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; - r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; - r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; - r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; - r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; - - return r; -} - -#endif /* GLX_OML_sync_control */ - -#ifdef GLX_SGIS_blended_overlay - -#endif /* GLX_SGIS_blended_overlay */ - -#ifdef GLX_SGIS_color_range - -#endif /* GLX_SGIS_color_range */ - -#ifdef GLX_SGIS_multisample - -#endif /* GLX_SGIS_multisample */ - -#ifdef GLX_SGIS_shared_multisample - -#endif /* GLX_SGIS_shared_multisample */ - -#ifdef GLX_SGIX_fbconfig - -static GLboolean _glewInit_GLX_SGIX_fbconfig (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; - r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; - r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; - r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; - r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; - r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_fbconfig */ - -#ifdef GLX_SGIX_pbuffer - -static GLboolean _glewInit_GLX_SGIX_pbuffer (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; - r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; - r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; - r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; - r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_pbuffer */ - -#ifdef GLX_SGIX_swap_barrier - -static GLboolean _glewInit_GLX_SGIX_swap_barrier (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; - r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_swap_barrier */ - -#ifdef GLX_SGIX_swap_group - -static GLboolean _glewInit_GLX_SGIX_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_swap_group */ - -#ifdef GLX_SGIX_video_resize - -static GLboolean _glewInit_GLX_SGIX_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; - r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; - r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; - r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; - r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGIX_video_resize */ - -#ifdef GLX_SGIX_visual_select_group - -#endif /* GLX_SGIX_visual_select_group */ - -#ifdef GLX_SGI_cushion - -static GLboolean _glewInit_GLX_SGI_cushion (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_cushion */ - -#ifdef GLX_SGI_make_current_read - -static GLboolean _glewInit_GLX_SGI_make_current_read (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; - r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_make_current_read */ - -#ifdef GLX_SGI_swap_control - -static GLboolean _glewInit_GLX_SGI_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_swap_control */ - -#ifdef GLX_SGI_video_sync - -static GLboolean _glewInit_GLX_SGI_video_sync (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; - r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; - - return r; -} - -#endif /* GLX_SGI_video_sync */ - -#ifdef GLX_SUN_get_transparent_index - -static GLboolean _glewInit_GLX_SUN_get_transparent_index (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; - - return r; -} - -#endif /* GLX_SUN_get_transparent_index */ - -#ifdef GLX_SUN_video_resize - -static GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) -{ - GLboolean r = GL_FALSE; - - r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; - r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; - - return r; -} - -#endif /* GLX_SUN_video_resize */ - -/* ------------------------------------------------------------------------ */ - -GLboolean glxewGetExtension (const char* name) -{ - GLubyte* p; - GLubyte* end; - GLuint len = _glewStrLen((const GLubyte*)name); -/* if (glXQueryExtensionsString == NULL || glXGetCurrentDisplay == NULL) return GL_FALSE; */ -/* p = (GLubyte*)glXQueryExtensionsString(glXGetCurrentDisplay(), DefaultScreen(glXGetCurrentDisplay())); */ - if (glXGetClientString == NULL || glXGetCurrentDisplay == NULL) return GL_FALSE; - p = (GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); - if (0 == p) return GL_FALSE; - end = p + _glewStrLen(p); - while (p < end) - { - GLuint n = _glewStrCLen(p, ' '); - if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; - p += n+1; - } - return GL_FALSE; -} - -GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) -{ - int major, minor; - /* initialize core GLX 1.2 */ - if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY; - /* initialize flags */ - GLXEW_VERSION_1_0 = GL_TRUE; - GLXEW_VERSION_1_1 = GL_TRUE; - GLXEW_VERSION_1_2 = GL_TRUE; - GLXEW_VERSION_1_3 = GL_TRUE; - GLXEW_VERSION_1_4 = GL_TRUE; - /* query GLX version */ - glXQueryVersion(glXGetCurrentDisplay(), &major, &minor); - if (major == 1 && minor <= 3) - { - switch (minor) - { - case 3: - GLXEW_VERSION_1_4 = GL_FALSE; - break; - case 2: - GLXEW_VERSION_1_4 = GL_FALSE; - GLXEW_VERSION_1_3 = GL_FALSE; - break; - default: - return GLEW_ERROR_GLX_VERSION_11_ONLY; - break; - } - } - /* initialize extensions */ -#ifdef GLX_VERSION_1_3 - if (glewExperimental || GLXEW_VERSION_1_3) GLXEW_VERSION_1_3 = !_glewInit_GLX_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_VERSION_1_3 */ -#ifdef GLX_3DFX_multisample - GLXEW_3DFX_multisample = glxewGetExtension("GLX_3DFX_multisample"); -#endif /* GLX_3DFX_multisample */ -#ifdef GLX_ARB_fbconfig_float - GLXEW_ARB_fbconfig_float = glxewGetExtension("GLX_ARB_fbconfig_float"); -#endif /* GLX_ARB_fbconfig_float */ -#ifdef GLX_ARB_get_proc_address - GLXEW_ARB_get_proc_address = glxewGetExtension("GLX_ARB_get_proc_address"); -#endif /* GLX_ARB_get_proc_address */ -#ifdef GLX_ARB_multisample - GLXEW_ARB_multisample = glxewGetExtension("GLX_ARB_multisample"); -#endif /* GLX_ARB_multisample */ -#ifdef GLX_ATI_pixel_format_float - GLXEW_ATI_pixel_format_float = glxewGetExtension("GLX_ATI_pixel_format_float"); -#endif /* GLX_ATI_pixel_format_float */ -#ifdef GLX_ATI_render_texture - GLXEW_ATI_render_texture = glxewGetExtension("GLX_ATI_render_texture"); - if (glewExperimental || GLXEW_ATI_render_texture) GLXEW_ATI_render_texture = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_ATI_render_texture */ -#ifdef GLX_EXT_import_context - GLXEW_EXT_import_context = glxewGetExtension("GLX_EXT_import_context"); - if (glewExperimental || GLXEW_EXT_import_context) GLXEW_EXT_import_context = !_glewInit_GLX_EXT_import_context(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_EXT_import_context */ -#ifdef GLX_EXT_scene_marker - GLXEW_EXT_scene_marker = glxewGetExtension("GLX_EXT_scene_marker"); -#endif /* GLX_EXT_scene_marker */ -#ifdef GLX_EXT_visual_info - GLXEW_EXT_visual_info = glxewGetExtension("GLX_EXT_visual_info"); -#endif /* GLX_EXT_visual_info */ -#ifdef GLX_EXT_visual_rating - GLXEW_EXT_visual_rating = glxewGetExtension("GLX_EXT_visual_rating"); -#endif /* GLX_EXT_visual_rating */ -#ifdef GLX_MESA_agp_offset - GLXEW_MESA_agp_offset = glxewGetExtension("GLX_MESA_agp_offset"); - if (glewExperimental || GLXEW_MESA_agp_offset) GLXEW_MESA_agp_offset = !_glewInit_GLX_MESA_agp_offset(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_agp_offset */ -#ifdef GLX_MESA_copy_sub_buffer - GLXEW_MESA_copy_sub_buffer = glxewGetExtension("GLX_MESA_copy_sub_buffer"); - if (glewExperimental || GLXEW_MESA_copy_sub_buffer) GLXEW_MESA_copy_sub_buffer = !_glewInit_GLX_MESA_copy_sub_buffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_copy_sub_buffer */ -#ifdef GLX_MESA_pixmap_colormap - GLXEW_MESA_pixmap_colormap = glxewGetExtension("GLX_MESA_pixmap_colormap"); - if (glewExperimental || GLXEW_MESA_pixmap_colormap) GLXEW_MESA_pixmap_colormap = !_glewInit_GLX_MESA_pixmap_colormap(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_pixmap_colormap */ -#ifdef GLX_MESA_release_buffers - GLXEW_MESA_release_buffers = glxewGetExtension("GLX_MESA_release_buffers"); - if (glewExperimental || GLXEW_MESA_release_buffers) GLXEW_MESA_release_buffers = !_glewInit_GLX_MESA_release_buffers(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_release_buffers */ -#ifdef GLX_MESA_set_3dfx_mode - GLXEW_MESA_set_3dfx_mode = glxewGetExtension("GLX_MESA_set_3dfx_mode"); - if (glewExperimental || GLXEW_MESA_set_3dfx_mode) GLXEW_MESA_set_3dfx_mode = !_glewInit_GLX_MESA_set_3dfx_mode(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_MESA_set_3dfx_mode */ -#ifdef GLX_NV_float_buffer - GLXEW_NV_float_buffer = glxewGetExtension("GLX_NV_float_buffer"); -#endif /* GLX_NV_float_buffer */ -#ifdef GLX_NV_vertex_array_range - GLXEW_NV_vertex_array_range = glxewGetExtension("GLX_NV_vertex_array_range"); - if (glewExperimental || GLXEW_NV_vertex_array_range) GLXEW_NV_vertex_array_range = !_glewInit_GLX_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_NV_vertex_array_range */ -#ifdef GLX_OML_swap_method - GLXEW_OML_swap_method = glxewGetExtension("GLX_OML_swap_method"); -#endif /* GLX_OML_swap_method */ -#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) -#include - GLXEW_OML_sync_control = glxewGetExtension("GLX_OML_sync_control"); - if (glewExperimental || GLXEW_OML_sync_control) GLXEW_OML_sync_control = !_glewInit_GLX_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_OML_sync_control */ -#ifdef GLX_SGIS_blended_overlay - GLXEW_SGIS_blended_overlay = glxewGetExtension("GLX_SGIS_blended_overlay"); -#endif /* GLX_SGIS_blended_overlay */ -#ifdef GLX_SGIS_color_range - GLXEW_SGIS_color_range = glxewGetExtension("GLX_SGIS_color_range"); -#endif /* GLX_SGIS_color_range */ -#ifdef GLX_SGIS_multisample - GLXEW_SGIS_multisample = glxewGetExtension("GLX_SGIS_multisample"); -#endif /* GLX_SGIS_multisample */ -#ifdef GLX_SGIS_shared_multisample - GLXEW_SGIS_shared_multisample = glxewGetExtension("GLX_SGIS_shared_multisample"); -#endif /* GLX_SGIS_shared_multisample */ -#ifdef GLX_SGIX_fbconfig - GLXEW_SGIX_fbconfig = glxewGetExtension("GLX_SGIX_fbconfig"); - if (glewExperimental || GLXEW_SGIX_fbconfig) GLXEW_SGIX_fbconfig = !_glewInit_GLX_SGIX_fbconfig(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_fbconfig */ -#ifdef GLX_SGIX_pbuffer - GLXEW_SGIX_pbuffer = glxewGetExtension("GLX_SGIX_pbuffer"); - if (glewExperimental || GLXEW_SGIX_pbuffer) GLXEW_SGIX_pbuffer = !_glewInit_GLX_SGIX_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_pbuffer */ -#ifdef GLX_SGIX_swap_barrier - GLXEW_SGIX_swap_barrier = glxewGetExtension("GLX_SGIX_swap_barrier"); - if (glewExperimental || GLXEW_SGIX_swap_barrier) GLXEW_SGIX_swap_barrier = !_glewInit_GLX_SGIX_swap_barrier(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_swap_barrier */ -#ifdef GLX_SGIX_swap_group - GLXEW_SGIX_swap_group = glxewGetExtension("GLX_SGIX_swap_group"); - if (glewExperimental || GLXEW_SGIX_swap_group) GLXEW_SGIX_swap_group = !_glewInit_GLX_SGIX_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_swap_group */ -#ifdef GLX_SGIX_video_resize - GLXEW_SGIX_video_resize = glxewGetExtension("GLX_SGIX_video_resize"); - if (glewExperimental || GLXEW_SGIX_video_resize) GLXEW_SGIX_video_resize = !_glewInit_GLX_SGIX_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGIX_video_resize */ -#ifdef GLX_SGIX_visual_select_group - GLXEW_SGIX_visual_select_group = glxewGetExtension("GLX_SGIX_visual_select_group"); -#endif /* GLX_SGIX_visual_select_group */ -#ifdef GLX_SGI_cushion - GLXEW_SGI_cushion = glxewGetExtension("GLX_SGI_cushion"); - if (glewExperimental || GLXEW_SGI_cushion) GLXEW_SGI_cushion = !_glewInit_GLX_SGI_cushion(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGI_cushion */ -#ifdef GLX_SGI_make_current_read - GLXEW_SGI_make_current_read = glxewGetExtension("GLX_SGI_make_current_read"); - if (glewExperimental || GLXEW_SGI_make_current_read) GLXEW_SGI_make_current_read = !_glewInit_GLX_SGI_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGI_make_current_read */ -#ifdef GLX_SGI_swap_control - GLXEW_SGI_swap_control = glxewGetExtension("GLX_SGI_swap_control"); - if (glewExperimental || GLXEW_SGI_swap_control) GLXEW_SGI_swap_control = !_glewInit_GLX_SGI_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGI_swap_control */ -#ifdef GLX_SGI_video_sync - GLXEW_SGI_video_sync = glxewGetExtension("GLX_SGI_video_sync"); - if (glewExperimental || GLXEW_SGI_video_sync) GLXEW_SGI_video_sync = !_glewInit_GLX_SGI_video_sync(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SGI_video_sync */ -#ifdef GLX_SUN_get_transparent_index - GLXEW_SUN_get_transparent_index = glxewGetExtension("GLX_SUN_get_transparent_index"); - if (glewExperimental || GLXEW_SUN_get_transparent_index) GLXEW_SUN_get_transparent_index = !_glewInit_GLX_SUN_get_transparent_index(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SUN_get_transparent_index */ -#ifdef GLX_SUN_video_resize - GLXEW_SUN_video_resize = glxewGetExtension("GLX_SUN_video_resize"); - if (glewExperimental || GLXEW_SUN_video_resize) GLXEW_SUN_video_resize = !_glewInit_GLX_SUN_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); -#endif /* GLX_SUN_video_resize */ - - return GLEW_OK; -} - -#endif /* !__APPLE__ || GLEW_APPLE_GLX */ - -/* ------------------------------------------------------------------------ */ - -const GLubyte* glewGetErrorString (GLenum error) -{ - static const GLubyte* _glewErrorString[] = - { - (const GLubyte*)"No error", - (const GLubyte*)"Missing GL version", - (const GLubyte*)"GL 1.1 and up are not supported", - (const GLubyte*)"GLX 1.2 and up are not supported", - (const GLubyte*)"Unknown error" - }; - const int max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; - return _glewErrorString[(int)error > max_error ? max_error : (int)error]; -} - -const GLubyte* glewGetString (GLenum name) -{ - static const GLubyte* _glewString[] = - { - (const GLubyte*)NULL, - (const GLubyte*)"1.3.4" - }; - const int max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; - return _glewString[(int)name > max_string ? 0 : (int)name]; -} - -/* ------------------------------------------------------------------------ */ - -GLboolean glewExperimental = GL_FALSE; - -#if !defined(GLEW_MX) - -#if defined(_WIN32) -extern GLenum wglewContextInit (void); -#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */ -extern GLenum glxewContextInit (void); -#endif /* _WIN32 */ - -GLenum glewInit () -{ - GLenum r; - if ( (r = glewContextInit()) ) return r; -#if defined(_WIN32) - return wglewContextInit(); -#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) /* _UNIX */ - return glxewContextInit(); -#else - return r; -#endif /* _WIN32 */ -} - -#endif /* !GLEW_MX */ -#ifdef GLEW_MX -GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name) -#else -GLboolean glewIsSupported (const char* name) -#endif -{ - GLubyte* pos = (GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef GL_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = GLEW_VERSION_1_2; - continue; - } -#endif -#ifdef GL_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = GLEW_VERSION_1_3; - continue; - } -#endif -#ifdef GL_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = GLEW_VERSION_1_4; - continue; - } -#endif -#ifdef GL_VERSION_1_5 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) - { - ret = GLEW_VERSION_1_5; - continue; - } -#endif -#ifdef GL_VERSION_2_0 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) - { - ret = GLEW_VERSION_2_0; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef GL_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_3DFX_multisample; - continue; - } -#endif -#ifdef GL_3DFX_tbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) - { - ret = GLEW_3DFX_tbuffer; - continue; - } -#endif -#ifdef GL_3DFX_texture_compression_FXT1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) - { - ret = GLEW_3DFX_texture_compression_FXT1; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) - { -#ifdef GL_APPLE_client_storage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) - { - ret = GLEW_APPLE_client_storage; - continue; - } -#endif -#ifdef GL_APPLE_element_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) - { - ret = GLEW_APPLE_element_array; - continue; - } -#endif -#ifdef GL_APPLE_fence - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) - { - ret = GLEW_APPLE_fence; - continue; - } -#endif -#ifdef GL_APPLE_float_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) - { - ret = GLEW_APPLE_float_pixels; - continue; - } -#endif -#ifdef GL_APPLE_pixel_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) - { - ret = GLEW_APPLE_pixel_buffer; - continue; - } -#endif -#ifdef GL_APPLE_specular_vector - if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) - { - ret = GLEW_APPLE_specular_vector; - continue; - } -#endif -#ifdef GL_APPLE_texture_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) - { - ret = GLEW_APPLE_texture_range; - continue; - } -#endif -#ifdef GL_APPLE_transform_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) - { - ret = GLEW_APPLE_transform_hint; - continue; - } -#endif -#ifdef GL_APPLE_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_APPLE_vertex_array_object; - continue; - } -#endif -#ifdef GL_APPLE_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLEW_APPLE_vertex_array_range; - continue; - } -#endif -#ifdef GL_APPLE_ycbcr_422 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) - { - ret = GLEW_APPLE_ycbcr_422; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef GL_ARB_color_buffer_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) - { - ret = GLEW_ARB_color_buffer_float; - continue; - } -#endif -#ifdef GL_ARB_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_ARB_depth_texture; - continue; - } -#endif -#ifdef GL_ARB_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_ARB_draw_buffers; - continue; - } -#endif -#ifdef GL_ARB_fragment_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) - { - ret = GLEW_ARB_fragment_program; - continue; - } -#endif -#ifdef GL_ARB_fragment_program_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) - { - ret = GLEW_ARB_fragment_program_shadow; - continue; - } -#endif -#ifdef GL_ARB_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) - { - ret = GLEW_ARB_fragment_shader; - continue; - } -#endif -#ifdef GL_ARB_half_float_pixel - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) - { - ret = GLEW_ARB_half_float_pixel; - continue; - } -#endif -#ifdef GL_ARB_imaging - if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) - { - ret = GLEW_ARB_imaging; - continue; - } -#endif -#ifdef GL_ARB_matrix_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) - { - ret = GLEW_ARB_matrix_palette; - continue; - } -#endif -#ifdef GL_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_ARB_multisample; - continue; - } -#endif -#ifdef GL_ARB_multitexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) - { - ret = GLEW_ARB_multitexture; - continue; - } -#endif -#ifdef GL_ARB_occlusion_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) - { - ret = GLEW_ARB_occlusion_query; - continue; - } -#endif -#ifdef GL_ARB_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_ARB_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_point_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) - { - ret = GLEW_ARB_point_parameters; - continue; - } -#endif -#ifdef GL_ARB_point_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) - { - ret = GLEW_ARB_point_sprite; - continue; - } -#endif -#ifdef GL_ARB_shader_objects - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) - { - ret = GLEW_ARB_shader_objects; - continue; - } -#endif -#ifdef GL_ARB_shading_language_100 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) - { - ret = GLEW_ARB_shading_language_100; - continue; - } -#endif -#ifdef GL_ARB_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) - { - ret = GLEW_ARB_shadow; - continue; - } -#endif -#ifdef GL_ARB_shadow_ambient - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) - { - ret = GLEW_ARB_shadow_ambient; - continue; - } -#endif -#ifdef GL_ARB_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_ARB_texture_border_clamp; - continue; - } -#endif -#ifdef GL_ARB_texture_compression - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) - { - ret = GLEW_ARB_texture_compression; - continue; - } -#endif -#ifdef GL_ARB_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) - { - ret = GLEW_ARB_texture_cube_map; - continue; - } -#endif -#ifdef GL_ARB_texture_env_add - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) - { - ret = GLEW_ARB_texture_env_add; - continue; - } -#endif -#ifdef GL_ARB_texture_env_combine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) - { - ret = GLEW_ARB_texture_env_combine; - continue; - } -#endif -#ifdef GL_ARB_texture_env_crossbar - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) - { - ret = GLEW_ARB_texture_env_crossbar; - continue; - } -#endif -#ifdef GL_ARB_texture_env_dot3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) - { - ret = GLEW_ARB_texture_env_dot3; - continue; - } -#endif -#ifdef GL_ARB_texture_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) - { - ret = GLEW_ARB_texture_float; - continue; - } -#endif -#ifdef GL_ARB_texture_mirrored_repeat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) - { - ret = GLEW_ARB_texture_mirrored_repeat; - continue; - } -#endif -#ifdef GL_ARB_texture_non_power_of_two - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) - { - ret = GLEW_ARB_texture_non_power_of_two; - continue; - } -#endif -#ifdef GL_ARB_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_ARB_texture_rectangle; - continue; - } -#endif -#ifdef GL_ARB_transpose_matrix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) - { - ret = GLEW_ARB_transpose_matrix; - continue; - } -#endif -#ifdef GL_ARB_vertex_blend - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) - { - ret = GLEW_ARB_vertex_blend; - continue; - } -#endif -#ifdef GL_ARB_vertex_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) - { - ret = GLEW_ARB_vertex_buffer_object; - continue; - } -#endif -#ifdef GL_ARB_vertex_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) - { - ret = GLEW_ARB_vertex_program; - continue; - } -#endif -#ifdef GL_ARB_vertex_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) - { - ret = GLEW_ARB_vertex_shader; - continue; - } -#endif -#ifdef GL_ARB_window_pos - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) - { - ret = GLEW_ARB_window_pos; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) - { -#ifdef GL_ATIX_point_sprites - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) - { - ret = GLEW_ATIX_point_sprites; - continue; - } -#endif -#ifdef GL_ATIX_texture_env_combine3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) - { - ret = GLEW_ATIX_texture_env_combine3; - continue; - } -#endif -#ifdef GL_ATIX_texture_env_route - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) - { - ret = GLEW_ATIX_texture_env_route; - continue; - } -#endif -#ifdef GL_ATIX_vertex_shader_output_point_size - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) - { - ret = GLEW_ATIX_vertex_shader_output_point_size; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef GL_ATI_draw_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) - { - ret = GLEW_ATI_draw_buffers; - continue; - } -#endif -#ifdef GL_ATI_element_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) - { - ret = GLEW_ATI_element_array; - continue; - } -#endif -#ifdef GL_ATI_envmap_bumpmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) - { - ret = GLEW_ATI_envmap_bumpmap; - continue; - } -#endif -#ifdef GL_ATI_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) - { - ret = GLEW_ATI_fragment_shader; - continue; - } -#endif -#ifdef GL_ATI_map_object_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) - { - ret = GLEW_ATI_map_object_buffer; - continue; - } -#endif -#ifdef GL_ATI_pn_triangles - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) - { - ret = GLEW_ATI_pn_triangles; - continue; - } -#endif -#ifdef GL_ATI_separate_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) - { - ret = GLEW_ATI_separate_stencil; - continue; - } -#endif -#ifdef GL_ATI_text_fragment_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) - { - ret = GLEW_ATI_text_fragment_shader; - continue; - } -#endif -#ifdef GL_ATI_texture_compression_3dc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) - { - ret = GLEW_ATI_texture_compression_3dc; - continue; - } -#endif -#ifdef GL_ATI_texture_env_combine3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) - { - ret = GLEW_ATI_texture_env_combine3; - continue; - } -#endif -#ifdef GL_ATI_texture_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) - { - ret = GLEW_ATI_texture_float; - continue; - } -#endif -#ifdef GL_ATI_texture_mirror_once - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) - { - ret = GLEW_ATI_texture_mirror_once; - continue; - } -#endif -#ifdef GL_ATI_vertex_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) - { - ret = GLEW_ATI_vertex_array_object; - continue; - } -#endif -#ifdef GL_ATI_vertex_attrib_array_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) - { - ret = GLEW_ATI_vertex_attrib_array_object; - continue; - } -#endif -#ifdef GL_ATI_vertex_streams - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) - { - ret = GLEW_ATI_vertex_streams; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef GL_EXT_422_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) - { - ret = GLEW_EXT_422_pixels; - continue; - } -#endif -#ifdef GL_EXT_Cg_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) - { - ret = GLEW_EXT_Cg_shader; - continue; - } -#endif -#ifdef GL_EXT_abgr - if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) - { - ret = GLEW_EXT_abgr; - continue; - } -#endif -#ifdef GL_EXT_bgra - if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) - { - ret = GLEW_EXT_bgra; - continue; - } -#endif -#ifdef GL_EXT_blend_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) - { - ret = GLEW_EXT_blend_color; - continue; - } -#endif -#ifdef GL_EXT_blend_equation_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) - { - ret = GLEW_EXT_blend_equation_separate; - continue; - } -#endif -#ifdef GL_EXT_blend_func_separate - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) - { - ret = GLEW_EXT_blend_func_separate; - continue; - } -#endif -#ifdef GL_EXT_blend_logic_op - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) - { - ret = GLEW_EXT_blend_logic_op; - continue; - } -#endif -#ifdef GL_EXT_blend_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) - { - ret = GLEW_EXT_blend_minmax; - continue; - } -#endif -#ifdef GL_EXT_blend_subtract - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) - { - ret = GLEW_EXT_blend_subtract; - continue; - } -#endif -#ifdef GL_EXT_clip_volume_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) - { - ret = GLEW_EXT_clip_volume_hint; - continue; - } -#endif -#ifdef GL_EXT_cmyka - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) - { - ret = GLEW_EXT_cmyka; - continue; - } -#endif -#ifdef GL_EXT_color_subtable - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) - { - ret = GLEW_EXT_color_subtable; - continue; - } -#endif -#ifdef GL_EXT_compiled_vertex_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) - { - ret = GLEW_EXT_compiled_vertex_array; - continue; - } -#endif -#ifdef GL_EXT_convolution - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) - { - ret = GLEW_EXT_convolution; - continue; - } -#endif -#ifdef GL_EXT_coordinate_frame - if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) - { - ret = GLEW_EXT_coordinate_frame; - continue; - } -#endif -#ifdef GL_EXT_copy_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) - { - ret = GLEW_EXT_copy_texture; - continue; - } -#endif -#ifdef GL_EXT_cull_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) - { - ret = GLEW_EXT_cull_vertex; - continue; - } -#endif -#ifdef GL_EXT_depth_bounds_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) - { - ret = GLEW_EXT_depth_bounds_test; - continue; - } -#endif -#ifdef GL_EXT_draw_range_elements - if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) - { - ret = GLEW_EXT_draw_range_elements; - continue; - } -#endif -#ifdef GL_EXT_fog_coord - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) - { - ret = GLEW_EXT_fog_coord; - continue; - } -#endif -#ifdef GL_EXT_fragment_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) - { - ret = GLEW_EXT_fragment_lighting; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_blit - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) - { - ret = GLEW_EXT_framebuffer_blit; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) - { - ret = GLEW_EXT_framebuffer_multisample; - continue; - } -#endif -#ifdef GL_EXT_framebuffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) - { - ret = GLEW_EXT_framebuffer_object; - continue; - } -#endif -#ifdef GL_EXT_histogram - if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) - { - ret = GLEW_EXT_histogram; - continue; - } -#endif -#ifdef GL_EXT_index_array_formats - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) - { - ret = GLEW_EXT_index_array_formats; - continue; - } -#endif -#ifdef GL_EXT_index_func - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) - { - ret = GLEW_EXT_index_func; - continue; - } -#endif -#ifdef GL_EXT_index_material - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) - { - ret = GLEW_EXT_index_material; - continue; - } -#endif -#ifdef GL_EXT_index_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) - { - ret = GLEW_EXT_index_texture; - continue; - } -#endif -#ifdef GL_EXT_light_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) - { - ret = GLEW_EXT_light_texture; - continue; - } -#endif -#ifdef GL_EXT_misc_attribute - if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) - { - ret = GLEW_EXT_misc_attribute; - continue; - } -#endif -#ifdef GL_EXT_multi_draw_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) - { - ret = GLEW_EXT_multi_draw_arrays; - continue; - } -#endif -#ifdef GL_EXT_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_EXT_multisample; - continue; - } -#endif -#ifdef GL_EXT_packed_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) - { - ret = GLEW_EXT_packed_depth_stencil; - continue; - } -#endif -#ifdef GL_EXT_packed_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) - { - ret = GLEW_EXT_packed_pixels; - continue; - } -#endif -#ifdef GL_EXT_paletted_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) - { - ret = GLEW_EXT_paletted_texture; - continue; - } -#endif -#ifdef GL_EXT_pixel_buffer_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) - { - ret = GLEW_EXT_pixel_buffer_object; - continue; - } -#endif -#ifdef GL_EXT_pixel_transform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) - { - ret = GLEW_EXT_pixel_transform; - continue; - } -#endif -#ifdef GL_EXT_pixel_transform_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) - { - ret = GLEW_EXT_pixel_transform_color_table; - continue; - } -#endif -#ifdef GL_EXT_point_parameters - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) - { - ret = GLEW_EXT_point_parameters; - continue; - } -#endif -#ifdef GL_EXT_polygon_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) - { - ret = GLEW_EXT_polygon_offset; - continue; - } -#endif -#ifdef GL_EXT_rescale_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) - { - ret = GLEW_EXT_rescale_normal; - continue; - } -#endif -#ifdef GL_EXT_scene_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) - { - ret = GLEW_EXT_scene_marker; - continue; - } -#endif -#ifdef GL_EXT_secondary_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) - { - ret = GLEW_EXT_secondary_color; - continue; - } -#endif -#ifdef GL_EXT_separate_specular_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) - { - ret = GLEW_EXT_separate_specular_color; - continue; - } -#endif -#ifdef GL_EXT_shadow_funcs - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) - { - ret = GLEW_EXT_shadow_funcs; - continue; - } -#endif -#ifdef GL_EXT_shared_texture_palette - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) - { - ret = GLEW_EXT_shared_texture_palette; - continue; - } -#endif -#ifdef GL_EXT_stencil_clear_tag - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) - { - ret = GLEW_EXT_stencil_clear_tag; - continue; - } -#endif -#ifdef GL_EXT_stencil_two_side - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) - { - ret = GLEW_EXT_stencil_two_side; - continue; - } -#endif -#ifdef GL_EXT_stencil_wrap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) - { - ret = GLEW_EXT_stencil_wrap; - continue; - } -#endif -#ifdef GL_EXT_subtexture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) - { - ret = GLEW_EXT_subtexture; - continue; - } -#endif -#ifdef GL_EXT_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) - { - ret = GLEW_EXT_texture; - continue; - } -#endif -#ifdef GL_EXT_texture3D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) - { - ret = GLEW_EXT_texture3D; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_dxt1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) - { - ret = GLEW_EXT_texture_compression_dxt1; - continue; - } -#endif -#ifdef GL_EXT_texture_compression_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) - { - ret = GLEW_EXT_texture_compression_s3tc; - continue; - } -#endif -#ifdef GL_EXT_texture_cube_map - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) - { - ret = GLEW_EXT_texture_cube_map; - continue; - } -#endif -#ifdef GL_EXT_texture_edge_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) - { - ret = GLEW_EXT_texture_edge_clamp; - continue; - } -#endif -#ifdef GL_EXT_texture_env - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) - { - ret = GLEW_EXT_texture_env; - continue; - } -#endif -#ifdef GL_EXT_texture_env_add - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) - { - ret = GLEW_EXT_texture_env_add; - continue; - } -#endif -#ifdef GL_EXT_texture_env_combine - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) - { - ret = GLEW_EXT_texture_env_combine; - continue; - } -#endif -#ifdef GL_EXT_texture_env_dot3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) - { - ret = GLEW_EXT_texture_env_dot3; - continue; - } -#endif -#ifdef GL_EXT_texture_filter_anisotropic - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) - { - ret = GLEW_EXT_texture_filter_anisotropic; - continue; - } -#endif -#ifdef GL_EXT_texture_lod_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) - { - ret = GLEW_EXT_texture_lod_bias; - continue; - } -#endif -#ifdef GL_EXT_texture_mirror_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) - { - ret = GLEW_EXT_texture_mirror_clamp; - continue; - } -#endif -#ifdef GL_EXT_texture_object - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) - { - ret = GLEW_EXT_texture_object; - continue; - } -#endif -#ifdef GL_EXT_texture_perturb_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) - { - ret = GLEW_EXT_texture_perturb_normal; - continue; - } -#endif -#ifdef GL_EXT_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_EXT_texture_rectangle; - continue; - } -#endif -#ifdef GL_EXT_texture_sRGB - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) - { - ret = GLEW_EXT_texture_sRGB; - continue; - } -#endif -#ifdef GL_EXT_vertex_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) - { - ret = GLEW_EXT_vertex_array; - continue; - } -#endif -#ifdef GL_EXT_vertex_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) - { - ret = GLEW_EXT_vertex_shader; - continue; - } -#endif -#ifdef GL_EXT_vertex_weighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) - { - ret = GLEW_EXT_vertex_weighting; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) - { -#ifdef GL_GREMEDY_string_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) - { - ret = GLEW_GREMEDY_string_marker; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) - { -#ifdef GL_HP_convolution_border_modes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) - { - ret = GLEW_HP_convolution_border_modes; - continue; - } -#endif -#ifdef GL_HP_image_transform - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) - { - ret = GLEW_HP_image_transform; - continue; - } -#endif -#ifdef GL_HP_occlusion_test - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) - { - ret = GLEW_HP_occlusion_test; - continue; - } -#endif -#ifdef GL_HP_texture_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) - { - ret = GLEW_HP_texture_lighting; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) - { -#ifdef GL_IBM_cull_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) - { - ret = GLEW_IBM_cull_vertex; - continue; - } -#endif -#ifdef GL_IBM_multimode_draw_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) - { - ret = GLEW_IBM_multimode_draw_arrays; - continue; - } -#endif -#ifdef GL_IBM_rasterpos_clip - if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) - { - ret = GLEW_IBM_rasterpos_clip; - continue; - } -#endif -#ifdef GL_IBM_static_data - if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) - { - ret = GLEW_IBM_static_data; - continue; - } -#endif -#ifdef GL_IBM_texture_mirrored_repeat - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) - { - ret = GLEW_IBM_texture_mirrored_repeat; - continue; - } -#endif -#ifdef GL_IBM_vertex_array_lists - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) - { - ret = GLEW_IBM_vertex_array_lists; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) - { -#ifdef GL_INGR_color_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) - { - ret = GLEW_INGR_color_clamp; - continue; - } -#endif -#ifdef GL_INGR_interlace_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) - { - ret = GLEW_INGR_interlace_read; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) - { -#ifdef GL_INTEL_parallel_arrays - if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) - { - ret = GLEW_INTEL_parallel_arrays; - continue; - } -#endif -#ifdef GL_INTEL_texture_scissor - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) - { - ret = GLEW_INTEL_texture_scissor; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) - { -#ifdef GL_KTX_buffer_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) - { - ret = GLEW_KTX_buffer_region; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) - { -#ifdef GL_MESAX_texture_stack - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) - { - ret = GLEW_MESAX_texture_stack; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef GL_MESA_pack_invert - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) - { - ret = GLEW_MESA_pack_invert; - continue; - } -#endif -#ifdef GL_MESA_resize_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) - { - ret = GLEW_MESA_resize_buffers; - continue; - } -#endif -#ifdef GL_MESA_window_pos - if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) - { - ret = GLEW_MESA_window_pos; - continue; - } -#endif -#ifdef GL_MESA_ycbcr_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) - { - ret = GLEW_MESA_ycbcr_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef GL_NV_blend_square - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) - { - ret = GLEW_NV_blend_square; - continue; - } -#endif -#ifdef GL_NV_copy_depth_to_color - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) - { - ret = GLEW_NV_copy_depth_to_color; - continue; - } -#endif -#ifdef GL_NV_depth_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) - { - ret = GLEW_NV_depth_clamp; - continue; - } -#endif -#ifdef GL_NV_evaluators - if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) - { - ret = GLEW_NV_evaluators; - continue; - } -#endif -#ifdef GL_NV_fence - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) - { - ret = GLEW_NV_fence; - continue; - } -#endif -#ifdef GL_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = GLEW_NV_float_buffer; - continue; - } -#endif -#ifdef GL_NV_fog_distance - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) - { - ret = GLEW_NV_fog_distance; - continue; - } -#endif -#ifdef GL_NV_fragment_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) - { - ret = GLEW_NV_fragment_program; - continue; - } -#endif -#ifdef GL_NV_fragment_program2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) - { - ret = GLEW_NV_fragment_program2; - continue; - } -#endif -#ifdef GL_NV_fragment_program_option - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) - { - ret = GLEW_NV_fragment_program_option; - continue; - } -#endif -#ifdef GL_NV_half_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) - { - ret = GLEW_NV_half_float; - continue; - } -#endif -#ifdef GL_NV_light_max_exponent - if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) - { - ret = GLEW_NV_light_max_exponent; - continue; - } -#endif -#ifdef GL_NV_multisample_filter_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) - { - ret = GLEW_NV_multisample_filter_hint; - continue; - } -#endif -#ifdef GL_NV_occlusion_query - if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) - { - ret = GLEW_NV_occlusion_query; - continue; - } -#endif -#ifdef GL_NV_packed_depth_stencil - if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) - { - ret = GLEW_NV_packed_depth_stencil; - continue; - } -#endif -#ifdef GL_NV_pixel_data_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) - { - ret = GLEW_NV_pixel_data_range; - continue; - } -#endif -#ifdef GL_NV_point_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) - { - ret = GLEW_NV_point_sprite; - continue; - } -#endif -#ifdef GL_NV_primitive_restart - if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) - { - ret = GLEW_NV_primitive_restart; - continue; - } -#endif -#ifdef GL_NV_register_combiners - if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) - { - ret = GLEW_NV_register_combiners; - continue; - } -#endif -#ifdef GL_NV_register_combiners2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) - { - ret = GLEW_NV_register_combiners2; - continue; - } -#endif -#ifdef GL_NV_texgen_emboss - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) - { - ret = GLEW_NV_texgen_emboss; - continue; - } -#endif -#ifdef GL_NV_texgen_reflection - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) - { - ret = GLEW_NV_texgen_reflection; - continue; - } -#endif -#ifdef GL_NV_texture_compression_vtc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) - { - ret = GLEW_NV_texture_compression_vtc; - continue; - } -#endif -#ifdef GL_NV_texture_env_combine4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) - { - ret = GLEW_NV_texture_env_combine4; - continue; - } -#endif -#ifdef GL_NV_texture_expand_normal - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) - { - ret = GLEW_NV_texture_expand_normal; - continue; - } -#endif -#ifdef GL_NV_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) - { - ret = GLEW_NV_texture_rectangle; - continue; - } -#endif -#ifdef GL_NV_texture_shader - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) - { - ret = GLEW_NV_texture_shader; - continue; - } -#endif -#ifdef GL_NV_texture_shader2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) - { - ret = GLEW_NV_texture_shader2; - continue; - } -#endif -#ifdef GL_NV_texture_shader3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) - { - ret = GLEW_NV_texture_shader3; - continue; - } -#endif -#ifdef GL_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLEW_NV_vertex_array_range; - continue; - } -#endif -#ifdef GL_NV_vertex_array_range2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) - { - ret = GLEW_NV_vertex_array_range2; - continue; - } -#endif -#ifdef GL_NV_vertex_program - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) - { - ret = GLEW_NV_vertex_program; - continue; - } -#endif -#ifdef GL_NV_vertex_program1_1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) - { - ret = GLEW_NV_vertex_program1_1; - continue; - } -#endif -#ifdef GL_NV_vertex_program2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) - { - ret = GLEW_NV_vertex_program2; - continue; - } -#endif -#ifdef GL_NV_vertex_program2_option - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) - { - ret = GLEW_NV_vertex_program2_option; - continue; - } -#endif -#ifdef GL_NV_vertex_program3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) - { - ret = GLEW_NV_vertex_program3; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef GL_OML_interlace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) - { - ret = GLEW_OML_interlace; - continue; - } -#endif -#ifdef GL_OML_resample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) - { - ret = GLEW_OML_resample; - continue; - } -#endif -#ifdef GL_OML_subsample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) - { - ret = GLEW_OML_subsample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) - { -#ifdef GL_PGI_misc_hints - if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) - { - ret = GLEW_PGI_misc_hints; - continue; - } -#endif -#ifdef GL_PGI_vertex_hints - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) - { - ret = GLEW_PGI_vertex_hints; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) - { -#ifdef GL_REND_screen_coordinates - if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) - { - ret = GLEW_REND_screen_coordinates; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) - { -#ifdef GL_S3_s3tc - if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) - { - ret = GLEW_S3_s3tc; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) - { -#ifdef GL_SGIS_color_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) - { - ret = GLEW_SGIS_color_range; - continue; - } -#endif -#ifdef GL_SGIS_detail_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) - { - ret = GLEW_SGIS_detail_texture; - continue; - } -#endif -#ifdef GL_SGIS_fog_function - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) - { - ret = GLEW_SGIS_fog_function; - continue; - } -#endif -#ifdef GL_SGIS_generate_mipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) - { - ret = GLEW_SGIS_generate_mipmap; - continue; - } -#endif -#ifdef GL_SGIS_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLEW_SGIS_multisample; - continue; - } -#endif -#ifdef GL_SGIS_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) - { - ret = GLEW_SGIS_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIS_sharpen_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) - { - ret = GLEW_SGIS_sharpen_texture; - continue; - } -#endif -#ifdef GL_SGIS_texture4D - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) - { - ret = GLEW_SGIS_texture4D; - continue; - } -#endif -#ifdef GL_SGIS_texture_border_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) - { - ret = GLEW_SGIS_texture_border_clamp; - continue; - } -#endif -#ifdef GL_SGIS_texture_edge_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) - { - ret = GLEW_SGIS_texture_edge_clamp; - continue; - } -#endif -#ifdef GL_SGIS_texture_filter4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) - { - ret = GLEW_SGIS_texture_filter4; - continue; - } -#endif -#ifdef GL_SGIS_texture_lod - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) - { - ret = GLEW_SGIS_texture_lod; - continue; - } -#endif -#ifdef GL_SGIS_texture_select - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) - { - ret = GLEW_SGIS_texture_select; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) - { -#ifdef GL_SGIX_async - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) - { - ret = GLEW_SGIX_async; - continue; - } -#endif -#ifdef GL_SGIX_async_histogram - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) - { - ret = GLEW_SGIX_async_histogram; - continue; - } -#endif -#ifdef GL_SGIX_async_pixel - if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) - { - ret = GLEW_SGIX_async_pixel; - continue; - } -#endif -#ifdef GL_SGIX_blend_alpha_minmax - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) - { - ret = GLEW_SGIX_blend_alpha_minmax; - continue; - } -#endif -#ifdef GL_SGIX_clipmap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) - { - ret = GLEW_SGIX_clipmap; - continue; - } -#endif -#ifdef GL_SGIX_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) - { - ret = GLEW_SGIX_depth_texture; - continue; - } -#endif -#ifdef GL_SGIX_flush_raster - if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) - { - ret = GLEW_SGIX_flush_raster; - continue; - } -#endif -#ifdef GL_SGIX_fog_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) - { - ret = GLEW_SGIX_fog_offset; - continue; - } -#endif -#ifdef GL_SGIX_fog_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) - { - ret = GLEW_SGIX_fog_texture; - continue; - } -#endif -#ifdef GL_SGIX_fragment_specular_lighting - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) - { - ret = GLEW_SGIX_fragment_specular_lighting; - continue; - } -#endif -#ifdef GL_SGIX_framezoom - if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) - { - ret = GLEW_SGIX_framezoom; - continue; - } -#endif -#ifdef GL_SGIX_interlace - if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) - { - ret = GLEW_SGIX_interlace; - continue; - } -#endif -#ifdef GL_SGIX_ir_instrument1 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) - { - ret = GLEW_SGIX_ir_instrument1; - continue; - } -#endif -#ifdef GL_SGIX_list_priority - if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) - { - ret = GLEW_SGIX_list_priority; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) - { - ret = GLEW_SGIX_pixel_texture; - continue; - } -#endif -#ifdef GL_SGIX_pixel_texture_bits - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) - { - ret = GLEW_SGIX_pixel_texture_bits; - continue; - } -#endif -#ifdef GL_SGIX_reference_plane - if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) - { - ret = GLEW_SGIX_reference_plane; - continue; - } -#endif -#ifdef GL_SGIX_resample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) - { - ret = GLEW_SGIX_resample; - continue; - } -#endif -#ifdef GL_SGIX_shadow - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) - { - ret = GLEW_SGIX_shadow; - continue; - } -#endif -#ifdef GL_SGIX_shadow_ambient - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) - { - ret = GLEW_SGIX_shadow_ambient; - continue; - } -#endif -#ifdef GL_SGIX_sprite - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) - { - ret = GLEW_SGIX_sprite; - continue; - } -#endif -#ifdef GL_SGIX_tag_sample_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) - { - ret = GLEW_SGIX_tag_sample_buffer; - continue; - } -#endif -#ifdef GL_SGIX_texture_add_env - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) - { - ret = GLEW_SGIX_texture_add_env; - continue; - } -#endif -#ifdef GL_SGIX_texture_coordinate_clamp - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) - { - ret = GLEW_SGIX_texture_coordinate_clamp; - continue; - } -#endif -#ifdef GL_SGIX_texture_lod_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) - { - ret = GLEW_SGIX_texture_lod_bias; - continue; - } -#endif -#ifdef GL_SGIX_texture_multi_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) - { - ret = GLEW_SGIX_texture_multi_buffer; - continue; - } -#endif -#ifdef GL_SGIX_texture_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) - { - ret = GLEW_SGIX_texture_range; - continue; - } -#endif -#ifdef GL_SGIX_texture_scale_bias - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) - { - ret = GLEW_SGIX_texture_scale_bias; - continue; - } -#endif -#ifdef GL_SGIX_vertex_preclip - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) - { - ret = GLEW_SGIX_vertex_preclip; - continue; - } -#endif -#ifdef GL_SGIX_vertex_preclip_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) - { - ret = GLEW_SGIX_vertex_preclip_hint; - continue; - } -#endif -#ifdef GL_SGIX_ycrcb - if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) - { - ret = GLEW_SGIX_ycrcb; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) - { -#ifdef GL_SGI_color_matrix - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) - { - ret = GLEW_SGI_color_matrix; - continue; - } -#endif -#ifdef GL_SGI_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) - { - ret = GLEW_SGI_color_table; - continue; - } -#endif -#ifdef GL_SGI_texture_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) - { - ret = GLEW_SGI_texture_color_table; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) - { -#ifdef GL_SUNX_constant_data - if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) - { - ret = GLEW_SUNX_constant_data; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) - { -#ifdef GL_SUN_convolution_border_modes - if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) - { - ret = GLEW_SUN_convolution_border_modes; - continue; - } -#endif -#ifdef GL_SUN_global_alpha - if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) - { - ret = GLEW_SUN_global_alpha; - continue; - } -#endif -#ifdef GL_SUN_mesh_array - if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) - { - ret = GLEW_SUN_mesh_array; - continue; - } -#endif -#ifdef GL_SUN_read_video_pixels - if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) - { - ret = GLEW_SUN_read_video_pixels; - continue; - } -#endif -#ifdef GL_SUN_slice_accum - if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) - { - ret = GLEW_SUN_slice_accum; - continue; - } -#endif -#ifdef GL_SUN_triangle_list - if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) - { - ret = GLEW_SUN_triangle_list; - continue; - } -#endif -#ifdef GL_SUN_vertex - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) - { - ret = GLEW_SUN_vertex; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) - { -#ifdef GL_WIN_phong_shading - if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) - { - ret = GLEW_WIN_phong_shading; - continue; - } -#endif -#ifdef GL_WIN_specular_fog - if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) - { - ret = GLEW_WIN_specular_fog; - continue; - } -#endif -#ifdef GL_WIN_swap_hint - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) - { - ret = GLEW_WIN_swap_hint; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#if defined(_WIN32) - -#if defined(GLEW_MX) -GLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name) -#else -GLboolean wglewIsSupported (const char* name) -#endif -{ - GLubyte* pos = (GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef WGL_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_3DFX_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) - { -#ifdef WGL_3DL_stereo_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) - { - ret = WGLEW_3DL_stereo_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef WGL_ARB_buffer_region - if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) - { - ret = WGLEW_ARB_buffer_region; - continue; - } -#endif -#ifdef WGL_ARB_extensions_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) - { - ret = WGLEW_ARB_extensions_string; - continue; - } -#endif -#ifdef WGL_ARB_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = WGLEW_ARB_make_current_read; - continue; - } -#endif -#ifdef WGL_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_ARB_multisample; - continue; - } -#endif -#ifdef WGL_ARB_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = WGLEW_ARB_pbuffer; - continue; - } -#endif -#ifdef WGL_ARB_pixel_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) - { - ret = WGLEW_ARB_pixel_format; - continue; - } -#endif -#ifdef WGL_ARB_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = WGLEW_ARB_pixel_format_float; - continue; - } -#endif -#ifdef WGL_ARB_render_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) - { - ret = WGLEW_ARB_render_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef WGL_ATI_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = WGLEW_ATI_pixel_format_float; - continue; - } -#endif -#ifdef WGL_ATI_render_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) - { - ret = WGLEW_ATI_render_texture_rectangle; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef WGL_EXT_depth_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) - { - ret = WGLEW_EXT_depth_float; - continue; - } -#endif -#ifdef WGL_EXT_display_color_table - if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) - { - ret = WGLEW_EXT_display_color_table; - continue; - } -#endif -#ifdef WGL_EXT_extensions_string - if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) - { - ret = WGLEW_EXT_extensions_string; - continue; - } -#endif -#ifdef WGL_EXT_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = WGLEW_EXT_make_current_read; - continue; - } -#endif -#ifdef WGL_EXT_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = WGLEW_EXT_multisample; - continue; - } -#endif -#ifdef WGL_EXT_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = WGLEW_EXT_pbuffer; - continue; - } -#endif -#ifdef WGL_EXT_pixel_format - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) - { - ret = WGLEW_EXT_pixel_format; - continue; - } -#endif -#ifdef WGL_EXT_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = WGLEW_EXT_swap_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) - { -#ifdef WGL_I3D_digital_video_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) - { - ret = WGLEW_I3D_digital_video_control; - continue; - } -#endif -#ifdef WGL_I3D_gamma - if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) - { - ret = WGLEW_I3D_gamma; - continue; - } -#endif -#ifdef WGL_I3D_genlock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) - { - ret = WGLEW_I3D_genlock; - continue; - } -#endif -#ifdef WGL_I3D_image_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) - { - ret = WGLEW_I3D_image_buffer; - continue; - } -#endif -#ifdef WGL_I3D_swap_frame_lock - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) - { - ret = WGLEW_I3D_swap_frame_lock; - continue; - } -#endif -#ifdef WGL_I3D_swap_frame_usage - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) - { - ret = WGLEW_I3D_swap_frame_usage; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef WGL_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = WGLEW_NV_float_buffer; - continue; - } -#endif -#ifdef WGL_NV_render_depth_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) - { - ret = WGLEW_NV_render_depth_texture; - continue; - } -#endif -#ifdef WGL_NV_render_texture_rectangle - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) - { - ret = WGLEW_NV_render_texture_rectangle; - continue; - } -#endif -#ifdef WGL_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = WGLEW_NV_vertex_array_range; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef WGL_OML_sync_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) - { - ret = WGLEW_OML_sync_control; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) - -#if defined(GLEW_MX) -GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name) -#else -GLboolean glxewIsSupported (const char* name) -#endif -{ - GLubyte* pos = (GLubyte*)name; - GLuint len = _glewStrLen(pos); - GLboolean ret = GL_TRUE; - while (ret && len > 0) - { - if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) - { - if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) - { -#ifdef GLX_VERSION_1_2 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) - { - ret = GLXEW_VERSION_1_2; - continue; - } -#endif -#ifdef GLX_VERSION_1_3 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) - { - ret = GLXEW_VERSION_1_3; - continue; - } -#endif -#ifdef GLX_VERSION_1_4 - if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) - { - ret = GLXEW_VERSION_1_4; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) - { -#ifdef GLX_3DFX_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_3DFX_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) - { -#ifdef GLX_ARB_fbconfig_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) - { - ret = GLXEW_ARB_fbconfig_float; - continue; - } -#endif -#ifdef GLX_ARB_get_proc_address - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) - { - ret = GLXEW_ARB_get_proc_address; - continue; - } -#endif -#ifdef GLX_ARB_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_ARB_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) - { -#ifdef GLX_ATI_pixel_format_float - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) - { - ret = GLXEW_ATI_pixel_format_float; - continue; - } -#endif -#ifdef GLX_ATI_render_texture - if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) - { - ret = GLXEW_ATI_render_texture; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) - { -#ifdef GLX_EXT_import_context - if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) - { - ret = GLXEW_EXT_import_context; - continue; - } -#endif -#ifdef GLX_EXT_scene_marker - if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) - { - ret = GLXEW_EXT_scene_marker; - continue; - } -#endif -#ifdef GLX_EXT_visual_info - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) - { - ret = GLXEW_EXT_visual_info; - continue; - } -#endif -#ifdef GLX_EXT_visual_rating - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) - { - ret = GLXEW_EXT_visual_rating; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) - { -#ifdef GLX_MESA_agp_offset - if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) - { - ret = GLXEW_MESA_agp_offset; - continue; - } -#endif -#ifdef GLX_MESA_copy_sub_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) - { - ret = GLXEW_MESA_copy_sub_buffer; - continue; - } -#endif -#ifdef GLX_MESA_pixmap_colormap - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) - { - ret = GLXEW_MESA_pixmap_colormap; - continue; - } -#endif -#ifdef GLX_MESA_release_buffers - if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) - { - ret = GLXEW_MESA_release_buffers; - continue; - } -#endif -#ifdef GLX_MESA_set_3dfx_mode - if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) - { - ret = GLXEW_MESA_set_3dfx_mode; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) - { -#ifdef GLX_NV_float_buffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) - { - ret = GLXEW_NV_float_buffer; - continue; - } -#endif -#ifdef GLX_NV_vertex_array_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) - { - ret = GLXEW_NV_vertex_array_range; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) - { -#ifdef GLX_OML_swap_method - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) - { - ret = GLXEW_OML_swap_method; - continue; - } -#endif -#if defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) -#include - if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) - { - ret = GLXEW_OML_sync_control; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) - { -#ifdef GLX_SGIS_blended_overlay - if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) - { - ret = GLXEW_SGIS_blended_overlay; - continue; - } -#endif -#ifdef GLX_SGIS_color_range - if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) - { - ret = GLXEW_SGIS_color_range; - continue; - } -#endif -#ifdef GLX_SGIS_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) - { - ret = GLXEW_SGIS_multisample; - continue; - } -#endif -#ifdef GLX_SGIS_shared_multisample - if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) - { - ret = GLXEW_SGIS_shared_multisample; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) - { -#ifdef GLX_SGIX_fbconfig - if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) - { - ret = GLXEW_SGIX_fbconfig; - continue; - } -#endif -#ifdef GLX_SGIX_pbuffer - if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) - { - ret = GLXEW_SGIX_pbuffer; - continue; - } -#endif -#ifdef GLX_SGIX_swap_barrier - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) - { - ret = GLXEW_SGIX_swap_barrier; - continue; - } -#endif -#ifdef GLX_SGIX_swap_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) - { - ret = GLXEW_SGIX_swap_group; - continue; - } -#endif -#ifdef GLX_SGIX_video_resize - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) - { - ret = GLXEW_SGIX_video_resize; - continue; - } -#endif -#ifdef GLX_SGIX_visual_select_group - if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) - { - ret = GLXEW_SGIX_visual_select_group; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) - { -#ifdef GLX_SGI_cushion - if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) - { - ret = GLXEW_SGI_cushion; - continue; - } -#endif -#ifdef GLX_SGI_make_current_read - if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) - { - ret = GLXEW_SGI_make_current_read; - continue; - } -#endif -#ifdef GLX_SGI_swap_control - if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) - { - ret = GLXEW_SGI_swap_control; - continue; - } -#endif -#ifdef GLX_SGI_video_sync - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) - { - ret = GLXEW_SGI_video_sync; - continue; - } -#endif - } - if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) - { -#ifdef GLX_SUN_get_transparent_index - if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) - { - ret = GLXEW_SUN_get_transparent_index; - continue; - } -#endif -#ifdef GLX_SUN_video_resize - if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) - { - ret = GLXEW_SUN_video_resize; - continue; - } -#endif - } - } - ret = (len == 0); - } - return ret; -} - -#endif /* _WIN32 */ diff --git a/src/SFML/Graphics/ImageLoader.cpp b/src/SFML/Graphics/ImageLoader.cpp index baa2cf22..dc037283 100644 --- a/src/SFML/Graphics/ImageLoader.cpp +++ b/src/SFML/Graphics/ImageLoader.cpp @@ -26,14 +26,14 @@ // Headers //////////////////////////////////////////////////////////// #include +#include extern "C" { - #include - #include + #include + #include } -#include -#include -#include +#include +#include namespace diff --git a/src/SFML/Graphics/Linux/RenderImageImplPBuffer.hpp b/src/SFML/Graphics/Linux/RenderImageImplPBuffer.hpp index 06ef0727..33469d3d 100644 --- a/src/SFML/Graphics/Linux/RenderImageImplPBuffer.hpp +++ b/src/SFML/Graphics/Linux/RenderImageImplPBuffer.hpp @@ -29,8 +29,8 @@ // Headers //////////////////////////////////////////////////////////// #include -#include -#include +#include +#include #include diff --git a/src/SFML/Graphics/SOIL/SOIL.c b/src/SFML/Graphics/SOIL/SOIL.c deleted file mode 100644 index b4b24e5b..00000000 --- a/src/SFML/Graphics/SOIL/SOIL.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - Jonathan Dummer - 2007-07-26-10.36 - - Simple OpenGL Image Library - - Public Domain - using Sean Barret's stb_image as a base - - Thanks to: - * Sean Barret - for the awesome stb_image - * Dan Venkitachalam - for finding some non-compliant DDS files, and patching some explicit casts - * everybody at gamedev.net -*/ - -#include "SOIL.h" -#include "stb_image_aug.h" -#include "image_DXT.h" - -#include -#include - -/* error reporting */ -char *result_string_pointer = "SOIL initialized"; - -unsigned char* - SOIL_load_image - ( - const char *filename, - int *width, int *height, int *channels, - int force_channels - ) -{ - unsigned char *result = stbi_load( filename, - width, height, channels, force_channels ); - if( result == NULL ) - { - result_string_pointer = stbi_failure_reason(); - } else - { - result_string_pointer = "Image loaded"; - } - return result; -} - -unsigned char* - SOIL_load_image_from_memory - ( - const unsigned char *const buffer, - int buffer_length, - int *width, int *height, int *channels, - int force_channels - ) -{ - unsigned char *result = stbi_load_from_memory( - buffer, buffer_length, - width, height, channels, - force_channels ); - if( result == NULL ) - { - result_string_pointer = stbi_failure_reason(); - } else - { - result_string_pointer = "Image loaded from memory"; - } - return result; -} - -int - SOIL_save_image - ( - const char *filename, - int image_type, - int width, int height, int channels, - const unsigned char *const data - ) -{ - int save_result; - - /* error check */ - if( (width < 1) || (height < 1) || - (channels < 1) || (channels > 4) || - (data == NULL) || - (filename == NULL) ) - { - return 0; - } - if( image_type == SOIL_SAVE_TYPE_BMP ) - { - save_result = stbi_write_bmp( filename, - width, height, channels, (void*)data ); - } else - if( image_type == SOIL_SAVE_TYPE_TGA ) - { - save_result = stbi_write_tga( filename, - width, height, channels, (void*)data ); - } else - if( image_type == SOIL_SAVE_TYPE_DDS ) - { - save_result = save_image_as_DDS( filename, - width, height, channels, (const unsigned char *const)data ); - } else - { - save_result = 0; - } - if( save_result == 0 ) - { - result_string_pointer = "Saving the image failed"; - } else - { - result_string_pointer = "Image saved"; - } - return save_result; -} - -void - SOIL_free_image_data - ( - unsigned char *img_data - ) -{ - free( (void*)img_data ); -} - -const char* - SOIL_last_result - ( - void - ) -{ - return result_string_pointer; -} diff --git a/src/SFML/Graphics/SOIL/image_DXT.c b/src/SFML/Graphics/SOIL/image_DXT.c deleted file mode 100644 index eb90be67..00000000 --- a/src/SFML/Graphics/SOIL/image_DXT.c +++ /dev/null @@ -1,632 +0,0 @@ -/* - Jonathan Dummer - 2007-07-31-10.32 - - simple DXT compression / decompression code - - public domain -*/ - -#include "image_DXT.h" -#include -#include -#include -#include - -/* set this =1 if you want to use the covarince matrix method... - which is better than my method of using standard deviations - overall, except on the infintesimal chance that the power - method fails for finding the largest eigenvector */ -#define USE_COV_MAT 1 - -/********* Function Prototypes *********/ -/* - Takes a 4x4 block of pixels and compresses it into 8 bytes - in DXT1 format (color only, no alpha). Speed is valued - over prettyness, at least for now. -*/ -void compress_DDS_color_block( - int channels, - const unsigned char *const uncompressed, - unsigned char compressed[8] ); -/* - Takes a 4x4 block of pixels and compresses the alpha - component it into 8 bytes for use in DXT5 DDS files. - Speed is valued over prettyness, at least for now. -*/ -void compress_DDS_alpha_block( - const unsigned char *const uncompressed, - unsigned char compressed[8] ); - -/********* Actual Exposed Functions *********/ -int - save_image_as_DDS - ( - const char *filename, - int width, int height, int channels, - const unsigned char *const data - ) -{ - /* variables */ - FILE *fout; - unsigned char *DDS_data; - DDS_header header; - int DDS_size; - /* error check */ - if( (NULL == filename) || - (width < 1) || (height < 1) || - (channels < 1) || (channels > 4) || - (data == NULL ) ) - { - return 0; - } - /* Convert the image */ - if( (channels & 1) == 1 ) - { - /* no alpha, just use DXT1 */ - DDS_data = convert_image_to_DXT1( data, width, height, channels, &DDS_size ); - } else - { - /* has alpha, so use DXT5 */ - DDS_data = convert_image_to_DXT5( data, width, height, channels, &DDS_size ); - } - /* save it */ - memset( &header, 0, sizeof( DDS_header ) ); - header.dwMagic = ('D' << 0) | ('D' << 8) | ('S' << 16) | (' ' << 24); - header.dwSize = 124; - header.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_LINEARSIZE; - header.dwWidth = width; - header.dwHeight = height; - header.dwPitchOrLinearSize = DDS_size; - header.sPixelFormat.dwSize = 32; - header.sPixelFormat.dwFlags = DDPF_FOURCC; - if( (channels & 1) == 1 ) - { - header.sPixelFormat.dwFourCC = ('D' << 0) | ('X' << 8) | ('T' << 16) | ('1' << 24); - } else - { - header.sPixelFormat.dwFourCC = ('D' << 0) | ('X' << 8) | ('T' << 16) | ('5' << 24); - } - header.sCaps.dwCaps1 = DDSCAPS_TEXTURE; - /* write it out */ - fout = fopen( filename, "wb"); - fwrite( &header, sizeof( DDS_header ), 1, fout ); - fwrite( DDS_data, 1, DDS_size, fout ); - fclose( fout ); - /* done */ - free( DDS_data ); - return 1; -} - -unsigned char* convert_image_to_DXT1( - const unsigned char *const uncompressed, - int width, int height, int channels, - int *out_size ) -{ - unsigned char *compressed; - int i, j, x, y; - unsigned char ublock[16*3]; - unsigned char cblock[8]; - int index = 0, chan_step = 1; - int block_count = 0; - /* error check */ - *out_size = 0; - if( (width < 1) || (height < 1) || - (NULL == uncompressed) || - (channels < 1) || (channels > 4) ) - { - return NULL; - } - /* for channels == 1 or 2, I do not step forward for R,G,B values */ - if( channels < 3 ) - { - chan_step = 0; - } - /* get the RAM for the compressed image - (8 bytes per 4x4 pixel block) */ - *out_size = ((width+3) >> 2) * ((height+3) >> 2) * 8; - compressed = (unsigned char*)malloc( *out_size ); - /* go through each block */ - for( j = 0; j < height; j += 4 ) - { - for( i = 0; i < width; i += 4 ) - { - /* copy this block into a new one */ - int idx = 0; - int mx = 4, my = 4; - if( j+4 >= height ) - { - my = height - j; - } - if( i+4 >= width ) - { - mx = width - i; - } - for( y = 0; y < my; ++y ) - { - for( x = 0; x < mx; ++x ) - { - ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels]; - ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step]; - ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step+chan_step]; - } - for( x = mx; x < 4; ++x ) - { - ublock[idx++] = ublock[0]; - ublock[idx++] = ublock[1]; - ublock[idx++] = ublock[2]; - } - } - for( y = my; y < 4; ++y ) - { - for( x = 0; x < 4; ++x ) - { - ublock[idx++] = ublock[0]; - ublock[idx++] = ublock[1]; - ublock[idx++] = ublock[2]; - } - } - /* compress the block */ - ++block_count; - compress_DDS_color_block( 3, ublock, cblock ); - /* copy the data from the block into the main block */ - for( x = 0; x < 8; ++x ) - { - compressed[index++] = cblock[x]; - } - } - } - return compressed; -} - -unsigned char* convert_image_to_DXT5( - const unsigned char *const uncompressed, - int width, int height, int channels, - int *out_size ) -{ - unsigned char *compressed; - int i, j, x, y; - unsigned char ublock[16*4]; - unsigned char cblock[8]; - int index = 0, chan_step = 1; - int block_count = 0, has_alpha; - /* error check */ - *out_size = 0; - if( (width < 1) || (height < 1) || - (NULL == uncompressed) || - (channels < 1) || ( channels > 4) ) - { - return NULL; - } - /* for channels == 1 or 2, I do not step forward for R,G,B vales */ - if( channels < 3 ) - { - chan_step = 0; - } - /* # channels = 1 or 3 have no alpha, 2 & 4 do have alpha */ - has_alpha = 1 - (channels & 1); - /* get the RAM for the compressed image - (16 bytes per 4x4 pixel block) */ - *out_size = ((width+3) >> 2) * ((height+3) >> 2) * 16; - compressed = (unsigned char*)malloc( *out_size ); - /* go through each block */ - for( j = 0; j < height; j += 4 ) - { - for( i = 0; i < width; i += 4 ) - { - /* local variables, and my block counter */ - int idx = 0; - int mx = 4, my = 4; - if( j+4 >= height ) - { - my = height - j; - } - if( i+4 >= width ) - { - mx = width - i; - } - for( y = 0; y < my; ++y ) - { - for( x = 0; x < mx; ++x ) - { - ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels]; - ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step]; - ublock[idx++] = uncompressed[(j+y)*width*channels+(i+x)*channels+chan_step+chan_step]; - ublock[idx++] = - has_alpha * uncompressed[(j+y)*width*channels+(i+x)*channels+channels-1] - + (1-has_alpha)*255; - } - for( x = mx; x < 4; ++x ) - { - ublock[idx++] = ublock[0]; - ublock[idx++] = ublock[1]; - ublock[idx++] = ublock[2]; - ublock[idx++] = ublock[3]; - } - } - for( y = my; y < 4; ++y ) - { - for( x = 0; x < 4; ++x ) - { - ublock[idx++] = ublock[0]; - ublock[idx++] = ublock[1]; - ublock[idx++] = ublock[2]; - ublock[idx++] = ublock[3]; - } - } - /* now compress the alpha block */ - compress_DDS_alpha_block( ublock, cblock ); - /* copy the data from the compressed alpha block into the main buffer */ - for( x = 0; x < 8; ++x ) - { - compressed[index++] = cblock[x]; - } - /* then compress the color block */ - ++block_count; - compress_DDS_color_block( 4, ublock, cblock ); - /* copy the data from the compressed color block into the main buffer */ - for( x = 0; x < 8; ++x ) - { - compressed[index++] = cblock[x]; - } - } - } - return compressed; -} - -/********* Helper Functions *********/ -int convert_bit_range( int c, int from_bits, int to_bits ) -{ - int b = (1 << (from_bits - 1)) + c * ((1 << to_bits) - 1); - return (b + (b >> from_bits)) >> from_bits; -} - -int rgb_to_565( int r, int g, int b ) -{ - return - (convert_bit_range( r, 8, 5 ) << 11) | - (convert_bit_range( g, 8, 6 ) << 05) | - (convert_bit_range( b, 8, 5 ) << 00); -} - -void rgb_888_from_565( unsigned int c, int *r, int *g, int *b ) -{ - *r = convert_bit_range( (c >> 11) & 31, 5, 8 ); - *g = convert_bit_range( (c >> 05) & 63, 6, 8 ); - *b = convert_bit_range( (c >> 00) & 31, 5, 8 ); -} - -void compute_color_line_STDEV( - const unsigned char *const uncompressed, - int channels, - float point[3], float direction[3] ) -{ - const float inv_16 = 1.0f / 16.0f; - int i; - float sum_r = 0.0f, sum_g = 0.0f, sum_b = 0.0f; - float sum_rr = 0.0f, sum_gg = 0.0f, sum_bb = 0.0f; - float sum_rg = 0.0f, sum_rb = 0.0f, sum_gb = 0.0f; - /* calculate all data needed for the covariance matrix - ( to compare with _rygdxt code) */ - for( i = 0; i < 16*channels; i += channels ) - { - sum_r += uncompressed[i+0]; - sum_rr += uncompressed[i+0] * uncompressed[i+0]; - sum_g += uncompressed[i+1]; - sum_gg += uncompressed[i+1] * uncompressed[i+1]; - sum_b += uncompressed[i+2]; - sum_bb += uncompressed[i+2] * uncompressed[i+2]; - sum_rg += uncompressed[i+0] * uncompressed[i+1]; - sum_rb += uncompressed[i+0] * uncompressed[i+2]; - sum_gb += uncompressed[i+1] * uncompressed[i+2]; - } - /* convert the sums to averages */ - sum_r *= inv_16; - sum_g *= inv_16; - sum_b *= inv_16; - /* and convert the squares to the squares of the value - avg_value */ - sum_rr -= 16.0f * sum_r * sum_r; - sum_gg -= 16.0f * sum_g * sum_g; - sum_bb -= 16.0f * sum_b * sum_b; - sum_rg -= 16.0f * sum_r * sum_g; - sum_rb -= 16.0f * sum_r * sum_b; - sum_gb -= 16.0f * sum_g * sum_b; - /* the point on the color line is the average */ - point[0] = sum_r; - point[1] = sum_g; - point[2] = sum_b; - #if USE_COV_MAT - /* - The following idea was from ryg. - (https://mollyrocket.com/forums/viewtopic.php?t=392) - The method worked great (less RMSE than mine) most of - the time, but had some issues handling some simple - boundary cases, like full green next to full red, - which would generate a covariance matrix like this: - - | 1 -1 0 | - | -1 1 0 | - | 0 0 0 | - - For a given starting vector, the power method can - generate all zeros! So no starting with {1,1,1} - as I was doing! This kind of error is still a - slight posibillity, but will be very rare. - */ - /* use the covariance matrix directly - (1st iteration, don't use all 1.0 values!) */ - sum_r = 1.0f; - sum_g = 2.718281828f; - sum_b = 3.141592654f; - direction[0] = sum_r*sum_rr + sum_g*sum_rg + sum_b*sum_rb; - direction[1] = sum_r*sum_rg + sum_g*sum_gg + sum_b*sum_gb; - direction[2] = sum_r*sum_rb + sum_g*sum_gb + sum_b*sum_bb; - /* 2nd iteration, use results from the 1st guy */ - sum_r = direction[0]; - sum_g = direction[1]; - sum_b = direction[2]; - direction[0] = sum_r*sum_rr + sum_g*sum_rg + sum_b*sum_rb; - direction[1] = sum_r*sum_rg + sum_g*sum_gg + sum_b*sum_gb; - direction[2] = sum_r*sum_rb + sum_g*sum_gb + sum_b*sum_bb; - /* 3rd iteration, use results from the 2nd guy */ - sum_r = direction[0]; - sum_g = direction[1]; - sum_b = direction[2]; - direction[0] = sum_r*sum_rr + sum_g*sum_rg + sum_b*sum_rb; - direction[1] = sum_r*sum_rg + sum_g*sum_gg + sum_b*sum_gb; - direction[2] = sum_r*sum_rb + sum_g*sum_gb + sum_b*sum_bb; - #else - /* use my standard deviation method - (very robust, a tiny bit slower and less accurate) */ - direction[0] = sqrt( sum_rr ); - direction[1] = sqrt( sum_gg ); - direction[2] = sqrt( sum_bb ); - /* which has a greater component */ - if( sum_gg > sum_rr ) - { - /* green has greater component, so base the other signs off of green */ - if( sum_rg < 0.0f ) - { - direction[0] = -direction[0]; - } - if( sum_gb < 0.0f ) - { - direction[2] = -direction[2]; - } - } else - { - /* red has a greater component */ - if( sum_rg < 0.0f ) - { - direction[1] = -direction[1]; - } - if( sum_rb < 0.0f ) - { - direction[2] = -direction[2]; - } - } - #endif -} - -void LSE_master_colors_max_min( - int *cmax, int *cmin, - int channels, - const unsigned char *const uncompressed ) -{ - int i, j; - /* the master colors */ - int c0[3], c1[3]; - /* used for fitting the line */ - float sum_x[] = { 0.0f, 0.0f, 0.0f }; - float sum_x2[] = { 0.0f, 0.0f, 0.0f }; - float dot_max = 1.0f, dot_min = -1.0f; - float vec_len2 = 0.0f; - float dot; - /* error check */ - if( (channels < 3) || (channels > 4) ) - { - return; - } - compute_color_line_STDEV( uncompressed, channels, sum_x, sum_x2 ); - vec_len2 = 1.0f / ( 0.00001f + - sum_x2[0]*sum_x2[0] + sum_x2[1]*sum_x2[1] + sum_x2[2]*sum_x2[2] ); - /* finding the max and min vector values */ - dot_max = - ( - sum_x2[0] * uncompressed[0] + - sum_x2[1] * uncompressed[1] + - sum_x2[2] * uncompressed[2] - ); - dot_min = dot_max; - for( i = 1; i < 16; ++i ) - { - dot = - ( - sum_x2[0] * uncompressed[i*channels+0] + - sum_x2[1] * uncompressed[i*channels+1] + - sum_x2[2] * uncompressed[i*channels+2] - ); - if( dot < dot_min ) - { - dot_min = dot; - } else if( dot > dot_max ) - { - dot_max = dot; - } - } - /* and the offset (from the average location) */ - dot = sum_x2[0]*sum_x[0] + sum_x2[1]*sum_x[1] + sum_x2[2]*sum_x[2]; - dot_min -= dot; - dot_max -= dot; - /* post multiply by the scaling factor */ - dot_min *= vec_len2; - dot_max *= vec_len2; - /* OK, build the master colors */ - for( i = 0; i < 3; ++i ) - { - /* color 0 */ - c0[i] = (int)(0.5f + sum_x[i] + dot_max * sum_x2[i]); - if( c0[i] < 0 ) - { - c0[i] = 0; - } else if( c0[i] > 255 ) - { - c0[i] = 255; - } - /* color 1 */ - c1[i] = (int)(0.5f + sum_x[i] + dot_min * sum_x2[i]); - if( c1[i] < 0 ) - { - c1[i] = 0; - } else if( c1[i] > 255 ) - { - c1[i] = 255; - } - } - /* down_sample (with rounding?) */ - i = rgb_to_565( c0[0], c0[1], c0[2] ); - j = rgb_to_565( c1[0], c1[1], c1[2] ); - if( i > j ) - { - *cmax = i; - *cmin = j; - } else - { - *cmax = j; - *cmin = i; - } -} - -void - compress_DDS_color_block - ( - int channels, - const unsigned char *const uncompressed, - unsigned char compressed[8] - ) -{ - /* variables */ - int i; - int next_bit; - int enc_c0, enc_c1; - int c0[4], c1[4]; - float color_line[] = { 0.0f, 0.0f, 0.0f, 0.0f }; - float vec_len2 = 0.0f, dot_offset = 0.0f; - /* stupid order */ - int swizzle4[] = { 0, 2, 3, 1 }; - /* get the master colors */ - LSE_master_colors_max_min( &enc_c0, &enc_c1, channels, uncompressed ); - /* store the 565 color 0 and color 1 */ - compressed[0] = (enc_c0 >> 0) & 255; - compressed[1] = (enc_c0 >> 8) & 255; - compressed[2] = (enc_c1 >> 0) & 255; - compressed[3] = (enc_c1 >> 8) & 255; - /* zero out the compressed data */ - compressed[4] = 0; - compressed[5] = 0; - compressed[6] = 0; - compressed[7] = 0; - /* reconstitute the master color vectors */ - rgb_888_from_565( enc_c0, &c0[0], &c0[1], &c0[2] ); - rgb_888_from_565( enc_c1, &c1[0], &c1[1], &c1[2] ); - /* the new vector */ - vec_len2 = 0.0f; - for( i = 0; i < 3; ++i ) - { - color_line[i] = (float)(c1[i] - c0[i]); - vec_len2 += color_line[i] * color_line[i]; - } - if( vec_len2 > 0.0f ) - { - vec_len2 = 1.0f / vec_len2; - } - /* pre-proform the scaling */ - color_line[0] *= vec_len2; - color_line[1] *= vec_len2; - color_line[2] *= vec_len2; - /* compute the offset (constant) portion of the dot product */ - dot_offset = color_line[0]*c0[0] + color_line[1]*c0[1] + color_line[2]*c0[2]; - /* store the rest of the bits */ - next_bit = 8*4; - for( i = 0; i < 16; ++i ) - { - /* find the dot product of this color, to place it on the line - (should be [-1,1]) */ - int next_value = 0; - float dot_product = - color_line[0] * uncompressed[i*channels+0] + - color_line[1] * uncompressed[i*channels+1] + - color_line[2] * uncompressed[i*channels+2] - - dot_offset; - /* map to [0,3] */ - next_value = (int)( dot_product * 3.0f + 0.5f ); - if( next_value > 3 ) - { - next_value = 3; - } else if( next_value < 0 ) - { - next_value = 0; - } - /* OK, store this value */ - compressed[next_bit >> 3] |= swizzle4[ next_value ] << (next_bit & 7); - next_bit += 2; - } - /* done compressing to DXT1 */ -} - -void - compress_DDS_alpha_block - ( - const unsigned char *const uncompressed, - unsigned char compressed[8] - ) -{ - /* variables */ - int i; - int next_bit; - int a0, a1; - float scale_me; - /* stupid order */ - int swizzle8[] = { 1, 7, 6, 5, 4, 3, 2, 0 }; - /* get the alpha limits (a0 > a1) */ - a0 = a1 = uncompressed[3]; - for( i = 4+3; i < 16*4; i += 4 ) - { - if( uncompressed[i] > a0 ) - { - a0 = uncompressed[i]; - } else if( uncompressed[i] < a1 ) - { - a1 = uncompressed[i]; - } - } - /* store those limits, and zero the rest of the compressed dataset */ - compressed[0] = a0; - compressed[1] = a1; - /* zero out the compressed data */ - compressed[2] = 0; - compressed[3] = 0; - compressed[4] = 0; - compressed[5] = 0; - compressed[6] = 0; - compressed[7] = 0; - /* store the all of the alpha values */ - next_bit = 8*2; - scale_me = 7.9999f / (a0 - a1); - for( i = 3; i < 16*4; i += 4 ) - { - /* convert this alpha value to a 3 bit number */ - int svalue; - int value = (int)((uncompressed[i] - a1) * scale_me); - svalue = swizzle8[ value&7 ]; - /* OK, store this value, start with the 1st byte */ - compressed[next_bit >> 3] |= svalue << (next_bit & 7); - if( (next_bit & 7) > 5 ) - { - /* spans 2 bytes, fill in the start of the 2nd byte */ - compressed[1 + (next_bit >> 3)] |= svalue >> (8 - (next_bit & 7) ); - } - next_bit += 3; - } - /* done compressing to DXT1 */ -} diff --git a/src/SFML/Graphics/SOIL/image_DXT.h b/src/SFML/Graphics/SOIL/image_DXT.h deleted file mode 100644 index ce771642..00000000 --- a/src/SFML/Graphics/SOIL/image_DXT.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - Jonathan Dummer - 2007-07-31-10.32 - - simple DXT compression / decompression code - - public domain -*/ - -#ifndef HEADER_IMAGE_DXT -#define HEADER_IMAGE_DXT - -/** - Converts an image from an array of unsigned chars (RGB or RGBA) to - DXT1 or DXT5, then saves the converted image to disk. - \return 0 if failed, otherwise returns 1 -**/ -int -save_image_as_DDS -( - const char *filename, - int width, int height, int channels, - const unsigned char *const data -); - -/** - take an image and convert it to DXT1 (no alpha) -**/ -unsigned char* -convert_image_to_DXT1 -( - const unsigned char *const uncompressed, - int width, int height, int channels, - int *out_size -); - -/** - take an image and convert it to DXT5 (with alpha) -**/ -unsigned char* -convert_image_to_DXT5 -( - const unsigned char *const uncompressed, - int width, int height, int channels, - int *out_size -); - -/** A bunch of DirectDraw Surface structures and flags **/ -typedef struct -{ - unsigned int dwMagic; - unsigned int dwSize; - unsigned int dwFlags; - unsigned int dwHeight; - unsigned int dwWidth; - unsigned int dwPitchOrLinearSize; - unsigned int dwDepth; - unsigned int dwMipMapCount; - unsigned int dwReserved1[ 11 ]; - - /* DDPIXELFORMAT */ - struct - { - unsigned int dwSize; - unsigned int dwFlags; - unsigned int dwFourCC; - unsigned int dwRGBBitCount; - unsigned int dwRBitMask; - unsigned int dwGBitMask; - unsigned int dwBBitMask; - unsigned int dwAlphaBitMask; - } - sPixelFormat; - - /* DDCAPS2 */ - struct - { - unsigned int dwCaps1; - unsigned int dwCaps2; - unsigned int dwDDSX; - unsigned int dwReserved; - } - sCaps; - unsigned int dwReserved2; -} -DDS_header ; - -/* the following constants were copied directly off the MSDN website */ - -/* The dwFlags member of the original DDSURFACEDESC2 structure - can be set to one or more of the following values. */ -#define DDSD_CAPS 0x00000001 -#define DDSD_HEIGHT 0x00000002 -#define DDSD_WIDTH 0x00000004 -#define DDSD_PITCH 0x00000008 -#define DDSD_PIXELFORMAT 0x00001000 -#define DDSD_MIPMAPCOUNT 0x00020000 -#define DDSD_LINEARSIZE 0x00080000 -#define DDSD_DEPTH 0x00800000 - -/* DirectDraw Pixel Format */ -#define DDPF_ALPHAPIXELS 0x00000001 -#define DDPF_FOURCC 0x00000004 -#define DDPF_RGB 0x00000040 - -/* The dwCaps1 member of the DDSCAPS2 structure can be - set to one or more of the following values. */ -#define DDSCAPS_COMPLEX 0x00000008 -#define DDSCAPS_TEXTURE 0x00001000 -#define DDSCAPS_MIPMAP 0x00400000 - -/* The dwCaps2 member of the DDSCAPS2 structure can be - set to one or more of the following values. */ -#define DDSCAPS2_CUBEMAP 0x00000200 -#define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400 -#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800 -#define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000 -#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000 -#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000 -#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000 -#define DDSCAPS2_VOLUME 0x00200000 - -#endif /* HEADER_IMAGE_DXT */ diff --git a/src/SFML/Graphics/SOIL/stb_image_aug.c b/src/SFML/Graphics/SOIL/stb_image_aug.c deleted file mode 100644 index d0f3f0e9..00000000 --- a/src/SFML/Graphics/SOIL/stb_image_aug.c +++ /dev/null @@ -1,3749 +0,0 @@ -/* stbi-1.18 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c - when you control the images you're loading - - QUICK NOTES: - Primarily of interest to game developers and other people who can - avoid problematic images and only need the trivial interface - - JPEG baseline (no JPEG progressive, no oddball channel decimations) - PNG 8-bit only - BMP non-1bpp, non-RLE - TGA (not sure what subset, if a subset) - PSD (composited view only, no extra channels) - HDR (radiance rgbE format) - writes BMP,TGA (define STBI_NO_WRITE to remove code) - decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code) - supports installable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) - - TODO: - stbi_info_* - - history: - 1.18 fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug; header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less - than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant -*/ - -#include "stb_image_aug.h" - -#ifndef STBI_NO_HDR -#include // ldexp -#include // strcmp -#endif - -#ifndef STBI_NO_STDIO -#include -#endif -#include -#include -#include -#include - -#ifndef _MSC_VER - #ifdef __cplusplus - #define __forceinline inline - #else - #define __forceinline - #endif -#endif - - -// implementation: -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef signed short int16; -typedef unsigned int uint32; -typedef signed int int32; -typedef unsigned int uint; - -// should produce compiler error if size is wrong -typedef unsigned char validate_uint32[sizeof(uint32)==4]; - -#if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE) -#define STBI_NO_WRITE -#endif - -#ifndef STBI_NO_DDS -#include "stbi_DDS_aug.h" -#endif - -// I (JLD) want full messages for SOIL -#define STBI_FAILURE_USERMSG 1 - -////////////////////////////////////////////////////////////////////////////// -// -// Generic API that works on all image types -// - -// this is not threadsafe -static char *failure_reason; - -char *stbi_failure_reason(void) -{ - return failure_reason; -} - -static int e(char *str) -{ - failure_reason = str; - return 0; -} - -#ifdef STBI_NO_FAILURE_STRINGS - #define e(x,y) 0 -#elif defined(STBI_FAILURE_USERMSG) - #define e(x,y) e(y) -#else - #define e(x,y) e(x) -#endif - -#define epf(x,y) ((float *) (e(x,y)?NULL:NULL)) -#define epuc(x,y) ((unsigned char *) (e(x,y)?NULL:NULL)) - -void stbi_image_free(void *retval_from_stbi_load) -{ - free(retval_from_stbi_load); -} - -#define MAX_LOADERS 32 -stbi_loader *loaders[MAX_LOADERS]; -static int max_loaders = 0; - -int stbi_register_loader(stbi_loader *loader) -{ - int i; - for (i=0; i < MAX_LOADERS; ++i) { - // already present? - if (loaders[i] == loader) - return 1; - // end of the list? - if (loaders[i] == NULL) { - loaders[i] = loader; - max_loaders = i+1; - return 1; - } - } - // no room for it - return 0; -} - -#ifndef STBI_NO_HDR -static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp); -static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp); -#endif - -#ifndef STBI_NO_STDIO -unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = fopen(filename, "rb"); - unsigned char *result; - if (!f) return epuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - int i; - if (stbi_jpeg_test_file(f)) - return stbi_jpeg_load_from_file(f,x,y,comp,req_comp); - if (stbi_png_test_file(f)) - return stbi_png_load_from_file(f,x,y,comp,req_comp); - if (stbi_bmp_test_file(f)) - return stbi_bmp_load_from_file(f,x,y,comp,req_comp); - if (stbi_psd_test_file(f)) - return stbi_psd_load_from_file(f,x,y,comp,req_comp); - #ifndef STBI_NO_DDS - if (stbi_dds_test_file(f)) - return stbi_dds_load_from_file(f,x,y,comp,req_comp); - #endif - #ifndef STBI_NO_HDR - if (stbi_hdr_test_file(f)) { - float *hdr = stbi_hdr_load_from_file(f, x,y,comp,req_comp); - return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } - #endif - for (i=0; i < max_loaders; ++i) - if (loaders[i]->test_file(f)) - return loaders[i]->load_from_file(f,x,y,comp,req_comp); - // test tga last because it's a crappy test! - if (stbi_tga_test_file(f)) - return stbi_tga_load_from_file(f,x,y,comp,req_comp); - return epuc("unknown image type", "Image not of any known type, or corrupt"); -} -#endif - -unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - int i; - if (stbi_jpeg_test_memory(buffer,len)) - return stbi_jpeg_load_from_memory(buffer,len,x,y,comp,req_comp); - if (stbi_png_test_memory(buffer,len)) - return stbi_png_load_from_memory(buffer,len,x,y,comp,req_comp); - if (stbi_bmp_test_memory(buffer,len)) - return stbi_bmp_load_from_memory(buffer,len,x,y,comp,req_comp); - if (stbi_psd_test_memory(buffer,len)) - return stbi_psd_load_from_memory(buffer,len,x,y,comp,req_comp); - #ifndef STBI_NO_DDS - if (stbi_dds_test_memory(buffer,len)) - return stbi_dds_load_from_memory(buffer,len,x,y,comp,req_comp); - #endif - #ifndef STBI_NO_HDR - if (stbi_hdr_test_memory(buffer, len)) { - float *hdr = stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp); - return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } - #endif - for (i=0; i < max_loaders; ++i) - if (loaders[i]->test_memory(buffer,len)) - return loaders[i]->load_from_memory(buffer,len,x,y,comp,req_comp); - // test tga last because it's a crappy test! - if (stbi_tga_test_memory(buffer,len)) - return stbi_tga_load_from_memory(buffer,len,x,y,comp,req_comp); - return epuc("unknown image type", "Image not of any known type, or corrupt"); -} - -#ifndef STBI_NO_HDR - -#ifndef STBI_NO_STDIO -float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = fopen(filename, "rb"); - float *result; - if (!f) return epf("can't fopen", "Unable to open file"); - result = stbi_loadf_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; - #ifndef STBI_NO_HDR - if (stbi_hdr_test_file(f)) - return stbi_hdr_load_from_file(f,x,y,comp,req_comp); - #endif - data = stbi_load_from_file(f, x, y, comp, req_comp); - if (data) - return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return epf("unknown image type", "Image not of any known type, or corrupt"); -} -#endif - -float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi_uc *data; - #ifndef STBI_NO_HDR - if (stbi_hdr_test_memory(buffer, len)) - return stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp); - #endif - data = stbi_load_from_memory(buffer, len, x, y, comp, req_comp); - if (data) - return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return epf("unknown image type", "Image not of any known type, or corrupt"); -} -#endif - -// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is -// defined, for API simplicity; if STBI_NO_HDR is defined, it always -// reports false! - -int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) -{ - #ifndef STBI_NO_HDR - return stbi_hdr_test_memory(buffer, len); - #else - return 0; - #endif -} - -#ifndef STBI_NO_STDIO -extern int stbi_is_hdr (char const *filename) -{ - FILE *f = fopen(filename, "rb"); - int result=0; - if (f) { - result = stbi_is_hdr_from_file(f); - fclose(f); - } - return result; -} - -extern int stbi_is_hdr_from_file(FILE *f) -{ - #ifndef STBI_NO_HDR - return stbi_hdr_test_file(f); - #else - return 0; - #endif -} - -#endif - -// @TODO: get image dimensions & components without fully decoding -#ifndef STBI_NO_STDIO -extern int stbi_info (char const *filename, int *x, int *y, int *comp); -extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); -#endif -extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); - -#ifndef STBI_NO_HDR -static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f; -static float l2h_gamma=2.2f, l2h_scale=1.0f; - -void stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; } -void stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; } - -void stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; } -void stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; } -#endif - - -////////////////////////////////////////////////////////////////////////////// -// -// Common code used by all image loaders -// - -enum -{ - SCAN_load=0, - SCAN_type, - SCAN_header, -}; - -typedef struct -{ - uint32 img_x, img_y; - int img_n, img_out_n; - - #ifndef STBI_NO_STDIO - FILE *img_file; - #endif - uint8 *img_buffer, *img_buffer_end; -} stbi; - -#ifndef STBI_NO_STDIO -static void start_file(stbi *s, FILE *f) -{ - s->img_file = f; -} -#endif - -static void start_mem(stbi *s, uint8 const *buffer, int len) -{ -#ifndef STBI_NO_STDIO - s->img_file = NULL; -#endif - s->img_buffer = (uint8 *) buffer; - s->img_buffer_end = (uint8 *) buffer+len; -} - -__forceinline static int get8(stbi *s) -{ -#ifndef STBI_NO_STDIO - if (s->img_file) { - int c = fgetc(s->img_file); - return c == EOF ? 0 : c; - } -#endif - if (s->img_buffer < s->img_buffer_end) - return *s->img_buffer++; - return 0; -} - -__forceinline static int at_eof(stbi *s) -{ -#ifndef STBI_NO_STDIO - if (s->img_file) - return feof(s->img_file); -#endif - return s->img_buffer >= s->img_buffer_end; -} - -__forceinline static uint8 get8u(stbi *s) -{ - return (uint8) get8(s); -} - -static void skip(stbi *s, int n) -{ -#ifndef STBI_NO_STDIO - if (s->img_file) - fseek(s->img_file, n, SEEK_CUR); - else -#endif - s->img_buffer += n; -} - -static int get16(stbi *s) -{ - int z = get8(s); - return (z << 8) + get8(s); -} - -static uint32 get32(stbi *s) -{ - uint32 z = get16(s); - return (z << 16) + get16(s); -} - -static int get16le(stbi *s) -{ - int z = get8(s); - return z + (get8(s) << 8); -} - -static uint32 get32le(stbi *s) -{ - uint32 z = get16le(s); - return z + (get16le(s) << 16); -} - -static void getn(stbi *s, stbi_uc *buffer, int n) -{ -#ifndef STBI_NO_STDIO - if (s->img_file) { - fread(buffer, 1, n, s->img_file); - return; - } -#endif - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; -} - -////////////////////////////////////////////////////////////////////////////// -// -// generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (e.g. jpeg -// does all cases internally since it needs to colorspace convert anyway, -// and it never has alpha, so very few cases ). png can automatically -// interleave an alpha=255 channel, but falls back to this for other cases -// -// assume data buffer is malloced, so malloc a new one and free that one -// only failure mode is malloc failing - -static uint8 compute_y(int r, int g, int b) -{ - return (uint8) (((r*77) + (g*150) + (29*b)) >> 8); -} - -static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y) -{ - int i,j; - unsigned char *good; - - if (req_comp == img_n) return data; - assert(req_comp >= 1 && req_comp <= 4); - - good = (unsigned char *) malloc(req_comp * x * y); - if (good == NULL) { - free(data); - return epuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - unsigned char *src = data + j * x * img_n ; - unsigned char *dest = good + j * x * req_comp; - - #define COMBO(a,b) ((a)*8+(b)) - #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch(COMBO(img_n, req_comp)) { - CASE(1,2) dest[0]=src[0], dest[1]=255; break; - CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; - CASE(2,1) dest[0]=src[0]; break; - CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; - CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; - CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; - CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]); break; - CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255; break; - CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]); break; - CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; - CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; - default: assert(0); - } - #undef CASE - } - - free(data); - return good; -} - -#ifndef STBI_NO_HDR -static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp) -{ - int i,k,n; - float *output = (float *) malloc(x * y * comp * sizeof(float)); - if (output == NULL) { free(data); return epf("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - output[i*comp + k] = (float) pow(data[i*comp+k]/255.0f, l2h_gamma) * l2h_scale; - } - if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; - } - free(data); - return output; -} - -#define float2int(x) ((int) (x)) -static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp) -{ - int i,k,n; - stbi_uc *output = (stbi_uc *) malloc(x * y * comp); - if (output == NULL) { free(data); return epuc("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = float2int(z); - } - if (k < comp) { - float z = data[i*comp+k] * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = float2int(z); - } - } - free(data); - return output; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) -// -// simple implementation -// - channel subsampling of at most 2 in each dimension -// - doesn't support delayed output of y-dimension -// - simple interface (only one output format: 8-bit interleaved RGB) -// - doesn't try to recover corrupt jpegs -// - doesn't allow partial loading, loading multiple at once -// - still fast on x86 (copying globals into locals doesn't help x86) -// - allocates lots of intermediate memory (full size of all components) -// - non-interleaved case requires this anyway -// - allows good upsampling (see next) -// high-quality -// - upsampled channels are bilinearly interpolated, even across blocks -// - quality integer IDCT derived from IJG's 'slow' -// performance -// - fast huffman; reasonable integer IDCT -// - uses a lot of intermediate memory, could cache poorly -// - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 -// stb_jpeg: 1.34 seconds (MSVC6, default release build) -// stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) -// IJL11.dll: 1.08 seconds (compiled by intel) -// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) -// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) - -// huffman decoding acceleration -#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache - -typedef struct -{ - uint8 fast[1 << FAST_BITS]; - // weirdly, repacking this into AoS is a 10% speed loss, instead of a win - uint16 code[256]; - uint8 values[256]; - uint8 size[257]; - unsigned int maxcode[18]; - int delta[17]; // old 'firstsymbol' - old 'firstcode' -} huffman; - -typedef struct -{ - #if STBI_SIMD - unsigned short dequant2[4][64]; - #endif - stbi s; - huffman huff_dc[4]; - huffman huff_ac[4]; - uint8 dequant[4][64]; - -// sizes for components, interleaved MCUs - int img_h_max, img_v_max; - int img_mcu_x, img_mcu_y; - int img_mcu_w, img_mcu_h; - -// definition of jpeg image component - struct - { - int id; - int h,v; - int tq; - int hd,ha; - int dc_pred; - - int x,y,w2,h2; - uint8 *data; - void *raw_data; - uint8 *linebuf; - } img_comp[4]; - - uint32 code_buffer; // jpeg entropy-coded buffer - int code_bits; // number of valid bits - unsigned char marker; // marker seen while filling entropy buffer - int nomore; // flag if we saw a marker so must stop - - int scan_n, order[4]; - int restart_interval, todo; -} jpeg; - -static int build_huffman(huffman *h, int *count) -{ - int i,j,k=0,code; - // build size list for each symbol (from JPEG spec) - for (i=0; i < 16; ++i) - for (j=0; j < count[i]; ++j) - h->size[k++] = (uint8) (i+1); - h->size[k] = 0; - - // compute actual symbols (from jpeg spec) - code = 0; - k = 0; - for(j=1; j <= 16; ++j) { - // compute delta to add to code to compute symbol id - h->delta[j] = k - code; - if (h->size[k] == j) { - while (h->size[k] == j) - h->code[k++] = (uint16) (code++); - if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG"); - } - // compute largest code + 1 for this size, preshifted as needed later - h->maxcode[j] = code << (16-j); - code <<= 1; - } - h->maxcode[j] = 0xffffffff; - - // build non-spec acceleration table; 255 is flag for not-accelerated - memset(h->fast, 255, 1 << FAST_BITS); - for (i=0; i < k; ++i) { - int s = h->size[i]; - if (s <= FAST_BITS) { - int c = h->code[i] << (FAST_BITS-s); - int m = 1 << (FAST_BITS-s); - for (j=0; j < m; ++j) { - h->fast[c+j] = (uint8) i; - } - } - } - return 1; -} - -static void grow_buffer_unsafe(jpeg *j) -{ - do { - int b = j->nomore ? 0 : get8(&j->s); - if (b == 0xff) { - int c = get8(&j->s); - if (c != 0) { - j->marker = (unsigned char) c; - j->nomore = 1; - return; - } - } - j->code_buffer = (j->code_buffer << 8) | b; - j->code_bits += 8; - } while (j->code_bits <= 24); -} - -// (1 << n) - 1 -static uint32 bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; - -// decode a jpeg huffman value from the bitstream -__forceinline static int decode(jpeg *j, huffman *h) -{ - unsigned int temp; - int c,k; - - if (j->code_bits < 16) grow_buffer_unsafe(j); - - // look at the top FAST_BITS and determine what symbol ID it is, - // if the code is <= FAST_BITS - c = (j->code_buffer >> (j->code_bits - FAST_BITS)) & ((1 << FAST_BITS)-1); - k = h->fast[c]; - if (k < 255) { - if (h->size[k] > j->code_bits) - return -1; - j->code_bits -= h->size[k]; - return h->values[k]; - } - - // naive test is to shift the code_buffer down so k bits are - // valid, then test against maxcode. To speed this up, we've - // preshifted maxcode left so that it has (16-k) 0s at the - // end; in other words, regardless of the number of bits, it - // wants to be compared against something shifted to have 16; - // that way we don't need to shift inside the loop. - if (j->code_bits < 16) - temp = (j->code_buffer << (16 - j->code_bits)) & 0xffff; - else - temp = (j->code_buffer >> (j->code_bits - 16)) & 0xffff; - for (k=FAST_BITS+1 ; ; ++k) - if (temp < h->maxcode[k]) - break; - if (k == 17) { - // error! code not found - j->code_bits -= 16; - return -1; - } - - if (k > j->code_bits) - return -1; - - // convert the huffman code to the symbol id - c = ((j->code_buffer >> (j->code_bits - k)) & bmask[k]) + h->delta[k]; - assert((((j->code_buffer) >> (j->code_bits - h->size[c])) & bmask[h->size[c]]) == h->code[c]); - - // convert the id to a symbol - j->code_bits -= k; - return h->values[c]; -} - -// combined JPEG 'receive' and JPEG 'extend', since baseline -// always extends everything it receives. -__forceinline static int extend_receive(jpeg *j, int n) -{ - unsigned int m = 1 << (n-1); - unsigned int k; - if (j->code_bits < n) grow_buffer_unsafe(j); - k = (j->code_buffer >> (j->code_bits - n)) & bmask[n]; - j->code_bits -= n; - // the following test is probably a random branch that won't - // predict well. I tried to table accelerate it but failed. - // maybe it's compiling as a conditional move? - if (k < m) - return (-1 << n) + k + 1; - else - return k; -} - -// given a value that's at position X in the zigzag stream, -// where does it appear in the 8x8 matrix coded as row-major? -static uint8 dezigzag[64+15] = -{ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - // let corrupt input sample past end - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63 -}; - -// decode one 64-entry block-- -static int decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b) -{ - int diff,dc,k; - int t = decode(j, hdc); - if (t < 0) return e("bad huffman code","Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data,0,64*sizeof(data[0])); - - diff = t ? extend_receive(j, t) : 0; - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) dc; - - // decode AC components, see JPEG spec - k = 1; - do { - int r,s; - int rs = decode(j, hac); - if (rs < 0) return e("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; - // decode into unzigzag'd location - data[dezigzag[k++]] = (short) extend_receive(j,s); - } - } while (k < 64); - return 1; -} - -// take a -128..127 value and clamp it and convert to 0..255 -__forceinline static uint8 clamp(int x) -{ - x += 128; - // trick to use a single test to catch both cases - if ((unsigned int) x > 255) { - if (x < 0) return 0; - if (x > 255) return 255; - } - return (uint8) x; -} - -#define f2f(x) (int) (((x) * 4096 + 0.5)) -#define fsh(x) ((x) << 12) - -// derived from jidctint -- DCT_ISLOW -#define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ - int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ - p2 = s2; \ - p3 = s6; \ - p1 = (p2+p3) * f2f(0.5411961f); \ - t2 = p1 + p3*f2f(-1.847759065f); \ - t3 = p1 + p2*f2f( 0.765366865f); \ - p2 = s0; \ - p3 = s4; \ - t0 = fsh(p2+p3); \ - t1 = fsh(p2-p3); \ - x0 = t0+t3; \ - x3 = t0-t3; \ - x1 = t1+t2; \ - x2 = t1-t2; \ - t0 = s7; \ - t1 = s5; \ - t2 = s3; \ - t3 = s1; \ - p3 = t0+t2; \ - p4 = t1+t3; \ - p1 = t0+t3; \ - p2 = t1+t2; \ - p5 = (p3+p4)*f2f( 1.175875602f); \ - t0 = t0*f2f( 0.298631336f); \ - t1 = t1*f2f( 2.053119869f); \ - t2 = t2*f2f( 3.072711026f); \ - t3 = t3*f2f( 1.501321110f); \ - p1 = p5 + p1*f2f(-0.899976223f); \ - p2 = p5 + p2*f2f(-2.562915447f); \ - p3 = p3*f2f(-1.961570560f); \ - p4 = p4*f2f(-0.390180644f); \ - t3 += p1+p4; \ - t2 += p2+p3; \ - t1 += p2+p4; \ - t0 += p1+p3; - -#if !STBI_SIMD -// .344 seconds on 3*anemones.jpg -static void idct_block(uint8 *out, int out_stride, short data[64], uint8 *dequantize) -{ - int i,val[64],*v=val; - uint8 *o,*dq = dequantize; - short *d = data; - - // columns - for (i=0; i < 8; ++i,++d,++dq, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 - && d[40]==0 && d[48]==0 && d[56]==0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0] * dq[0] << 2; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], - d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; x1 += 512; x2 += 512; x3 += 512; - v[ 0] = (x0+t3) >> 10; - v[56] = (x0-t3) >> 10; - v[ 8] = (x1+t2) >> 10; - v[48] = (x1-t2) >> 10; - v[16] = (x2+t1) >> 10; - v[40] = (x2-t1) >> 10; - v[24] = (x3+t0) >> 10; - v[32] = (x3-t0) >> 10; - } - } - - for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { - // no fast case since the first 1D IDCT spread components out - IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - x0 += 65536; x1 += 65536; x2 += 65536; x3 += 65536; - o[0] = clamp((x0+t3) >> 17); - o[7] = clamp((x0-t3) >> 17); - o[1] = clamp((x1+t2) >> 17); - o[6] = clamp((x1-t2) >> 17); - o[2] = clamp((x2+t1) >> 17); - o[5] = clamp((x2-t1) >> 17); - o[3] = clamp((x3+t0) >> 17); - o[4] = clamp((x3-t0) >> 17); - } -} -#else -static void idct_block(uint8 *out, int out_stride, short data[64], unsigned short *dequantize) -{ - int i,val[64],*v=val; - uint8 *o; - unsigned short *dq = dequantize; - short *d = data; - - // columns - for (i=0; i < 8; ++i,++d,++dq, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 - && d[40]==0 && d[48]==0 && d[56]==0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0] * dq[0] << 2; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], - d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; x1 += 512; x2 += 512; x3 += 512; - v[ 0] = (x0+t3) >> 10; - v[56] = (x0-t3) >> 10; - v[ 8] = (x1+t2) >> 10; - v[48] = (x1-t2) >> 10; - v[16] = (x2+t1) >> 10; - v[40] = (x2-t1) >> 10; - v[24] = (x3+t0) >> 10; - v[32] = (x3-t0) >> 10; - } - } - - for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { - // no fast case since the first 1D IDCT spread components out - IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - x0 += 65536; x1 += 65536; x2 += 65536; x3 += 65536; - o[0] = clamp((x0+t3) >> 17); - o[7] = clamp((x0-t3) >> 17); - o[1] = clamp((x1+t2) >> 17); - o[6] = clamp((x1-t2) >> 17); - o[2] = clamp((x2+t1) >> 17); - o[5] = clamp((x2-t1) >> 17); - o[3] = clamp((x3+t0) >> 17); - o[4] = clamp((x3-t0) >> 17); - } -} -static stbi_idct_8x8 stbi_idct_installed = idct_block; - -extern void stbi_install_idct(stbi_idct_8x8 func) -{ - stbi_idct_installed = func; -} -#endif - -#define MARKER_none 0xff -// if there's a pending marker from the entropy stream, return that -// otherwise, fetch from the stream and get a marker. if there's no -// marker, return 0xff, which is never a valid marker value -static uint8 get_marker(jpeg *j) -{ - uint8 x; - if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; } - x = get8u(&j->s); - if (x != 0xff) return MARKER_none; - while (x == 0xff) - x = get8u(&j->s); - return x; -} - -// in each scan, we'll have scan_n components, and the order -// of the components is specified by order[] -#define RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) - -// after a restart interval, reset the entropy decoder and -// the dc prediction -static void reset(jpeg *j) -{ - j->code_bits = 0; - j->code_buffer = 0; - j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; - j->marker = MARKER_none; - j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; - // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, - // since we don't even allow 1<<30 pixels -} - -static int parse_entropy_coded_data(jpeg *z) -{ - reset(z); - if (z->scan_n == 1) { - int i,j; - #if STBI_SIMD - __declspec(align(16)) - #endif - short data[64]; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; - #if STBI_SIMD - stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); - #else - idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); - #endif - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!RESTART(z->marker)) return 1; - reset(z); - } - } - } - } else { // interleaved! - int i,j,k,x,y; - short data[64]; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; - #if STBI_SIMD - stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); - #else - idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); - #endif - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!RESTART(z->marker)) return 1; - reset(z); - } - } - } - } - return 1; -} - -static int process_marker(jpeg *z, int m) -{ - int L; - switch (m) { - case MARKER_none: // no marker found - return e("expected marker","Corrupt JPEG"); - - case 0xC2: // SOF - progressive - return e("progressive jpeg","JPEG format not supported (progressive)"); - - case 0xDD: // DRI - specify restart interval - if (get16(&z->s) != 4) return e("bad DRI len","Corrupt JPEG"); - z->restart_interval = get16(&z->s); - return 1; - - case 0xDB: // DQT - define quantization table - L = get16(&z->s)-2; - while (L > 0) { - int q = get8(&z->s); - int p = q >> 4; - int t = q & 15,i; - if (p != 0) return e("bad DQT type","Corrupt JPEG"); - if (t > 3) return e("bad DQT table","Corrupt JPEG"); - for (i=0; i < 64; ++i) - z->dequant[t][dezigzag[i]] = get8u(&z->s); - #if STBI_SIMD - for (i=0; i < 64; ++i) - z->dequant2[t][i] = z->dequant[t][i]; - #endif - L -= 65; - } - return L==0; - - case 0xC4: // DHT - define huffman table - L = get16(&z->s)-2; - while (L > 0) { - uint8 *v; - int sizes[16],i,m=0; - int q = get8(&z->s); - int tc = q >> 4; - int th = q & 15; - if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG"); - for (i=0; i < 16; ++i) { - sizes[i] = get8(&z->s); - m += sizes[i]; - } - L -= 17; - if (tc == 0) { - if (!build_huffman(z->huff_dc+th, sizes)) return 0; - v = z->huff_dc[th].values; - } else { - if (!build_huffman(z->huff_ac+th, sizes)) return 0; - v = z->huff_ac[th].values; - } - for (i=0; i < m; ++i) - v[i] = get8u(&z->s); - L -= m; - } - return L==0; - } - // check for comment block or APP blocks - if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - skip(&z->s, get16(&z->s)-2); - return 1; - } - return 0; -} - -// after we see SOS -static int process_scan_header(jpeg *z) -{ - int i; - int Ls = get16(&z->s); - z->scan_n = get8(&z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s.img_n) return e("bad SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG"); - for (i=0; i < z->scan_n; ++i) { - int id = get8(&z->s), which; - int q = get8(&z->s); - for (which = 0; which < z->s.img_n; ++which) - if (z->img_comp[which].id == id) - break; - if (which == z->s.img_n) return 0; - z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG"); - z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG"); - z->order[i] = which; - } - if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG"); - get8(&z->s); // should be 63, but might be 0 - if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG"); - - return 1; -} - -static int process_frame_header(jpeg *z, int scan) -{ - stbi *s = &z->s; - int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = get16(s); if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG - p = get8(s); if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = get16(s); if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = get16(s); if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires - c = get8(s); - if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG"); // JFIF requires - s->img_n = c; - for (i=0; i < c; ++i) { - z->img_comp[i].data = NULL; - z->img_comp[i].linebuf = NULL; - } - - if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG"); - - for (i=0; i < s->img_n; ++i) { - z->img_comp[i].id = get8(s); - if (z->img_comp[i].id != i+1) // JFIF requires - if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! - return e("bad component ID","Corrupt JPEG"); - q = get8(s); - z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG"); - z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG"); - z->img_comp[i].tq = get8(s); if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG"); - } - - if (scan != SCAN_load) return 1; - - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); - - for (i=0; i < s->img_n; ++i) { - if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; - if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; - } - - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; - z->img_mcu_w = h_max * 8; - z->img_mcu_h = v_max * 8; - z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; - z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; - - for (i=0; i < s->img_n; ++i) { - // number of effective pixels (e.g. for non-interleaved MCU) - z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; - z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; - // to simplify generation, we'll allocate enough memory to decode - // the bogus oversized data from using interleaved MCUs and their - // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't - // discard the extra data until colorspace conversion - z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; - z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); - if (z->img_comp[i].raw_data == NULL) { - for(--i; i >= 0; --i) { - free(z->img_comp[i].raw_data); - z->img_comp[i].data = NULL; - } - return e("outofmem", "Out of memory"); - } - // align blocks for installable-idct using mmx/sse - z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - z->img_comp[i].linebuf = NULL; - } - - return 1; -} - -// use comparisons since in some cases we handle more than one case (e.g. SOF) -#define DNL(x) ((x) == 0xdc) -#define SOI(x) ((x) == 0xd8) -#define EOI(x) ((x) == 0xd9) -#define SOF(x) ((x) == 0xc0 || (x) == 0xc1) -#define SOS(x) ((x) == 0xda) - -static int decode_jpeg_header(jpeg *z, int scan) -{ - int m; - z->marker = MARKER_none; // initialize cached marker to empty - m = get_marker(z); - if (!SOI(m)) return e("no SOI","Corrupt JPEG"); - if (scan == SCAN_type) return 1; - m = get_marker(z); - while (!SOF(m)) { - if (!process_marker(z,m)) return 0; - m = get_marker(z); - while (m == MARKER_none) { - // some files have extra padding after their blocks, so ok, we'll scan - if (at_eof(&z->s)) return e("no SOF", "Corrupt JPEG"); - m = get_marker(z); - } - } - if (!process_frame_header(z, scan)) return 0; - return 1; -} - -static int decode_jpeg_image(jpeg *j) -{ - int m; - j->restart_interval = 0; - if (!decode_jpeg_header(j, SCAN_load)) return 0; - m = get_marker(j); - while (!EOI(m)) { - if (SOS(m)) { - if (!process_scan_header(j)) return 0; - if (!parse_entropy_coded_data(j)) return 0; - } else { - if (!process_marker(j, m)) return 0; - } - m = get_marker(j); - } - return 1; -} - -// static jfif-centered resampling (across block boundaries) - -typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1, - int w, int hs); - -#define div4(x) ((uint8) ((x) >> 2)) - -static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - return in_near; -} - -static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - // need to generate two samples vertically for every one in input - int i; - for (i=0; i < w; ++i) - out[i] = div4(3*in_near[i] + in_far[i] + 2); - return out; -} - -static uint8* resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - // need to generate two samples horizontally for every one in input - int i; - uint8 *input = in_near; - if (w == 1) { - // if only one sample, can't do any interpolation - out[0] = out[1] = input[0]; - return out; - } - - out[0] = input[0]; - out[1] = div4(input[0]*3 + input[1] + 2); - for (i=1; i < w-1; ++i) { - int n = 3*input[i]+2; - out[i*2+0] = div4(n+input[i-1]); - out[i*2+1] = div4(n+input[i+1]); - } - out[i*2+0] = div4(input[w-2]*3 + input[w-1] + 2); - out[i*2+1] = input[w-1]; - return out; -} - -#define div16(x) ((uint8) ((x) >> 4)) - -static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i,t0,t1; - if (w == 1) { - out[0] = out[1] = div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - out[0] = div4(t1+2); - for (i=1; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = div16(3*t0 + t1 + 8); - out[i*2 ] = div16(3*t1 + t0 + 8); - } - out[w*2-1] = div4(t1+2); - return out; -} - -static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs) -{ - // resample with nearest-neighbor - int i,j; - for (i=0; i < w; ++i) - for (j=0; j < hs; ++j) - out[i*hs+j] = in_near[i]; - return out; -} - -#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) - -// 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) -// VC6 without processor=Pro is generating multiple LEAs per multiply! -static void YCbCr_to_RGB_row(uint8 *out, const uint8 *y, const uint8 *pcb, const uint8 *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 16) + 32768; // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr*float2fixed(1.40200f); - g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); - b = y_fixed + cb*float2fixed(1.77200f); - r >>= 16; - g >>= 16; - b >>= 16; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (uint8)r; - out[1] = (uint8)g; - out[2] = (uint8)b; - out[3] = 255; - out += step; - } -} - -#if STBI_SIMD -static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row; - -void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func) -{ - stbi_YCbCr_installed = func; -} -#endif - - -// clean up the temporary component buffers -static void cleanup_jpeg(jpeg *j) -{ - int i; - for (i=0; i < j->s.img_n; ++i) { - if (j->img_comp[i].data) { - free(j->img_comp[i].raw_data); - j->img_comp[i].data = NULL; - } - if (j->img_comp[i].linebuf) { - free(j->img_comp[i].linebuf); - j->img_comp[i].linebuf = NULL; - } - } -} - -typedef struct -{ - resample_row_func resample; - uint8 *line0,*line1; - int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion - int ystep; // how far through vertical expansion we are - int ypos; // which pre-expansion row we're on -} stbi_resample; - -static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) -{ - int n, decode_n; - // validate req_comp - if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); - z->s.img_n = 0; - - // load a jpeg image from whichever source - if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; } - - // determine actual number of components to generate - n = req_comp ? req_comp : z->s.img_n; - - if (z->s.img_n == 3 && n < 3) - decode_n = 1; - else - decode_n = z->s.img_n; - - // resample and color-convert - { - int k; - uint i,j; - uint8 *output; - uint8 *coutput[4]; - - stbi_resample res_comp[4]; - - for (k=0; k < decode_n; ++k) { - stbi_resample *r = &res_comp[k]; - - // allocate line buffer big enough for upsampling off the edges - // with upsample factor of 4 - z->img_comp[k].linebuf = (uint8 *) malloc(z->s.img_x + 3); - if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } - - r->hs = z->img_h_max / z->img_comp[k].h; - r->vs = z->img_v_max / z->img_comp[k].v; - r->ystep = r->vs >> 1; - r->w_lores = (z->s.img_x + r->hs-1) / r->hs; - r->ypos = 0; - r->line0 = r->line1 = z->img_comp[k].data; - - if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; - else if (r->hs == 1 && r->vs == 2) r->resample = resample_row_v_2; - else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2; - else r->resample = resample_row_generic; - } - - // can't error after this so, this is safe - output = (uint8 *) malloc(n * z->s.img_x * z->s.img_y + 1); - if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); } - - // now go ahead and resample - for (j=0; j < z->s.img_y; ++j) { - uint8 *out = output + n * z->s.img_x * j; - for (k=0; k < decode_n; ++k) { - stbi_resample *r = &res_comp[k]; - int y_bot = r->ystep >= (r->vs >> 1); - coutput[k] = r->resample(z->img_comp[k].linebuf, - y_bot ? r->line1 : r->line0, - y_bot ? r->line0 : r->line1, - r->w_lores, r->hs); - if (++r->ystep >= r->vs) { - r->ystep = 0; - r->line0 = r->line1; - if (++r->ypos < z->img_comp[k].y) - r->line1 += z->img_comp[k].w2; - } - } - if (n >= 3) { - uint8 *y = coutput[0]; - if (z->s.img_n == 3) { - #if STBI_SIMD - stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n); - #else - YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s.img_x, n); - #endif - } else - for (i=0; i < z->s.img_x; ++i) { - out[0] = out[1] = out[2] = y[i]; - out[3] = 255; // not used if n==3 - out += n; - } - } else { - uint8 *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s.img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s.img_x; ++i) *out++ = y[i], *out++ = 255; - } - } - cleanup_jpeg(z); - *out_x = z->s.img_x; - *out_y = z->s.img_y; - if (comp) *comp = z->s.img_n; // report original components, not output - return output; - } -} - -#ifndef STBI_NO_STDIO -unsigned char *stbi_jpeg_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - jpeg j; - start_file(&j.s, f); - return load_jpeg_image(&j, x,y,comp,req_comp); -} - -unsigned char *stbi_jpeg_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; - FILE *f = fopen(filename, "rb"); - if (!f) return NULL; - data = stbi_jpeg_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return data; -} -#endif - -unsigned char *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - jpeg j; - start_mem(&j.s, buffer,len); - return load_jpeg_image(&j, x,y,comp,req_comp); -} - -#ifndef STBI_NO_STDIO -int stbi_jpeg_test_file(FILE *f) -{ - int n,r; - jpeg j; - n = ftell(f); - start_file(&j.s, f); - r = decode_jpeg_header(&j, SCAN_type); - fseek(f,n,SEEK_SET); - return r; -} -#endif - -int stbi_jpeg_test_memory(stbi_uc const *buffer, int len) -{ - jpeg j; - start_mem(&j.s, buffer,len); - return decode_jpeg_header(&j, SCAN_type); -} - -// @TODO: -#ifndef STBI_NO_STDIO -extern int stbi_jpeg_info (char const *filename, int *x, int *y, int *comp); -extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp); -#endif -extern int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); - -// public domain zlib decode v0.2 Sean Barrett 2006-11-18 -// simple implementation -// - all input must be provided in an upfront buffer -// - all output is written to a single output buffer (can malloc/realloc) -// performance -// - fast huffman - -// fast-way is faster to check than jpeg huffman, but slow way is slower -#define ZFAST_BITS 9 // accelerate all cases in default tables -#define ZFAST_MASK ((1 << ZFAST_BITS) - 1) - -// zlib-style huffman encoding -// (jpegs packs from left, zlib from right, so can't share code) -typedef struct -{ - uint16 fast[1 << ZFAST_BITS]; - uint16 firstcode[16]; - int maxcode[17]; - uint16 firstsymbol[16]; - uint8 size[288]; - uint16 value[288]; -} zhuffman; - -__forceinline static int bitreverse16(int n) -{ - n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); - n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); - n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); - n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); - return n; -} - -__forceinline static int bit_reverse(int v, int bits) -{ - assert(bits <= 16); - // to bit reverse n bits, reverse 16 and shift - // e.g. 11 bits, bit reverse and shift away 5 - return bitreverse16(v) >> (16-bits); -} - -static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num) -{ - int i,k=0; - int code, next_code[16], sizes[17]; - - // DEFLATE spec for generating codes - memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 255, sizeof(z->fast)); - for (i=0; i < num; ++i) - ++sizes[sizelist[i]]; - sizes[0] = 0; - for (i=1; i < 16; ++i) - assert(sizes[i] <= (1 << i)); - code = 0; - for (i=1; i < 16; ++i) { - next_code[i] = code; - z->firstcode[i] = (uint16) code; - z->firstsymbol[i] = (uint16) k; - code = (code + sizes[i]); - if (sizes[i]) - if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG"); - z->maxcode[i] = code << (16-i); // preshift for inner loop - code <<= 1; - k += sizes[i]; - } - z->maxcode[16] = 0x10000; // sentinel - for (i=0; i < num; ++i) { - int s = sizelist[i]; - if (s) { - int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; - z->size[c] = (uint8)s; - z->value[c] = (uint16)i; - if (s <= ZFAST_BITS) { - int k = bit_reverse(next_code[s],s); - while (k < (1 << ZFAST_BITS)) { - z->fast[k] = (uint16) c; - k += (1 << s); - } - } - ++next_code[s]; - } - } - return 1; -} - -// zlib-from-memory implementation for PNG reading -// because PNG allows splitting the zlib stream arbitrarily, -// and it's annoying structurally to have PNG call ZLIB call PNG, -// we require PNG read all the IDATs and combine them into a single -// memory buffer - -typedef struct -{ - uint8 *zbuffer, *zbuffer_end; - int num_bits; - uint32 code_buffer; - - char *zout; - char *zout_start; - char *zout_end; - int z_expandable; - - zhuffman z_length, z_distance; -} zbuf; - -__forceinline static int zget8(zbuf *z) -{ - if (z->zbuffer >= z->zbuffer_end) return 0; - return *z->zbuffer++; -} - -static void fill_bits(zbuf *z) -{ - do { - assert(z->code_buffer < (1U << z->num_bits)); - z->code_buffer |= zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -} - -__forceinline static unsigned int zreceive(zbuf *z, int n) -{ - unsigned int k; - if (z->num_bits < n) fill_bits(z); - k = z->code_buffer & ((1 << n) - 1); - z->code_buffer >>= n; - z->num_bits -= n; - return k; -} - -__forceinline static int zhuffman_decode(zbuf *a, zhuffman *z) -{ - int b,s,k; - if (a->num_bits < 16) fill_bits(a); - b = z->fast[a->code_buffer & ZFAST_MASK]; - if (b < 0xffff) { - s = z->size[b]; - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; - } - - // not resolved by fast table, so compute it the slow way - // use jpeg approach, which requires MSbits at top - k = bit_reverse(a->code_buffer, 16); - for (s=ZFAST_BITS+1; ; ++s) - if (k < z->maxcode[s]) - break; - if (s == 16) return -1; // invalid code! - // code size is s, so: - b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - assert(z->size[b] == s); - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -} - -static int expand(zbuf *z, int n) // need to make room for n bytes -{ - char *q; - int cur, limit; - if (!z->z_expandable) return e("output buffer limit","Corrupt PNG"); - cur = (int) (z->zout - z->zout_start); - limit = (int) (z->zout_end - z->zout_start); - while (cur + n > limit) - limit *= 2; - q = (char *) realloc(z->zout_start, limit); - if (q == NULL) return e("outofmem", "Out of memory"); - z->zout_start = q; - z->zout = q + cur; - z->zout_end = q + limit; - return 1; -} - -static int length_base[31] = { - 3,4,5,6,7,8,9,10,11,13, - 15,17,19,23,27,31,35,43,51,59, - 67,83,99,115,131,163,195,227,258,0,0 }; - -static int length_extra[31]= -{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; - -static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, -257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; - -static int dist_extra[32] = -{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -static int parse_huffman_block(zbuf *a) -{ - for(;;) { - int z = zhuffman_decode(a, &a->z_length); - if (z < 256) { - if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes - if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0; - *a->zout++ = (char) z; - } else { - uint8 *p; - int len,dist; - if (z == 256) return 1; - z -= 257; - len = length_base[z]; - if (length_extra[z]) len += zreceive(a, length_extra[z]); - z = zhuffman_decode(a, &a->z_distance); - if (z < 0) return e("bad huffman code","Corrupt PNG"); - dist = dist_base[z]; - if (dist_extra[z]) dist += zreceive(a, dist_extra[z]); - if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG"); - if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0; - p = (uint8 *) (a->zout - dist); - while (len--) - *a->zout++ = *p++; - } - } -} - -static int compute_huffman_codes(zbuf *a) -{ - static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; - zhuffman z_codelength; - uint8 lencodes[286+32+137];//padding for maximum single op - uint8 codelength_sizes[19]; - int i,n; - - int hlit = zreceive(a,5) + 257; - int hdist = zreceive(a,5) + 1; - int hclen = zreceive(a,4) + 4; - - memset(codelength_sizes, 0, sizeof(codelength_sizes)); - for (i=0; i < hclen; ++i) { - int s = zreceive(a,3); - codelength_sizes[length_dezigzag[i]] = (uint8) s; - } - if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; - - n = 0; - while (n < hlit + hdist) { - int c = zhuffman_decode(a, &z_codelength); - assert(c >= 0 && c < 19); - if (c < 16) - lencodes[n++] = (uint8) c; - else if (c == 16) { - c = zreceive(a,2)+3; - memset(lencodes+n, lencodes[n-1], c); - n += c; - } else if (c == 17) { - c = zreceive(a,3)+3; - memset(lencodes+n, 0, c); - n += c; - } else { - assert(c == 18); - c = zreceive(a,7)+11; - memset(lencodes+n, 0, c); - n += c; - } - } - if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG"); - if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; - if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; - return 1; -} - -static int parse_uncompressed_block(zbuf *a) -{ - uint8 header[4]; - int len,nlen,k; - if (a->num_bits & 7) - zreceive(a, a->num_bits & 7); // discard - // drain the bit-packed data into header - k = 0; - while (a->num_bits > 0) { - header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns? - a->code_buffer >>= 8; - a->num_bits -= 8; - } - assert(a->num_bits == 0); - // now fill header the normal way - while (k < 4) - header[k++] = (uint8) zget8(a); - len = header[1] * 256 + header[0]; - nlen = header[3] * 256 + header[2]; - if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG"); - if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG"); - if (a->zout + len > a->zout_end) - if (!expand(a, len)) return 0; - memcpy(a->zout, a->zbuffer, len); - a->zbuffer += len; - a->zout += len; - return 1; -} - -static int parse_zlib_header(zbuf *a) -{ - int cmf = zget8(a); - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = zget8(a); - if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec - if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png - // window = 1 << (8 + cinfo)... but who cares, we fully buffer output - return 1; -} - -// @TODO: should statically initialize these for optimal thread safety -static uint8 default_length[288], default_distance[32]; -static void init_defaults(void) -{ - int i; // use <= to match clearly with spec - for (i=0; i <= 143; ++i) default_length[i] = 8; - for ( ; i <= 255; ++i) default_length[i] = 9; - for ( ; i <= 279; ++i) default_length[i] = 7; - for ( ; i <= 287; ++i) default_length[i] = 8; - - for (i=0; i <= 31; ++i) default_distance[i] = 5; -} - -int stbi_png_partial; // a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead -static int parse_zlib(zbuf *a, int parse_header) -{ - int final, type; - if (parse_header) - if (!parse_zlib_header(a)) return 0; - a->num_bits = 0; - a->code_buffer = 0; - do { - final = zreceive(a,1); - type = zreceive(a,2); - if (type == 0) { - if (!parse_uncompressed_block(a)) return 0; - } else if (type == 3) { - return 0; - } else { - if (type == 1) { - // use fixed code lengths - if (!default_distance[31]) init_defaults(); - if (!zbuild_huffman(&a->z_length , default_length , 288)) return 0; - if (!zbuild_huffman(&a->z_distance, default_distance, 32)) return 0; - } else { - if (!compute_huffman_codes(a)) return 0; - } - if (!parse_huffman_block(a)) return 0; - } - if (stbi_png_partial && a->zout - a->zout_start > 65536) - break; - } while (!final); - return 1; -} - -static int do_zlib(zbuf *a, char *obuf, int olen, int exp, int parse_header) -{ - a->zout_start = obuf; - a->zout = obuf; - a->zout_end = obuf + olen; - a->z_expandable = exp; - - return parse_zlib(a, parse_header); -} - -char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) -{ - zbuf a; - char *p = (char *) malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (uint8 *) buffer; - a.zbuffer_end = (uint8 *) buffer + len; - if (do_zlib(&a, p, initial_size, 1, 1)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - free(a.zout_start); - return NULL; - } -} - -char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) -{ - return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); -} - -int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) -{ - zbuf a; - a.zbuffer = (uint8 *) ibuffer; - a.zbuffer_end = (uint8 *) ibuffer + ilen; - if (do_zlib(&a, obuffer, olen, 0, 1)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) -{ - zbuf a; - char *p = (char *) malloc(16384); - if (p == NULL) return NULL; - a.zbuffer = (uint8 *) buffer; - a.zbuffer_end = (uint8 *) buffer+len; - if (do_zlib(&a, p, 16384, 1, 0)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - free(a.zout_start); - return NULL; - } -} - -int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) -{ - zbuf a; - a.zbuffer = (uint8 *) ibuffer; - a.zbuffer_end = (uint8 *) ibuffer + ilen; - if (do_zlib(&a, obuffer, olen, 0, 0)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 -// simple implementation -// - only 8-bit samples -// - no CRC checking -// - allocates lots of intermediate memory -// - avoids problem of streaming data between subsystems -// - avoids explicit window management -// performance -// - uses stb_zlib, a PD zlib implementation with fast huffman decoding - - -typedef struct -{ - uint32 length; - uint32 type; -} chunk; - -#define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) - -static chunk get_chunk_header(stbi *s) -{ - chunk c; - c.length = get32(s); - c.type = get32(s); - return c; -} - -static int check_png_header(stbi *s) -{ - static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 }; - int i; - for (i=0; i < 8; ++i) - if (get8(s) != png_sig[i]) return e("bad png sig","Not a PNG"); - return 1; -} - -typedef struct -{ - stbi s; - uint8 *idata, *expanded, *out; -} png; - - -enum { - F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4, - F_avg_first, F_paeth_first, -}; - -static uint8 first_row_filter[5] = -{ - F_none, F_sub, F_none, F_avg_first, F_paeth_first -}; - -static int paeth(int a, int b, int c) -{ - int p = a + b - c; - int pa = abs(p-a); - int pb = abs(p-b); - int pc = abs(p-c); - if (pa <= pb && pa <= pc) return a; - if (pb <= pc) return b; - return c; -} - -// create the png data from post-deflated data -static int create_png_image_raw(png *a, uint8 *raw, uint32 raw_len, int out_n, uint32 x, uint32 y) -{ - stbi *s = &a->s; - uint32 i,j,stride = x*out_n; - int k; - int img_n = s->img_n; // copy it into a local for later - assert(out_n == s->img_n || out_n == s->img_n+1); - if (stbi_png_partial) y = 1; - a->out = (uint8 *) malloc(x * y * out_n); - if (!a->out) return e("outofmem", "Out of memory"); - if (!stbi_png_partial) { - if (s->img_x == x && s->img_y == y) - if (raw_len != (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); - else // interlaced: - if (raw_len < (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG"); - } - for (j=0; j < y; ++j) { - uint8 *cur = a->out + stride*j; - uint8 *prior = cur - stride; - int filter = *raw++; - if (filter > 4) return e("invalid filter","Corrupt PNG"); - // if first row, use special filter that doesn't sample previous row - if (j == 0) filter = first_row_filter[filter]; - // handle first pixel explicitly - for (k=0; k < img_n; ++k) { - switch(filter) { - case F_none : cur[k] = raw[k]; break; - case F_sub : cur[k] = raw[k]; break; - case F_up : cur[k] = raw[k] + prior[k]; break; - case F_avg : cur[k] = raw[k] + (prior[k]>>1); break; - case F_paeth : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break; - case F_avg_first : cur[k] = raw[k]; break; - case F_paeth_first: cur[k] = raw[k]; break; - } - } - if (img_n != out_n) cur[img_n] = 255; - raw += img_n; - cur += out_n; - prior += out_n; - // this is a little gross, so that we don't switch per-pixel or per-component - if (img_n == out_n) { - #define CASE(f) \ - case f: \ - for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ - for (k=0; k < img_n; ++k) - switch(filter) { - CASE(F_none) cur[k] = raw[k]; break; - CASE(F_sub) cur[k] = raw[k] + cur[k-img_n]; break; - CASE(F_up) cur[k] = raw[k] + prior[k]; break; - CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1); break; - CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; - CASE(F_avg_first) cur[k] = raw[k] + (cur[k-img_n] >> 1); break; - CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0)); break; - } - #undef CASE - } else { - assert(img_n+1 == out_n); - #define CASE(f) \ - case f: \ - for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ - for (k=0; k < img_n; ++k) - switch(filter) { - CASE(F_none) cur[k] = raw[k]; break; - CASE(F_sub) cur[k] = raw[k] + cur[k-out_n]; break; - CASE(F_up) cur[k] = raw[k] + prior[k]; break; - CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1); break; - CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; - CASE(F_avg_first) cur[k] = raw[k] + (cur[k-out_n] >> 1); break; - CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0)); break; - } - #undef CASE - } - } - return 1; -} - -static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n, int interlaced) -{ - uint8 *final; - int p; - int save; - if (!interlaced) - return create_png_image_raw(a, raw, raw_len, out_n, a->s.img_x, a->s.img_y); - save = stbi_png_partial; - stbi_png_partial = 0; - - // de-interlacing - final = (uint8 *) malloc(a->s.img_x * a->s.img_y * out_n); - for (p=0; p < 7; ++p) { - int xorig[] = { 0,4,0,2,0,1,0 }; - int yorig[] = { 0,0,4,0,2,0,1 }; - int xspc[] = { 8,8,4,4,2,2,1 }; - int yspc[] = { 8,8,8,4,4,2,2 }; - int i,j,x,y; - // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 - x = (a->s.img_x - xorig[p] + xspc[p]-1) / xspc[p]; - y = (a->s.img_y - yorig[p] + yspc[p]-1) / yspc[p]; - if (x && y) { - if (!create_png_image_raw(a, raw, raw_len, out_n, x, y)) { - free(final); - return 0; - } - for (j=0; j < y; ++j) - for (i=0; i < x; ++i) - memcpy(final + (j*yspc[p]+yorig[p])*a->s.img_x*out_n + (i*xspc[p]+xorig[p])*out_n, - a->out + (j*x+i)*out_n, out_n); - free(a->out); - raw += (x*out_n+1)*y; - raw_len -= (x*out_n+1)*y; - } - } - a->out = final; - - stbi_png_partial = save; - return 1; -} - -static int compute_transparency(png *z, uint8 tc[3], int out_n) -{ - stbi *s = &z->s; - uint32 i, pixel_count = s->img_x * s->img_y; - uint8 *p = z->out; - - // compute color-based transparency, assuming we've - // already got 255 as the alpha value in the output - assert(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i=0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 255); - p += 2; - } - } else { - for (i=0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int expand_palette(png *a, uint8 *palette, int len, int pal_img_n) -{ - uint32 i, pixel_count = a->s.img_x * a->s.img_y; - uint8 *p, *temp_out, *orig = a->out; - - p = (uint8 *) malloc(pixel_count * pal_img_n); - if (p == NULL) return e("outofmem", "Out of memory"); - - // between here and free(out) below, exitting would leak - temp_out = p; - - if (pal_img_n == 3) { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p += 3; - } - } else { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p[3] = palette[n+3]; - p += 4; - } - } - free(a->out); - a->out = temp_out; - return 1; -} - -static int parse_png_file(png *z, int scan, int req_comp) -{ - uint8 palette[1024], pal_img_n=0; - uint8 has_trans=0, tc[3]; - uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0; - stbi *s = &z->s; - - if (!check_png_header(s)) return 0; - - if (scan == SCAN_type) return 1; - - for(;;first=0) { - chunk c = get_chunk_header(s); - if (first && c.type != PNG_TYPE('I','H','D','R')) - return e("first not IHDR","Corrupt PNG"); - switch (c.type) { - case PNG_TYPE('I','H','D','R'): { - int depth,color,comp,filter; - if (!first) return e("multiple IHDR","Corrupt PNG"); - if (c.length != 13) return e("bad IHDR len","Corrupt PNG"); - s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)"); - s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)"); - depth = get8(s); if (depth != 8) return e("8bit only","PNG not supported: 8-bit only"); - color = get8(s); if (color > 6) return e("bad ctype","Corrupt PNG"); - if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG"); - comp = get8(s); if (comp) return e("bad comp method","Corrupt PNG"); - filter= get8(s); if (filter) return e("bad filter method","Corrupt PNG"); - interlace = get8(s); if (interlace>1) return e("bad interlace method","Corrupt PNG"); - if (!s->img_x || !s->img_y) return e("0-pixel image","Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode"); - if (scan == SCAN_header) return 1; - } else { - // if paletted, then pal_n is our final components, and - // img_n is # components to decompress/filter. - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG"); - // if SCAN_header, have to scan to see if we have a tRNS - } - break; - } - - case PNG_TYPE('P','L','T','E'): { - if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG"); - for (i=0; i < pal_len; ++i) { - palette[i*4+0] = get8u(s); - palette[i*4+1] = get8u(s); - palette[i*4+2] = get8u(s); - palette[i*4+3] = 255; - } - break; - } - - case PNG_TYPE('t','R','N','S'): { - if (z->idata) return e("tRNS after IDAT","Corrupt PNG"); - if (pal_img_n) { - if (scan == SCAN_header) { s->img_n = 4; return 1; } - if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG"); - if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG"); - pal_img_n = 4; - for (i=0; i < c.length; ++i) - palette[i*4+3] = get8u(s); - } else { - if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG"); - if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG"); - has_trans = 1; - for (k=0; k < s->img_n; ++k) - tc[k] = (uint8) get16(s); // non 8-bit images will be larger - } - break; - } - - case PNG_TYPE('I','D','A','T'): { - if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG"); - if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; } - if (ioff + c.length > idata_limit) { - uint8 *p; - if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - p = (uint8 *) realloc(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory"); - z->idata = p; - } - #ifndef STBI_NO_STDIO - if (s->img_file) - { - if (fread(z->idata+ioff,1,c.length,s->img_file) != c.length) return e("outofdata","Corrupt PNG"); - } - else - #endif - { - memcpy(z->idata+ioff, s->img_buffer, c.length); - s->img_buffer += c.length; - } - ioff += c.length; - break; - } - - case PNG_TYPE('I','E','N','D'): { - uint32 raw_len; - if (scan != SCAN_load) return 1; - if (z->idata == NULL) return e("no IDAT","Corrupt PNG"); - z->expanded = (uint8 *) stbi_zlib_decode_malloc((char *) z->idata, ioff, (int *) &raw_len); - if (z->expanded == NULL) return 0; // zlib should set error - free(z->idata); z->idata = NULL; - if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n+1; - else - s->img_out_n = s->img_n; - if (!create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0; - if (has_trans) - if (!compute_transparency(z, tc, s->img_out_n)) return 0; - if (pal_img_n) { - // pal_img_n == 3 or 4 - s->img_n = pal_img_n; // record the actual colors we had - s->img_out_n = pal_img_n; - if (req_comp >= 3) s->img_out_n = req_comp; - if (!expand_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } - free(z->expanded); z->expanded = NULL; - return 1; - } - - default: - // if critical, fail - if ((c.type & (1 << 29)) == 0) { - #ifndef STBI_NO_FAILURE_STRINGS - // not threadsafe - static char invalid_chunk[] = "XXXX chunk not known"; - invalid_chunk[0] = (uint8) (c.type >> 24); - invalid_chunk[1] = (uint8) (c.type >> 16); - invalid_chunk[2] = (uint8) (c.type >> 8); - invalid_chunk[3] = (uint8) (c.type >> 0); - #endif - return e(invalid_chunk, "PNG not supported: unknown chunk type"); - } - skip(s, c.length); - break; - } - // end of chunk, read and skip CRC - get32(s); - } -} - -static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp) -{ - unsigned char *result=NULL; - p->expanded = NULL; - p->idata = NULL; - p->out = NULL; - if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error"); - if (parse_png_file(p, SCAN_load, req_comp)) { - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s.img_out_n) { - result = convert_format(result, p->s.img_out_n, req_comp, p->s.img_x, p->s.img_y); - p->s.img_out_n = req_comp; - if (result == NULL) return result; - } - *x = p->s.img_x; - *y = p->s.img_y; - if (n) *n = p->s.img_n; - } - free(p->out); p->out = NULL; - free(p->expanded); p->expanded = NULL; - free(p->idata); p->idata = NULL; - - return result; -} - -#ifndef STBI_NO_STDIO -unsigned char *stbi_png_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - png p; - start_file(&p.s, f); - return do_png(&p, x,y,comp,req_comp); -} - -unsigned char *stbi_png_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; - FILE *f = fopen(filename, "rb"); - if (!f) return NULL; - data = stbi_png_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return data; -} -#endif - -unsigned char *stbi_png_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - png p; - start_mem(&p.s, buffer,len); - return do_png(&p, x,y,comp,req_comp); -} - -#ifndef STBI_NO_STDIO -int stbi_png_test_file(FILE *f) -{ - png p; - int n,r; - n = ftell(f); - start_file(&p.s, f); - r = parse_png_file(&p, SCAN_type,STBI_default); - fseek(f,n,SEEK_SET); - return r; -} -#endif - -int stbi_png_test_memory(stbi_uc const *buffer, int len) -{ - png p; - start_mem(&p.s, buffer, len); - return parse_png_file(&p, SCAN_type,STBI_default); -} - -// TODO: load header from png -#ifndef STBI_NO_STDIO -int stbi_png_info (char const *filename, int *x, int *y, int *comp) -{ - png p; - FILE *f = fopen(filename, "rb"); - if (!f) return 0; - start_file(&p.s, f); - if (parse_png_file(&p, SCAN_header, 0)) { - if(x) *x = p.s.img_x; - if(y) *y = p.s.img_y; - if (comp) *comp = p.s.img_n; - fclose(f); - return 1; - } - fclose(f); - return 0; -} - -extern int stbi_png_info_from_file (FILE *f, int *x, int *y, int *comp); -#endif -extern int stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp); - -// Microsoft/Windows BMP image - -static int bmp_test(stbi *s) -{ - int sz; - if (get8(s) != 'B') return 0; - if (get8(s) != 'M') return 0; - get32le(s); // discard filesize - get16le(s); // discard reserved - get16le(s); // discard reserved - get32le(s); // discard data offset - sz = get32le(s); - if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1; - return 0; -} - -#ifndef STBI_NO_STDIO -int stbi_bmp_test_file (FILE *f) -{ - stbi s; - int r,n = ftell(f); - start_file(&s,f); - r = bmp_test(&s); - fseek(f,n,SEEK_SET); - return r; -} -#endif - -int stbi_bmp_test_memory (stbi_uc const *buffer, int len) -{ - stbi s; - start_mem(&s, buffer, len); - return bmp_test(&s); -} - -// returns 0..31 for the highest set bit -static int high_bit(unsigned int z) -{ - int n=0; - if (z == 0) return -1; - if (z >= 0x10000) n += 16, z >>= 16; - if (z >= 0x00100) n += 8, z >>= 8; - if (z >= 0x00010) n += 4, z >>= 4; - if (z >= 0x00004) n += 2, z >>= 2; - if (z >= 0x00002) n += 1, z >>= 1; - return n; -} - -static int bitcount(unsigned int a) -{ - a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 - a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits - a = (a + (a >> 8)); // max 16 per 8 bits - a = (a + (a >> 16)); // max 32 per 8 bits - return a & 0xff; -} - -static int shiftsigned(int v, int shift, int bits) -{ - int result; - int z=0; - - if (shift < 0) v <<= -shift; - else v >>= shift; - result = v; - - z = bits; - while (z < 8) { - result += v >> z; - z += bits; - } - return result; -} - -static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - uint8 *out; - unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0; - stbi_uc pal[256][4]; - int psize=0,i,j,compress=0,width; - int bpp, flip_vertically, pad, target, offset, hsz; - if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP"); - get32le(s); // discard filesize - get16le(s); // discard reserved - get16le(s); // discard reserved - offset = get32le(s); - hsz = get32le(s); - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown"); - failure_reason = "bad BMP"; - if (hsz == 12) { - s->img_x = get16le(s); - s->img_y = get16le(s); - } else { - s->img_x = get32le(s); - s->img_y = get32le(s); - } - if (get16le(s) != 1) return 0; - bpp = get16le(s); - if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit"); - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - if (hsz == 12) { - if (bpp < 24) - psize = (offset - 14 - 24) / 3; - } else { - compress = get32le(s); - if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE"); - get32le(s); // discard sizeof - get32le(s); // discard hres - get32le(s); // discard vres - get32le(s); // discard colorsused - get32le(s); // discard max important - if (hsz == 40 || hsz == 56) { - if (hsz == 56) { - get32le(s); - get32le(s); - get32le(s); - get32le(s); - } - if (bpp == 16 || bpp == 32) { - mr = mg = mb = 0; - if (compress == 0) { - if (bpp == 32) { - mr = 0xff << 16; - mg = 0xff << 8; - mb = 0xff << 0; - ma = 0xff << 24; - fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255 - } else { - mr = 31 << 10; - mg = 31 << 5; - mb = 31 << 0; - } - } else if (compress == 3) { - mr = get32le(s); - mg = get32le(s); - mb = get32le(s); - // not documented, but generated by photoshop and handled by mspaint - if (mr == mg && mg == mb) { - // ?!?!? - return NULL; - } - } else - return NULL; - } - } else { - assert(hsz == 108); - mr = get32le(s); - mg = get32le(s); - mb = get32le(s); - ma = get32le(s); - get32le(s); // discard color space - for (i=0; i < 12; ++i) - get32le(s); // discard color space parameters - } - if (bpp < 16) - psize = (offset - 14 - hsz) >> 2; - } - s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else - target = s->img_n; // if they want monochrome, we'll post-convert - out = (stbi_uc *) malloc(target * s->img_x * s->img_y); - if (!out) return epuc("outofmem", "Out of memory"); - if (bpp < 16) { - int z=0; - if (psize == 0 || psize > 256) { free(out); return epuc("invalid", "Corrupt BMP"); } - for (i=0; i < psize; ++i) { - pal[i][2] = get8(s); - pal[i][1] = get8(s); - pal[i][0] = get8(s); - if (hsz != 12) get8(s); - pal[i][3] = 255; - } - skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); - if (bpp == 4) width = (s->img_x + 1) >> 1; - else if (bpp == 8) width = s->img_x; - else { free(out); return epuc("bad bpp", "Corrupt BMP"); } - pad = (-width)&3; - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=get8(s),v2=0; - if (bpp == 4) { - v2 = v & 15; - v >>= 4; - } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (bpp == 8) ? get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - } - skip(s, pad); - } - } else { - int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; - int z = 0; - int easy=0; - skip(s, offset - 14 - hsz); - if (bpp == 24) width = 3 * s->img_x; - else if (bpp == 16) width = 2*s->img_x; - else /* bpp = 32 and pad = 0 */ width=0; - pad = (-width) & 3; - if (bpp == 24) { - easy = 1; - } else if (bpp == 32) { - if (mb == 0xff && mg == 0xff00 && mr == 0xff000000 && ma == 0xff000000) - easy = 2; - } - if (!easy) { - if (!mr || !mg || !mb) return epuc("bad masks", "Corrupt BMP"); - // right shift amt to put high bit in position #7 - rshift = high_bit(mr)-7; rcount = bitcount(mr); - gshift = high_bit(mg)-7; gcount = bitcount(mr); - bshift = high_bit(mb)-7; bcount = bitcount(mr); - ashift = high_bit(ma)-7; acount = bitcount(mr); - } - for (j=0; j < (int) s->img_y; ++j) { - if (easy) { - for (i=0; i < (int) s->img_x; ++i) { - int a; - out[z+2] = get8(s); - out[z+1] = get8(s); - out[z+0] = get8(s); - z += 3; - a = (easy == 2 ? get8(s) : 255); - if (target == 4) out[z++] = a; - } - } else { - for (i=0; i < (int) s->img_x; ++i) { - uint32 v = (bpp == 16 ? get16le(s) : get32le(s)); - int a; - out[z++] = shiftsigned(v & mr, rshift, rcount); - out[z++] = shiftsigned(v & mg, gshift, gcount); - out[z++] = shiftsigned(v & mb, bshift, bcount); - a = (ma ? shiftsigned(v & ma, ashift, acount) : 255); - if (target == 4) out[z++] = a; - } - } - skip(s, pad); - } - } - if (flip_vertically) { - stbi_uc t; - for (j=0; j < (int) s->img_y>>1; ++j) { - stbi_uc *p1 = out + j *s->img_x*target; - stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; - for (i=0; i < (int) s->img_x*target; ++i) { - t = p1[i], p1[i] = p2[i], p2[i] = t; - } - } - } - - if (req_comp && req_comp != target) { - out = convert_format(out, target, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // convert_format frees input on failure - } - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = target; - return out; -} - -#ifndef STBI_NO_STDIO -stbi_uc *stbi_bmp_load (char const *filename, int *x, int *y, int *comp, int req_comp) -{ - stbi_uc *data; - FILE *f = fopen(filename, "rb"); - if (!f) return NULL; - data = stbi_bmp_load_from_file(f, x,y,comp,req_comp); - fclose(f); - return data; -} - -stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_file(&s, f); - return bmp_load(&s, x,y,comp,req_comp); -} -#endif - -stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_mem(&s, buffer, len); - return bmp_load(&s, x,y,comp,req_comp); -} - -// Targa Truevision - TGA -// by Jonathan Dummer - -static int tga_test(stbi *s) -{ - int sz; - get8u(s); // discard Offset - sz = get8u(s); // color type - if( sz > 1 ) return 0; // only RGB or indexed allowed - sz = get8u(s); // image type - if( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE - get16(s); // discard palette start - get16(s); // discard palette length - get8(s); // discard bits per palette color entry - get16(s); // discard x origin - get16(s); // discard y origin - if( get16(s) < 1 ) return 0; // test width - if( get16(s) < 1 ) return 0; // test height - sz = get8(s); // bits per pixel - if( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0; // only RGB or RGBA or grey allowed - return 1; // seems to have passed everything -} - -#ifndef STBI_NO_STDIO -int stbi_tga_test_file (FILE *f) -{ - stbi s; - int r,n = ftell(f); - start_file(&s, f); - r = tga_test(&s); - fseek(f,n,SEEK_SET); - return r; -} -#endif - -int stbi_tga_test_memory (stbi_uc const *buffer, int len) -{ - stbi s; - start_mem(&s, buffer, len); - return tga_test(&s); -} - -static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - // read in the TGA header stuff - int tga_offset = get8u(s); - int tga_indexed = get8u(s); - int tga_image_type = get8u(s); - int tga_is_RLE = 0; - int tga_palette_start = get16le(s); - int tga_palette_len = get16le(s); - int tga_palette_bits = get8u(s); - int tga_x_origin = get16le(s); - int tga_y_origin = get16le(s); - int tga_width = get16le(s); - int tga_height = get16le(s); - int tga_bits_per_pixel = get8u(s); - int tga_inverted = get8u(s); - // image data - unsigned char *tga_data; - unsigned char *tga_palette = NULL; - int i, j; - unsigned char raw_data[4]; - unsigned char trans_data[4]; - int RLE_count = 0; - int RLE_repeating = 0; - int read_next_pixel = 1; - // do a tiny bit of precessing - if( tga_image_type >= 8 ) - { - tga_image_type -= 8; - tga_is_RLE = 1; - } - /* int tga_alpha_bits = tga_inverted & 15; */ - tga_inverted = 1 - ((tga_inverted >> 5) & 1); - - // error check - if( //(tga_indexed) || - (tga_width < 1) || (tga_height < 1) || - (tga_image_type < 1) || (tga_image_type > 3) || - ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && - (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) - ) - { - return NULL; - } - - // If I'm paletted, then I'll use the number of bits from the palette - if( tga_indexed ) - { - tga_bits_per_pixel = tga_palette_bits; - } - - // tga info - *x = tga_width; - *y = tga_height; - if( (req_comp < 1) || (req_comp > 4) ) - { - // just use whatever the file was - req_comp = tga_bits_per_pixel / 8; - *comp = req_comp; - } else - { - // force a new number of components - *comp = tga_bits_per_pixel/8; - } - tga_data = (unsigned char*)malloc( tga_width * tga_height * req_comp ); - - // skip to the data's starting position (offset usually = 0) - skip(s, tga_offset ); - // do I need to load a palette? - if( tga_indexed ) - { - // any data to skip? (offset usually = 0) - skip(s, tga_palette_start ); - // load the palette - tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); - getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 ); - } - // load the data - for( i = 0; i < tga_width * tga_height; ++i ) - { - // if I'm in RLE mode, do I need to get a RLE chunk? - if( tga_is_RLE ) - { - if( RLE_count == 0 ) - { - // yep, get the next byte as a RLE command - int RLE_cmd = get8u(s); - RLE_count = 1 + (RLE_cmd & 127); - RLE_repeating = RLE_cmd >> 7; - read_next_pixel = 1; - } else if( !RLE_repeating ) - { - read_next_pixel = 1; - } - } else - { - read_next_pixel = 1; - } - // OK, if I need to read a pixel, do it now - if( read_next_pixel ) - { - // load however much data we did have - if( tga_indexed ) - { - // read in 1 byte, then perform the lookup - int pal_idx = get8u(s); - if( pal_idx >= tga_palette_len ) - { - // invalid index - pal_idx = 0; - } - pal_idx *= tga_bits_per_pixel / 8; - for( j = 0; j*8 < tga_bits_per_pixel; ++j ) - { - raw_data[j] = tga_palette[pal_idx+j]; - } - } else - { - // read in the data raw - for( j = 0; j*8 < tga_bits_per_pixel; ++j ) - { - raw_data[j] = get8u(s); - } - } - // convert raw to the intermediate format - switch( tga_bits_per_pixel ) - { - case 8: - // Luminous => RGBA - trans_data[0] = raw_data[0]; - trans_data[1] = raw_data[0]; - trans_data[2] = raw_data[0]; - trans_data[3] = 255; - break; - case 16: - // Luminous,Alpha => RGBA - trans_data[0] = raw_data[0]; - trans_data[1] = raw_data[0]; - trans_data[2] = raw_data[0]; - trans_data[3] = raw_data[1]; - break; - case 24: - // BGR => RGBA - trans_data[0] = raw_data[2]; - trans_data[1] = raw_data[1]; - trans_data[2] = raw_data[0]; - trans_data[3] = 255; - break; - case 32: - // BGRA => RGBA - trans_data[0] = raw_data[2]; - trans_data[1] = raw_data[1]; - trans_data[2] = raw_data[0]; - trans_data[3] = raw_data[3]; - break; - } - // clear the reading flag for the next pixel - read_next_pixel = 0; - } // end of reading a pixel - // convert to final format - switch( req_comp ) - { - case 1: - // RGBA => Luminance - tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); - break; - case 2: - // RGBA => Luminance,Alpha - tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]); - tga_data[i*req_comp+1] = trans_data[3]; - break; - case 3: - // RGBA => RGB - tga_data[i*req_comp+0] = trans_data[0]; - tga_data[i*req_comp+1] = trans_data[1]; - tga_data[i*req_comp+2] = trans_data[2]; - break; - case 4: - // RGBA => RGBA - tga_data[i*req_comp+0] = trans_data[0]; - tga_data[i*req_comp+1] = trans_data[1]; - tga_data[i*req_comp+2] = trans_data[2]; - tga_data[i*req_comp+3] = trans_data[3]; - break; - } - // in case we're in RLE mode, keep counting down - --RLE_count; - } - // do I need to invert the image? - if( tga_inverted ) - { - for( j = 0; j*2 < tga_height; ++j ) - { - int index1 = j * tga_width * req_comp; - int index2 = (tga_height - 1 - j) * tga_width * req_comp; - for( i = tga_width * req_comp; i > 0; --i ) - { - unsigned char temp = tga_data[index1]; - tga_data[index1] = tga_data[index2]; - tga_data[index2] = temp; - ++index1; - ++index2; - } - } - } - // clear my palette, if I had one - if( tga_palette != NULL ) - { - free( tga_palette ); - } - // the things I do to get rid of an error message, and yet keep - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = - tga_x_origin = tga_y_origin = 0; - // OK, done - return tga_data; -} - -#ifndef STBI_NO_STDIO -stbi_uc *stbi_tga_load (char const *filename, int *x, int *y, int *comp, int req_comp) -{ - stbi_uc *data; - FILE *f = fopen(filename, "rb"); - if (!f) return NULL; - data = stbi_tga_load_from_file(f, x,y,comp,req_comp); - fclose(f); - return data; -} - -stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_file(&s, f); - return tga_load(&s, x,y,comp,req_comp); -} -#endif - -stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_mem(&s, buffer, len); - return tga_load(&s, x,y,comp,req_comp); -} - - -// ************************************************************************************************* -// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicholas Schulz, tweaked by STB - -static int psd_test(stbi *s) -{ - if (get32(s) != 0x38425053) return 0; // "8BPS" - else return 1; -} - -#ifndef STBI_NO_STDIO -int stbi_psd_test_file(FILE *f) -{ - stbi s; - int r,n = ftell(f); - start_file(&s, f); - r = psd_test(&s); - fseek(f,n,SEEK_SET); - return r; -} -#endif - -int stbi_psd_test_memory(stbi_uc const *buffer, int len) -{ - stbi s; - start_mem(&s, buffer, len); - return psd_test(&s); -} - -static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - int pixelCount; - int channelCount, compression; - int channel, i, count, len; - int w,h; - uint8 *out; - - // Check identifier - if (get32(s) != 0x38425053) // "8BPS" - return epuc("not PSD", "Corrupt PSD image"); - - // Check file type version. - if (get16(s) != 1) - return epuc("wrong version", "Unsupported version of PSD image"); - - // Skip 6 reserved bytes. - skip(s, 6 ); - - // Read the number of channels (R, G, B, A, etc). - channelCount = get16(s); - if (channelCount < 0 || channelCount > 16) - return epuc("wrong channel count", "Unsupported number of channels in PSD image"); - - // Read the rows and columns of the image. - h = get32(s); - w = get32(s); - - // Make sure the depth is 8 bits. - if (get16(s) != 8) - return epuc("unsupported bit depth", "PSD bit depth is not 8 bit"); - - // Make sure the color mode is RGB. - // Valid options are: - // 0: Bitmap - // 1: Grayscale - // 2: Indexed color - // 3: RGB color - // 4: CMYK color - // 7: Multichannel - // 8: Duotone - // 9: Lab color - if (get16(s) != 3) - return epuc("wrong color format", "PSD is not in RGB color format"); - - // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) - skip(s,get32(s) ); - - // Skip the image resources. (resolution, pen tool paths, etc) - skip(s, get32(s) ); - - // Skip the reserved data. - skip(s, get32(s) ); - - // Find out if the data is compressed. - // Known values: - // 0: no compression - // 1: RLE compressed - compression = get16(s); - if (compression > 1) - return epuc("bad compression", "PSD has an unknown compression format"); - - // Create the destination image. - out = (stbi_uc *) malloc(4 * w*h); - if (!out) return epuc("outofmem", "Out of memory"); - pixelCount = w*h; - - // Initialize the data to zero. - //memset( out, 0, pixelCount * 4 ); - - // Finally, the image data. - if (compression) { - // RLE as used by .PSD and .TIFF - // Loop until you get the number of unpacked bytes you are expecting: - // Read the next source byte into n. - // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. - // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. - // Else if n is 128, noop. - // Endloop - - // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, - // which we're going to just skip. - skip(s, h * channelCount * 2 ); - - // Read the RLE data by channel. - for (channel = 0; channel < 4; channel++) { - uint8 *p; - - p = out+channel; - if (channel >= channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4; - } else { - // Read the RLE data. - count = 0; - while (count < pixelCount) { - len = get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - count += len; - while (len) { - *p = get8(s); - p += 4; - len--; - } - } else if (len > 128) { - uint32 val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len ^= 0x0FF; - len += 2; - val = get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } - } - } - } - - } else { - // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit value for each pixel in the image. - - // Read the data by channel. - for (channel = 0; channel < 4; channel++) { - uint8 *p; - - p = out + channel; - if (channel > channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4; - } else { - // Read the data. - count = 0; - for (i = 0; i < pixelCount; i++) - *p = get8(s), p += 4; - } - } - } - - if (req_comp && req_comp != 4) { - out = convert_format(out, 4, req_comp, w, h); - if (out == NULL) return out; // convert_format frees input on failure - } - - if (comp) *comp = channelCount; - *y = h; - *x = w; - - return out; -} - -#ifndef STBI_NO_STDIO -stbi_uc *stbi_psd_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - stbi_uc *data; - FILE *f = fopen(filename, "rb"); - if (!f) return NULL; - data = stbi_psd_load_from_file(f, x,y,comp,req_comp); - fclose(f); - return data; -} - -stbi_uc *stbi_psd_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_file(&s, f); - return psd_load(&s, x,y,comp,req_comp); -} -#endif - -stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_mem(&s, buffer, len); - return psd_load(&s, x,y,comp,req_comp); -} - - -// ************************************************************************************************* -// Radiance RGBE HDR loader -// originally by Nicolas Schulz -#ifndef STBI_NO_HDR -static int hdr_test(stbi *s) -{ - char *signature = "#?RADIANCE\n"; - int i; - for (i=0; signature[i]; ++i) - if (get8(s) != signature[i]) - return 0; - return 1; -} - -int stbi_hdr_test_memory(stbi_uc const *buffer, int len) -{ - stbi s; - start_mem(&s, buffer, len); - return hdr_test(&s); -} - -#ifndef STBI_NO_STDIO -int stbi_hdr_test_file(FILE *f) -{ - stbi s; - int r,n = ftell(f); - start_file(&s, f); - r = hdr_test(&s); - fseek(f,n,SEEK_SET); - return r; -} -#endif - -#define HDR_BUFLEN 1024 -static char *hdr_gettoken(stbi *z, char *buffer) -{ - int len=0; - char *s = buffer, c = '\0'; - - c = get8(z); - - while (!at_eof(z) && c != '\n') { - buffer[len++] = c; - if (len == HDR_BUFLEN-1) { - // flush to end of line - while (!at_eof(z) && get8(z) != '\n') - ; - break; - } - c = get8(z); - } - - buffer[len] = 0; - return buffer; -} - -static void hdr_convert(float *output, stbi_uc *input, int req_comp) -{ - if( input[3] != 0 ) { - float f1; - // Exponent - f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); - if (req_comp <= 2) - output[0] = (input[0] + input[1] + input[2]) * f1 / 3; - else { - output[0] = input[0] * f1; - output[1] = input[1] * f1; - output[2] = input[2] * f1; - } - if (req_comp == 2) output[1] = 1; - if (req_comp == 4) output[3] = 1; - } else { - switch (req_comp) { - case 4: output[3] = 1; /* fallthrough */ - case 3: output[0] = output[1] = output[2] = 0; - break; - case 2: output[1] = 1; /* fallthrough */ - case 1: output[0] = 0; - break; - } - } -} - - -static float *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - char buffer[HDR_BUFLEN]; - char *token; - int valid = 0; - int width, height; - stbi_uc *scanline; - float *hdr_data; - int len; - unsigned char count, value; - int i, j, k, c1,c2, z; - - - // Check identifier - if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) - return epf("not HDR", "Corrupt HDR image"); - - // Parse header - while(1) { - token = hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) return epf("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) return epf("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = strtol(token, NULL, 10); - - *x = width; - *y = height; - - *comp = 3; - if (req_comp == 0) req_comp = 3; - - // Read data - hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); - - // Load image data - // image data is stored as some number of sca - if( width < 8 || width >= 32768) { - // Read flat data - for (j=0; j < height; ++j) { - for (i=0; i < width; ++i) { - stbi_uc rgbe[4]; - main_decode_loop: - getn(s, rgbe, 4); - hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); - } - } - } else { - // Read RLE-encoded data - scanline = NULL; - - for (j = 0; j < height; ++j) { - c1 = get8(s); - c2 = get8(s); - len = get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - stbi_uc rgbe[4] = { c1,c2,len, get8(s) }; - hdr_convert(hdr_data, rgbe, req_comp); - i = 1; - j = 0; - free(scanline); - goto main_decode_loop; // yes, this is fucking insane; blame the fucking insane format - } - len <<= 8; - len |= get8(s); - if (len != width) { free(hdr_data); free(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); - - for (k = 0; k < 4; ++k) { - i = 0; - while (i < width) { - count = get8(s); - if (count > 128) { - // Run - value = get8(s); - count -= 128; - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = get8(s); - } - } - } - for (i=0; i < width; ++i) - hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); - } - free(scanline); - } - - return hdr_data; -} -static stbi_uc *hdr_load_rgbe(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - char buffer[HDR_BUFLEN]; - char *token; - int valid = 0; - int width, height; - stbi_uc *scanline; - stbi_uc *rgbe_data; - int len; - unsigned char count, value; - int i, j, k, c1,c2, z; - - - // Check identifier - if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) - return epuc("not HDR", "Corrupt HDR image"); - - // Parse header - while(1) { - token = hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) return epuc("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) return epuc("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) return epuc("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = strtol(token, NULL, 10); - - *x = width; - *y = height; - - // RGBE _MUST_ come out as 4 components - *comp = 4; - req_comp = 4; - - // Read data - rgbe_data = (stbi_uc *) malloc(height * width * req_comp * sizeof(stbi_uc)); - // point to the beginning - scanline = rgbe_data; - - // Load image data - // image data is stored as some number of scan lines - if( width < 8 || width >= 32768) { - // Read flat data - for (j=0; j < height; ++j) { - for (i=0; i < width; ++i) { - main_decode_loop: - //getn(rgbe, 4); - getn(s,scanline, 4); - scanline += 4; - } - } - } else { - // Read RLE-encoded data - for (j = 0; j < height; ++j) { - c1 = get8(s); - c2 = get8(s); - len = get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - scanline[0] = c1; - scanline[1] = c2; - scanline[2] = len; - scanline[3] = get8(s); - scanline += 4; - i = 1; - j = 0; - goto main_decode_loop; // yes, this is insane; blame the insane format - } - len <<= 8; - len |= get8(s); - if (len != width) { free(rgbe_data); return epuc("invalid decoded scanline length", "corrupt HDR"); } - for (k = 0; k < 4; ++k) { - i = 0; - while (i < width) { - count = get8(s); - if (count > 128) { - // Run - value = get8(s); - count -= 128; - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = get8(s); - } - } - } - // move the scanline on - scanline += 4 * width; - } - } - - return rgbe_data; -} - -#ifndef STBI_NO_STDIO -float *stbi_hdr_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_file(&s,f); - return hdr_load(&s,x,y,comp,req_comp); -} - -stbi_uc *stbi_hdr_load_rgbe_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_file(&s,f); - return hdr_load_rgbe(&s,x,y,comp,req_comp); -} - -stbi_uc *stbi_hdr_load_rgbe (char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = fopen(filename, "rb"); - unsigned char *result; - if (!f) return epuc("can't fopen", "Unable to open file"); - result = stbi_hdr_load_rgbe_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} -#endif - -float *stbi_hdr_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_mem(&s,buffer, len); - return hdr_load(&s,x,y,comp,req_comp); -} - -stbi_uc *stbi_hdr_load_rgbe_memory(stbi_uc *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_mem(&s,buffer, len); - return hdr_load_rgbe(&s,x,y,comp,req_comp); -} -#endif // STBI_NO_HDR - -/////////////////////// write image /////////////////////// - -#ifndef STBI_NO_WRITE - -static void write8(FILE *f, int x) { uint8 z = (uint8) x; fwrite(&z,1,1,f); } - -static void writefv(FILE *f, char *fmt, va_list v) -{ - while (*fmt) { - switch (*fmt++) { - case ' ': break; - case '1': { uint8 x = va_arg(v, int); write8(f,x); break; } - case '2': { int16 x = va_arg(v, int); write8(f,x); write8(f,x>>8); break; } - case '4': { int32 x = va_arg(v, int); write8(f,x); write8(f,x>>8); write8(f,x>>16); write8(f,x>>24); break; } - default: - assert(0); - va_end(v); - return; - } - } -} - -static void writef(FILE *f, char *fmt, ...) -{ - va_list v; - va_start(v, fmt); - writefv(f,fmt,v); - va_end(v); -} - -static void write_pixels(FILE *f, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad) -{ - uint8 bg[3] = { 255, 0, 255}, px[3]; - uint32 zero = 0; - int i,j,k, j_end; - - if (vdir < 0) - j_end = -1, j = y-1; - else - j_end = y, j = 0; - - for (; j != j_end; j += vdir) { - for (i=0; i < x; ++i) { - uint8 *d = (uint8 *) data + (j*x+i)*comp; - if (write_alpha < 0) - fwrite(&d[comp-1], 1, 1, f); - switch (comp) { - case 1: - case 2: writef(f, "111", d[0],d[0],d[0]); - break; - case 4: - if (!write_alpha) { - for (k=0; k < 3; ++k) - px[k] = bg[k] + ((d[k] - bg[k]) * d[3])/255; - writef(f, "111", px[1-rgb_dir],px[1],px[1+rgb_dir]); - break; - } - /* FALLTHROUGH */ - case 3: - writef(f, "111", d[1-rgb_dir],d[1],d[1+rgb_dir]); - break; - } - if (write_alpha > 0) - fwrite(&d[comp-1], 1, 1, f); - } - fwrite(&zero,scanline_pad,1,f); - } -} - -static int outfile(char const *filename, int rgb_dir, int vdir, int x, int y, int comp, void *data, int alpha, int pad, char *fmt, ...) -{ - FILE *f = fopen(filename, "wb"); - if (f) { - va_list v; - va_start(v, fmt); - writefv(f, fmt, v); - va_end(v); - write_pixels(f,rgb_dir,vdir,x,y,comp,data,alpha,pad); - fclose(f); - } - return f != NULL; -} - -int stbi_write_bmp(char const *filename, int x, int y, int comp, void *data) -{ - int pad = (-x*3) & 3; - return outfile(filename,-1,-1,x,y,comp,data,0,pad, - "11 4 22 4" "4 44 22 444444", - 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header - 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header -} - -int stbi_write_tga(char const *filename, int x, int y, int comp, void *data) -{ - int has_alpha = !(comp & 1); - return outfile(filename, -1,-1, x, y, comp, data, has_alpha, 0, - "111 221 2222 11", 0,0,2, 0,0,0, 0,0,x,y, 24+8*has_alpha, 8*has_alpha); -} - -// any other image formats that do interleaved rgb data? -// PNG: requires adler32,crc32 -- significant amount of code -// PSD: no, channels output separately -// TIFF: no, stripwise-interleaved... i think - -#endif // STBI_NO_WRITE - -// add in my DDS loading support -#ifndef STBI_NO_DDS -#include "stbi_DDS_aug_c.h" -#endif \ No newline at end of file diff --git a/src/SFML/Graphics/SOIL/stb_image_aug.h b/src/SFML/Graphics/SOIL/stb_image_aug.h deleted file mode 100644 index 22ccc309..00000000 --- a/src/SFML/Graphics/SOIL/stb_image_aug.h +++ /dev/null @@ -1,357 +0,0 @@ -/* stbi-1.18 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c - when you control the images you're loading - - QUICK NOTES: - Primarily of interest to game developers and other people who can - avoid problematic images and only need the trivial interface - - JPEG baseline (no JPEG progressive, no oddball channel decimations) - PNG 8-bit only - BMP non-1bpp, non-RLE - TGA (not sure what subset, if a subset) - PSD (composited view only, no extra channels) - HDR (radiance rgbE format) - writes BMP,TGA (define STBI_NO_WRITE to remove code) - decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code) - supports installable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) - - TODO: - stbi_info_* - - history: - 1.18 fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug; header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less - than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant -*/ - - -#ifndef STBI_INCLUDE_STB_IMAGE_H -#define STBI_INCLUDE_STB_IMAGE_H - -//// begin header file //////////////////////////////////////////////////// -// -// Limitations: -// - no progressive/interlaced support (jpeg, png) -// - 8-bit samples only (jpeg, png) -// - not threadsafe -// - channel subsampling of at most 2 in each dimension (jpeg) -// - no delayed line count (jpeg) -- IJG doesn't support either -// -// Basic usage (see HDR discussion below): -// int x,y,n; -// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); -// // ... process data if not NULL ... -// // ... x = width, y = height, n = # 8-bit components per pixel ... -// // ... replace '0' with '1'..'4' to force that many components per pixel -// stbi_image_free(data) -// -// Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *comp -- outputs # of image components in image file -// int req_comp -- if non-zero, # of image components requested in result -// -// The return value from an image loader is an 'unsigned char *' which points -// to the pixel data. The pixel data consists of *y scanlines of *x pixels, -// with each pixel consisting of N interleaved 8-bit components; the first -// pixel pointed to is top-left-most in the image. There is no padding between -// image scanlines or between pixels, regardless of format. The number of -// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. -// If req_comp is non-zero, *comp has the number of components that _would_ -// have been output otherwise. E.g. if you set req_comp to 4, you will always -// get RGBA output, but you can check *comp to easily see if it's opaque. -// -// An output image with N components has the following components interleaved -// in this order in each pixel: -// -// N=#comp components -// 1 grey -// 2 grey, alpha -// 3 red, green, blue -// 4 red, green, blue, alpha -// -// If image loading fails for any reason, the return value will be NULL, -// and *x, *y, *comp will be unchanged. The function stbi_failure_reason() -// can be queried for an extremely brief, end-user unfriendly explanation -// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid -// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly -// more user-friendly ones. -// -// Paletted PNG and BMP images are automatically depalettized. -// -// -// =========================================================================== -// -// HDR image support (disable by defining STBI_NO_HDR) -// -// stb_image now supports loading HDR images in general, and currently -// the Radiance .HDR file format, although the support is provided -// generically. You can still load any file through the existing interface; -// if you attempt to load an HDR file, it will be automatically remapped to -// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; -// both of these constants can be reconfigured through this interface: -// -// stbi_hdr_to_ldr_gamma(2.2f); -// stbi_hdr_to_ldr_scale(1.0f); -// -// (note, do not use _inverse_ constants; stbi_image will invert them -// appropriately). -// -// Additionally, there is a new, parallel interface for loading files as -// (linear) floats to preserve the full dynamic range: -// -// float *data = stbi_loadf(filename, &x, &y, &n, 0); -// -// If you load LDR images through this interface, those images will -// be promoted to floating point values, run through the inverse of -// constants corresponding to the above: -// -// stbi_ldr_to_hdr_scale(1.0f); -// stbi_ldr_to_hdr_gamma(2.2f); -// -// Finally, given a filename (or an open file or memory block--see header -// file for details) containing image data, you can query for the "most -// appropriate" interface to use (that is, whether the image is HDR or -// not), using: -// -// stbi_is_hdr(char *filename); - -#ifndef STBI_NO_STDIO -#include -#endif - -#define STBI_VERSION 1 - -enum -{ - STBI_default = 0, // only used for req_comp - - STBI_grey = 1, - STBI_grey_alpha = 2, - STBI_rgb = 3, - STBI_rgb_alpha = 4, -}; - -typedef unsigned char stbi_uc; - -#ifdef __cplusplus -extern "C" { -#endif - -// WRITING API - -#if !defined(STBI_NO_WRITE) && !defined(STBI_NO_STDIO) -// write a BMP/TGA file given tightly packed 'comp' channels (no padding, nor bmp-stride-padding) -// (you must include the appropriate extension in the filename). -// returns TRUE on success, FALSE if couldn't open file, error writing file -extern int stbi_write_bmp (char const *filename, int x, int y, int comp, void *data); -extern int stbi_write_tga (char const *filename, int x, int y, int comp, void *data); -#endif - -// PRIMARY API - works on images of any type - -// load image by filename, open file, or memory buffer -#ifndef STBI_NO_STDIO -extern stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); -extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); -#endif -extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -// for stbi_load_from_file, file pointer is left pointing immediately after image - -#ifndef STBI_NO_HDR -#ifndef STBI_NO_STDIO -extern float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); -extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -#endif -extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); - -extern void stbi_hdr_to_ldr_gamma(float gamma); -extern void stbi_hdr_to_ldr_scale(float scale); - -extern void stbi_ldr_to_hdr_gamma(float gamma); -extern void stbi_ldr_to_hdr_scale(float scale); - -#endif // STBI_NO_HDR - -// get a VERY brief reason for failure -// NOT THREADSAFE -extern char *stbi_failure_reason (void); - -// free the loaded image -- this is just free() -extern void stbi_image_free (void *retval_from_stbi_load); - -// get image dimensions & components without fully decoding -extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); -extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); -#ifndef STBI_NO_STDIO -extern int stbi_info (char const *filename, int *x, int *y, int *comp); -extern int stbi_is_hdr (char const *filename); -extern int stbi_is_hdr_from_file(FILE *f); -#endif - -// ZLIB client - used by PNG, available for other purposes - -extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); -extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); -extern int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - -extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); -extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - -// TYPE-SPECIFIC ACCESS - -// is it a jpeg? -extern int stbi_jpeg_test_memory (stbi_uc const *buffer, int len); -extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -extern int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); - -#ifndef STBI_NO_STDIO -extern stbi_uc *stbi_jpeg_load (char const *filename, int *x, int *y, int *comp, int req_comp); -extern int stbi_jpeg_test_file (FILE *f); -extern stbi_uc *stbi_jpeg_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); - -extern int stbi_jpeg_info (char const *filename, int *x, int *y, int *comp); -extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp); -#endif - -// is it a png? -extern int stbi_png_test_memory (stbi_uc const *buffer, int len); -extern stbi_uc *stbi_png_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -extern int stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp); - -#ifndef STBI_NO_STDIO -extern stbi_uc *stbi_png_load (char const *filename, int *x, int *y, int *comp, int req_comp); -extern int stbi_png_info (char const *filename, int *x, int *y, int *comp); -extern int stbi_png_test_file (FILE *f); -extern stbi_uc *stbi_png_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -extern int stbi_png_info_from_file (FILE *f, int *x, int *y, int *comp); -#endif - -// is it a bmp? -extern int stbi_bmp_test_memory (stbi_uc const *buffer, int len); - -extern stbi_uc *stbi_bmp_load (char const *filename, int *x, int *y, int *comp, int req_comp); -extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -#ifndef STBI_NO_STDIO -extern int stbi_bmp_test_file (FILE *f); -extern stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -#endif - -// is it a tga? -extern int stbi_tga_test_memory (stbi_uc const *buffer, int len); - -extern stbi_uc *stbi_tga_load (char const *filename, int *x, int *y, int *comp, int req_comp); -extern stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -#ifndef STBI_NO_STDIO -extern int stbi_tga_test_file (FILE *f); -extern stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -#endif - -// is it a psd? -extern int stbi_psd_test_memory (stbi_uc const *buffer, int len); - -extern stbi_uc *stbi_psd_load (char const *filename, int *x, int *y, int *comp, int req_comp); -extern stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -#ifndef STBI_NO_STDIO -extern int stbi_psd_test_file (FILE *f); -extern stbi_uc *stbi_psd_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -#endif - -// is it an hdr? -extern int stbi_hdr_test_memory (stbi_uc const *buffer, int len); - -extern float * stbi_hdr_load (char const *filename, int *x, int *y, int *comp, int req_comp); -extern float * stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -extern stbi_uc *stbi_hdr_load_rgbe (char const *filename, int *x, int *y, int *comp, int req_comp); -extern float * stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -#ifndef STBI_NO_STDIO -extern int stbi_hdr_test_file (FILE *f); -extern float * stbi_hdr_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -#endif - -// define new loaders -typedef struct -{ - int (*test_memory)(stbi_uc const *buffer, int len); - stbi_uc * (*load_from_memory)(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); - #ifndef STBI_NO_STDIO - int (*test_file)(FILE *f); - stbi_uc * (*load_from_file)(FILE *f, int *x, int *y, int *comp, int req_comp); - #endif -} stbi_loader; - -// register a loader by filling out the above structure (you must defined ALL functions) -// returns 1 if added or already added, 0 if not added (too many loaders) -// NOT THREADSAFE -extern int stbi_register_loader(stbi_loader *loader); - -// define faster low-level operations (typically SIMD support) -#if STBI_SIMD -typedef void (*stbi_idct_8x8)(uint8 *out, int out_stride, short data[64], unsigned short *dequantize); -// compute an integer IDCT on "input" -// input[x] = data[x] * dequantize[x] -// write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' -// CLAMP results to 0..255 -typedef void (*stbi_YCbCr_to_RGB_run)(uint8 *output, uint8 const *y, uint8 const *cb, uint8 const *cr, int count, int step); -// compute a conversion from YCbCr to RGB -// 'count' pixels -// write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B -// y: Y input channel -// cb: Cb input channel; scale/biased to be 0..255 -// cr: Cr input channel; scale/biased to be 0..255 - -extern void stbi_install_idct(stbi_idct_8x8 func); -extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); -#endif // STBI_SIMD - -#ifdef __cplusplus -} -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // STBI_INCLUDE_STB_IMAGE_H - diff --git a/src/SFML/Graphics/SOIL/stbi_DDS_aug.h b/src/SFML/Graphics/SOIL/stbi_DDS_aug.h deleted file mode 100644 index 7317d63b..00000000 --- a/src/SFML/Graphics/SOIL/stbi_DDS_aug.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - adding DDS loading support to stbi -*/ - -#ifndef HEADER_STB_IMAGE_DDS_AUGMENTATION -#define HEADER_STB_IMAGE_DDS_AUGMENTATION - -// is it a DDS file? -extern int stbi_dds_test_memory (stbi_uc const *buffer, int len); - -extern stbi_uc *stbi_dds_load (char *filename, int *x, int *y, int *comp, int req_comp); -extern stbi_uc *stbi_dds_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); -#ifndef STBI_NO_STDIO -extern int stbi_dds_test_file (FILE *f); -extern stbi_uc *stbi_dds_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // HEADER_STB_IMAGE_DDS_AUGMENTATION diff --git a/src/SFML/Graphics/SOIL/stbi_DDS_aug_c.h b/src/SFML/Graphics/SOIL/stbi_DDS_aug_c.h deleted file mode 100644 index 683d1cf0..00000000 --- a/src/SFML/Graphics/SOIL/stbi_DDS_aug_c.h +++ /dev/null @@ -1,511 +0,0 @@ - -/// DDS file support, does decoding, _not_ direct uploading -/// (use SOIL for that ;-) - -/// A bunch of DirectDraw Surface structures and flags -typedef struct { - unsigned int dwMagic; - unsigned int dwSize; - unsigned int dwFlags; - unsigned int dwHeight; - unsigned int dwWidth; - unsigned int dwPitchOrLinearSize; - unsigned int dwDepth; - unsigned int dwMipMapCount; - unsigned int dwReserved1[ 11 ]; - - // DDPIXELFORMAT - struct { - unsigned int dwSize; - unsigned int dwFlags; - unsigned int dwFourCC; - unsigned int dwRGBBitCount; - unsigned int dwRBitMask; - unsigned int dwGBitMask; - unsigned int dwBBitMask; - unsigned int dwAlphaBitMask; - } sPixelFormat; - - // DDCAPS2 - struct { - unsigned int dwCaps1; - unsigned int dwCaps2; - unsigned int dwDDSX; - unsigned int dwReserved; - } sCaps; - unsigned int dwReserved2; -} DDS_header ; - -// the following constants were copied directly off the MSDN website - -// The dwFlags member of the original DDSURFACEDESC2 structure -// can be set to one or more of the following values. -#define DDSD_CAPS 0x00000001 -#define DDSD_HEIGHT 0x00000002 -#define DDSD_WIDTH 0x00000004 -#define DDSD_PITCH 0x00000008 -#define DDSD_PIXELFORMAT 0x00001000 -#define DDSD_MIPMAPCOUNT 0x00020000 -#define DDSD_LINEARSIZE 0x00080000 -#define DDSD_DEPTH 0x00800000 - -// DirectDraw Pixel Format -#define DDPF_ALPHAPIXELS 0x00000001 -#define DDPF_FOURCC 0x00000004 -#define DDPF_RGB 0x00000040 - -// The dwCaps1 member of the DDSCAPS2 structure can be -// set to one or more of the following values. -#define DDSCAPS_COMPLEX 0x00000008 -#define DDSCAPS_TEXTURE 0x00001000 -#define DDSCAPS_MIPMAP 0x00400000 - -// The dwCaps2 member of the DDSCAPS2 structure can be -// set to one or more of the following values. -#define DDSCAPS2_CUBEMAP 0x00000200 -#define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400 -#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800 -#define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000 -#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000 -#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000 -#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000 -#define DDSCAPS2_VOLUME 0x00200000 - -static int dds_test(stbi *s) -{ - // check the magic number - if (get8(s) != 'D') return 0; - if (get8(s) != 'D') return 0; - if (get8(s) != 'S') return 0; - if (get8(s) != ' ') return 0; - // check header size - if (get32le(s) != 124) return 0; - return 1; -} -#ifndef STBI_NO_STDIO -int stbi_dds_test_file (FILE *f) -{ - stbi s; - int r,n = ftell(f); - start_file(&s,f); - r = dds_test(&s); - fseek(f,n,SEEK_SET); - return r; -} -#endif - -int stbi_dds_test_memory (stbi_uc const *buffer, int len) -{ - stbi s; - start_mem(&s,buffer, len); - return dds_test(&s); -} - -// helper functions -int stbi_convert_bit_range( int c, int from_bits, int to_bits ) -{ - int b = (1 << (from_bits - 1)) + c * ((1 << to_bits) - 1); - return (b + (b >> from_bits)) >> from_bits; -} -void stbi_rgb_888_from_565( unsigned int c, int *r, int *g, int *b ) -{ - *r = stbi_convert_bit_range( (c >> 11) & 31, 5, 8 ); - *g = stbi_convert_bit_range( (c >> 05) & 63, 6, 8 ); - *b = stbi_convert_bit_range( (c >> 00) & 31, 5, 8 ); -} -void stbi_decode_DXT1_block( - unsigned char uncompressed[16*4], - unsigned char compressed[8] ) -{ - int next_bit = 4*8; - int i, r, g, b; - int c0, c1; - unsigned char decode_colors[4*4]; - // find the 2 primary colors - c0 = compressed[0] + (compressed[1] << 8); - c1 = compressed[2] + (compressed[3] << 8); - stbi_rgb_888_from_565( c0, &r, &g, &b ); - decode_colors[0] = r; - decode_colors[1] = g; - decode_colors[2] = b; - decode_colors[3] = 255; - stbi_rgb_888_from_565( c1, &r, &g, &b ); - decode_colors[4] = r; - decode_colors[5] = g; - decode_colors[6] = b; - decode_colors[7] = 255; - if( c0 > c1 ) - { - // no alpha, 2 interpolated colors - decode_colors[8] = (2*decode_colors[0] + decode_colors[4]) / 3; - decode_colors[9] = (2*decode_colors[1] + decode_colors[5]) / 3; - decode_colors[10] = (2*decode_colors[2] + decode_colors[6]) / 3; - decode_colors[11] = 255; - decode_colors[12] = (decode_colors[0] + 2*decode_colors[4]) / 3; - decode_colors[13] = (decode_colors[1] + 2*decode_colors[5]) / 3; - decode_colors[14] = (decode_colors[2] + 2*decode_colors[6]) / 3; - decode_colors[15] = 255; - } else - { - // 1 interpolated color, alpha - decode_colors[8] = (decode_colors[0] + decode_colors[4]) / 2; - decode_colors[9] = (decode_colors[1] + decode_colors[5]) / 2; - decode_colors[10] = (decode_colors[2] + decode_colors[6]) / 2; - decode_colors[11] = 255; - decode_colors[12] = 0; - decode_colors[13] = 0; - decode_colors[14] = 0; - decode_colors[15] = 0; - } - // decode the block - for( i = 0; i < 16*4; i += 4 ) - { - int idx = ((compressed[next_bit>>3] >> (next_bit & 7)) & 3) * 4; - next_bit += 2; - uncompressed[i+0] = decode_colors[idx+0]; - uncompressed[i+1] = decode_colors[idx+1]; - uncompressed[i+2] = decode_colors[idx+2]; - uncompressed[i+3] = decode_colors[idx+3]; - } - // done -} -void stbi_decode_DXT23_alpha_block( - unsigned char uncompressed[16*4], - unsigned char compressed[8] ) -{ - int i, next_bit = 0; - // each alpha value gets 4 bits - for( i = 3; i < 16*4; i += 4 ) - { - uncompressed[i] = stbi_convert_bit_range( - (compressed[next_bit>>3] >> (next_bit&7)) & 15, - 4, 8 ); - next_bit += 4; - } -} -void stbi_decode_DXT45_alpha_block( - unsigned char uncompressed[16*4], - unsigned char compressed[8] ) -{ - int i, next_bit = 8*2; - unsigned char decode_alpha[8]; - // each alpha value gets 3 bits, and the 1st 2 bytes are the range - decode_alpha[0] = compressed[0]; - decode_alpha[1] = compressed[1]; - if( decode_alpha[0] > decode_alpha[1] ) - { - // 6 step intermediate - decode_alpha[2] = (6*decode_alpha[0] + 1*decode_alpha[1]) / 7; - decode_alpha[3] = (5*decode_alpha[0] + 2*decode_alpha[1]) / 7; - decode_alpha[4] = (4*decode_alpha[0] + 3*decode_alpha[1]) / 7; - decode_alpha[5] = (3*decode_alpha[0] + 4*decode_alpha[1]) / 7; - decode_alpha[6] = (2*decode_alpha[0] + 5*decode_alpha[1]) / 7; - decode_alpha[7] = (1*decode_alpha[0] + 6*decode_alpha[1]) / 7; - } else - { - // 4 step intermediate, pluss full and none - decode_alpha[2] = (4*decode_alpha[0] + 1*decode_alpha[1]) / 5; - decode_alpha[3] = (3*decode_alpha[0] + 2*decode_alpha[1]) / 5; - decode_alpha[4] = (2*decode_alpha[0] + 3*decode_alpha[1]) / 5; - decode_alpha[5] = (1*decode_alpha[0] + 4*decode_alpha[1]) / 5; - decode_alpha[6] = 0; - decode_alpha[7] = 255; - } - for( i = 3; i < 16*4; i += 4 ) - { - int idx = 0, bit; - bit = (compressed[next_bit>>3] >> (next_bit&7)) & 1; - idx += bit << 0; - ++next_bit; - bit = (compressed[next_bit>>3] >> (next_bit&7)) & 1; - idx += bit << 1; - ++next_bit; - bit = (compressed[next_bit>>3] >> (next_bit&7)) & 1; - idx += bit << 2; - ++next_bit; - uncompressed[i] = decode_alpha[idx & 7]; - } - // done -} -void stbi_decode_DXT_color_block( - unsigned char uncompressed[16*4], - unsigned char compressed[8] ) -{ - int next_bit = 4*8; - int i, r, g, b; - int c0, c1; - unsigned char decode_colors[4*3]; - // find the 2 primary colors - c0 = compressed[0] + (compressed[1] << 8); - c1 = compressed[2] + (compressed[3] << 8); - stbi_rgb_888_from_565( c0, &r, &g, &b ); - decode_colors[0] = r; - decode_colors[1] = g; - decode_colors[2] = b; - stbi_rgb_888_from_565( c1, &r, &g, &b ); - decode_colors[3] = r; - decode_colors[4] = g; - decode_colors[5] = b; - // Like DXT1, but no choicees: - // no alpha, 2 interpolated colors - decode_colors[6] = (2*decode_colors[0] + decode_colors[3]) / 3; - decode_colors[7] = (2*decode_colors[1] + decode_colors[4]) / 3; - decode_colors[8] = (2*decode_colors[2] + decode_colors[5]) / 3; - decode_colors[9] = (decode_colors[0] + 2*decode_colors[3]) / 3; - decode_colors[10] = (decode_colors[1] + 2*decode_colors[4]) / 3; - decode_colors[11] = (decode_colors[2] + 2*decode_colors[5]) / 3; - // decode the block - for( i = 0; i < 16*4; i += 4 ) - { - int idx = ((compressed[next_bit>>3] >> (next_bit & 7)) & 3) * 3; - next_bit += 2; - uncompressed[i+0] = decode_colors[idx+0]; - uncompressed[i+1] = decode_colors[idx+1]; - uncompressed[i+2] = decode_colors[idx+2]; - } - // done -} -static stbi_uc *dds_load(stbi *s, int *x, int *y, int *comp, int req_comp) -{ - // all variables go up front - stbi_uc *dds_data = NULL; - stbi_uc block[16*4]; - stbi_uc compressed[8]; - int flags, DXT_family; - int has_alpha, has_mipmap; - int is_compressed, cubemap_faces; - int block_pitch, num_blocks; - DDS_header header; - int i, sz, cf; - // load the header - if( sizeof( DDS_header ) != 128 ) - { - return NULL; - } - getn( s, (stbi_uc*)(&header), 128 ); - // and do some checking - if( header.dwMagic != (('D' << 0) | ('D' << 8) | ('S' << 16) | (' ' << 24)) ) return NULL; - if( header.dwSize != 124 ) return NULL; - flags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; - if( (header.dwFlags & flags) != flags ) return NULL; - /* According to the MSDN spec, the dwFlags should contain - DDSD_LINEARSIZE if it's compressed, or DDSD_PITCH if - uncompressed. Some DDS writers do not conform to the - spec, so I need to make my reader more tolerant */ - if( header.sPixelFormat.dwSize != 32 ) return NULL; - flags = DDPF_FOURCC | DDPF_RGB; - if( (header.sPixelFormat.dwFlags & flags) == 0 ) return NULL; - if( (header.sCaps.dwCaps1 & DDSCAPS_TEXTURE) == 0 ) return NULL; - // get the image data - s->img_x = header.dwWidth; - s->img_y = header.dwHeight; - s->img_n = 4; - is_compressed = (header.sPixelFormat.dwFlags & DDPF_FOURCC) / DDPF_FOURCC; - has_alpha = (header.sPixelFormat.dwFlags & DDPF_ALPHAPIXELS) / DDPF_ALPHAPIXELS; - has_mipmap = (header.sCaps.dwCaps1 & DDSCAPS_MIPMAP) && (header.dwMipMapCount > 1); - cubemap_faces = (header.sCaps.dwCaps2 & DDSCAPS2_CUBEMAP) / DDSCAPS2_CUBEMAP; - /* I need cubemaps to have square faces */ - cubemap_faces &= (s->img_x == s->img_y); - cubemap_faces *= 5; - cubemap_faces += 1; - block_pitch = (s->img_x+3) >> 2; - num_blocks = block_pitch * ((s->img_y+3) >> 2); - /* let the user know what's going on */ - *x = s->img_x; - *y = s->img_y; - *comp = s->img_n; - /* is this uncompressed? */ - if( is_compressed ) - { - /* compressed */ - // note: header.sPixelFormat.dwFourCC is something like (('D'<<0)|('X'<<8)|('T'<<16)|('1'<<24)) - DXT_family = 1 + (header.sPixelFormat.dwFourCC >> 24) - '1'; - if( (DXT_family < 1) || (DXT_family > 5) ) return NULL; - /* check the expected size...oops, nevermind... - those non-compliant writers leave - dwPitchOrLinearSize == 0 */ - // passed all the tests, get the RAM for decoding - sz = (s->img_x)*(s->img_y)*4*cubemap_faces; - dds_data = (unsigned char*)malloc( sz ); - /* do this once for each face */ - for( cf = 0; cf < cubemap_faces; ++ cf ) - { - // now read and decode all the blocks - for( i = 0; i < num_blocks; ++i ) - { - // where are we? - int bx, by, bw=4, bh=4; - int ref_x = 4 * (i % block_pitch); - int ref_y = 4 * (i / block_pitch); - // get the next block's worth of compressed data, and decompress it - if( DXT_family == 1 ) - { - // DXT1 - getn( s, compressed, 8 ); - stbi_decode_DXT1_block( block, compressed ); - } else if( DXT_family < 4 ) - { - // DXT2/3 - getn( s, compressed, 8 ); - stbi_decode_DXT23_alpha_block ( block, compressed ); - getn( s, compressed, 8 ); - stbi_decode_DXT_color_block ( block, compressed ); - } else - { - // DXT4/5 - getn( s, compressed, 8 ); - stbi_decode_DXT45_alpha_block ( block, compressed ); - getn( s, compressed, 8 ); - stbi_decode_DXT_color_block ( block, compressed ); - } - // is this a partial block? - if( ref_x + 4 > s->img_x ) - { - bw = s->img_x - ref_x; - } - if( ref_y + 4 > s->img_y ) - { - bh = s->img_y - ref_y; - } - // now drop our decompressed data into the buffer - for( by = 0; by < bh; ++by ) - { - int idx = 4*((ref_y+by+cf*s->img_x)*s->img_x + ref_x); - for( bx = 0; bx < bw*4; ++bx ) - { - - dds_data[idx+bx] = block[by*16+bx]; - } - } - } - /* done reading and decoding the main image... - skip MIPmaps if present */ - if( has_mipmap ) - { - int block_size = 16; - if( DXT_family == 1 ) - { - block_size = 8; - } - for( i = 1; i < header.dwMipMapCount; ++i ) - { - int mx = s->img_x >> (i + 2); - int my = s->img_y >> (i + 2); - if( mx < 1 ) - { - mx = 1; - } - if( my < 1 ) - { - my = 1; - } - skip( s, mx*my*block_size ); - } - } - }/* per cubemap face */ - } else - { - /* uncompressed */ - DXT_family = 0; - s->img_n = 3; - if( has_alpha ) - { - s->img_n = 4; - } - *comp = s->img_n; - sz = s->img_x*s->img_y*s->img_n*cubemap_faces; - dds_data = (unsigned char*)malloc( sz ); - /* do this once for each face */ - for( cf = 0; cf < cubemap_faces; ++ cf ) - { - /* read the main image for this face */ - getn( s, &dds_data[cf*s->img_x*s->img_y*s->img_n], s->img_x*s->img_y*s->img_n ); - /* done reading and decoding the main image... - skip MIPmaps if present */ - if( has_mipmap ) - { - for( i = 1; i < header.dwMipMapCount; ++i ) - { - int mx = s->img_x >> i; - int my = s->img_y >> i; - if( mx < 1 ) - { - mx = 1; - } - if( my < 1 ) - { - my = 1; - } - skip( s, mx*my*s->img_n ); - } - } - } - /* data was BGR, I need it RGB */ - for( i = 0; i < sz; i += s->img_n ) - { - unsigned char temp = dds_data[i]; - dds_data[i] = dds_data[i+2]; - dds_data[i+2] = temp; - } - } - /* finished decompressing into RGBA, - adjust the y size if we have a cubemap - note: sz is already up to date */ - s->img_y *= cubemap_faces; - *y = s->img_y; - // did the user want something else, or - // see if all the alpha values are 255 (i.e. no transparency) - has_alpha = 0; - if( s->img_n == 4) - { - for( i = 3; (i < sz) && (has_alpha == 0); i += 4 ) - { - has_alpha |= (dds_data[i] < 255); - } - } - if( (req_comp <= 4) && (req_comp >= 1) ) - { - // user has some requirements, meet them - if( req_comp != s->img_n ) - { - dds_data = convert_format( dds_data, s->img_n, req_comp, s->img_x, s->img_y ); - *comp = s->img_n; - } - } else - { - // user had no requirements, only drop to RGB is no alpha - if( (has_alpha == 0) && (s->img_n == 4) ) - { - dds_data = convert_format( dds_data, 4, 3, s->img_x, s->img_y ); - *comp = 3; - } - } - // OK, done - return dds_data; -} - -#ifndef STBI_NO_STDIO -stbi_uc *stbi_dds_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_file(&s,f); - return dds_load(&s,x,y,comp,req_comp); -} - -stbi_uc *stbi_dds_load (char *filename, int *x, int *y, int *comp, int req_comp) -{ - stbi_uc *data; - FILE *f = fopen(filename, "rb"); - if (!f) return NULL; - data = stbi_dds_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return data; -} -#endif - -stbi_uc *stbi_dds_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi s; - start_mem(&s,buffer, len); - return dds_load(&s,x,y,comp,req_comp); -} diff --git a/src/SFML/Graphics/Win32/RenderImageImplPBuffer.hpp b/src/SFML/Graphics/Win32/RenderImageImplPBuffer.hpp index b3e4ba22..1d3fef37 100644 --- a/src/SFML/Graphics/Win32/RenderImageImplPBuffer.hpp +++ b/src/SFML/Graphics/Win32/RenderImageImplPBuffer.hpp @@ -29,8 +29,8 @@ // Headers //////////////////////////////////////////////////////////// #include -#include -#include +#include +#include namespace sf diff --git a/src/SFML/Graphics/libjpeg/cderror.h b/src/SFML/Graphics/libjpeg/cderror.h deleted file mode 100644 index c19d38fb..00000000 --- a/src/SFML/Graphics/libjpeg/cderror.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * cderror.h - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the error and message codes for the cjpeg/djpeg - * applications. These strings are not needed as part of the JPEG library - * proper. - * Edit this file to add new codes, or to translate the message strings to - * some other language. - */ - -/* - * To define the enum list of message codes, include this file without - * defining macro JMESSAGE. To create a message string table, include it - * again with a suitable JMESSAGE definition (see jerror.c for an example). - */ -#ifndef JMESSAGE -#ifndef CDERROR_H -#define CDERROR_H -/* First time through, define the enum list */ -#define JMAKE_ENUM_LIST -#else -/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ -#define JMESSAGE(code,string) -#endif /* CDERROR_H */ -#endif /* JMESSAGE */ - -#ifdef JMAKE_ENUM_LIST - -typedef enum { - -#define JMESSAGE(code,string) code , - -#endif /* JMAKE_ENUM_LIST */ - -JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */ - -#ifdef BMP_SUPPORTED -JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format") -JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported") -JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length") -JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1") -JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB") -JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported") -JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM") -JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image") -JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image") -JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image") -JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image") -#endif /* BMP_SUPPORTED */ - -#ifdef GIF_SUPPORTED -JMESSAGE(JERR_GIF_BUG, "GIF output got confused") -JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d") -JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB") -JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file") -JMESSAGE(JERR_GIF_NOT, "Not a GIF file") -JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image") -JMESSAGE(JTRC_GIF_BADVERSION, - "Warning: unexpected GIF version number '%c%c%c'") -JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x") -JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input") -JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file") -JMESSAGE(JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring") -JMESSAGE(JWRN_GIF_ENDCODE, "Premature end of GIF image") -JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits") -#endif /* GIF_SUPPORTED */ - -#ifdef PPM_SUPPORTED -JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB") -JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file") -JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file") -JMESSAGE(JTRC_PGM, "%ux%u PGM image") -JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image") -JMESSAGE(JTRC_PPM, "%ux%u PPM image") -JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image") -#endif /* PPM_SUPPORTED */ - -#ifdef RLE_SUPPORTED -JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library") -JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB") -JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE") -JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file") -JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header") -JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header") -JMESSAGE(JERR_RLE_NOT, "Not an RLE file") -JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE") -JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup") -JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file") -JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d") -JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file") -JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d") -JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d") -#endif /* RLE_SUPPORTED */ - -#ifdef TARGA_SUPPORTED -JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format") -JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file") -JMESSAGE(JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB") -JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image") -JMESSAGE(JTRC_TGA_GRAY, "%ux%u grayscale Targa image") -JMESSAGE(JTRC_TGA_MAPPED, "%ux%u colormapped Targa image") -#else -JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled") -#endif /* TARGA_SUPPORTED */ - -JMESSAGE(JERR_BAD_CMAP_FILE, - "Color map file is invalid or of unsupported format") -JMESSAGE(JERR_TOO_MANY_COLORS, - "Output file format cannot handle %d colormap entries") -JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed") -#ifdef TARGA_SUPPORTED -JMESSAGE(JERR_UNKNOWN_FORMAT, - "Unrecognized input file format --- perhaps you need -targa") -#else -JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format") -#endif -JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format") - -#ifdef JMAKE_ENUM_LIST - - JMSG_LASTADDONCODE -} ADDON_MESSAGE_CODE; - -#undef JMAKE_ENUM_LIST -#endif /* JMAKE_ENUM_LIST */ - -/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ -#undef JMESSAGE diff --git a/src/SFML/Graphics/libjpeg/jcapimin.c b/src/SFML/Graphics/libjpeg/jcapimin.c deleted file mode 100644 index 493af5c3..00000000 --- a/src/SFML/Graphics/libjpeg/jcapimin.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * jcapimin.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface code for the compression half - * of the JPEG library. These are the "minimum" API routines that may be - * needed in either the normal full-compression case or the transcoding-only - * case. - * - * Most of the routines intended to be called directly by an application - * are in this file or in jcapistd.c. But also see jcparam.c for - * parameter-setup helper routines, jcomapi.c for routines shared by - * compression and decompression, and jctrans.c for the transcoding case. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Initialization of a JPEG compression object. - * The error manager must already be set up (in case memory manager fails). - */ - -GLOBAL(void) -jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize) -{ - int i; - - /* Guard against version mismatches between library and caller. */ - cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ - if (version != JPEG_LIB_VERSION) - ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); - if (structsize != SIZEOF(struct jpeg_compress_struct)) - ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, - (int) SIZEOF(struct jpeg_compress_struct), (int) structsize); - - /* For debugging purposes, we zero the whole master structure. - * But the application has already set the err pointer, and may have set - * client_data, so we have to save and restore those fields. - * Note: if application hasn't set client_data, tools like Purify may - * complain here. - */ - { - struct jpeg_error_mgr * err = cinfo->err; - void * client_data = cinfo->client_data; /* ignore Purify complaint here */ - MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct)); - cinfo->err = err; - cinfo->client_data = client_data; - } - cinfo->is_decompressor = FALSE; - - /* Initialize a memory manager instance for this object */ - jinit_memory_mgr((j_common_ptr) cinfo); - - /* Zero out pointers to permanent structures. */ - cinfo->progress = NULL; - cinfo->dest = NULL; - - cinfo->comp_info = NULL; - - for (i = 0; i < NUM_QUANT_TBLS; i++) - cinfo->quant_tbl_ptrs[i] = NULL; - - for (i = 0; i < NUM_HUFF_TBLS; i++) { - cinfo->dc_huff_tbl_ptrs[i] = NULL; - cinfo->ac_huff_tbl_ptrs[i] = NULL; - } - - cinfo->script_space = NULL; - - cinfo->input_gamma = 1.0; /* in case application forgets */ - - /* OK, I'm ready */ - cinfo->global_state = CSTATE_START; -} - - -/* - * Destruction of a JPEG compression object - */ - -GLOBAL(void) -jpeg_destroy_compress (j_compress_ptr cinfo) -{ - jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ -} - - -/* - * Abort processing of a JPEG compression operation, - * but don't destroy the object itself. - */ - -GLOBAL(void) -jpeg_abort_compress (j_compress_ptr cinfo) -{ - jpeg_abort((j_common_ptr) cinfo); /* use common routine */ -} - - -/* - * Forcibly suppress or un-suppress all quantization and Huffman tables. - * Marks all currently defined tables as already written (if suppress) - * or not written (if !suppress). This will control whether they get emitted - * by a subsequent jpeg_start_compress call. - * - * This routine is exported for use by applications that want to produce - * abbreviated JPEG datastreams. It logically belongs in jcparam.c, but - * since it is called by jpeg_start_compress, we put it here --- otherwise - * jcparam.o would be linked whether the application used it or not. - */ - -GLOBAL(void) -jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress) -{ - int i; - JQUANT_TBL * qtbl; - JHUFF_TBL * htbl; - - for (i = 0; i < NUM_QUANT_TBLS; i++) { - if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL) - qtbl->sent_table = suppress; - } - - for (i = 0; i < NUM_HUFF_TBLS; i++) { - if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL) - htbl->sent_table = suppress; - if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL) - htbl->sent_table = suppress; - } -} - - -/* - * Finish JPEG compression. - * - * If a multipass operating mode was selected, this may do a great deal of - * work including most of the actual output. - */ - -GLOBAL(void) -jpeg_finish_compress (j_compress_ptr cinfo) -{ - JDIMENSION iMCU_row; - - if (cinfo->global_state == CSTATE_SCANNING || - cinfo->global_state == CSTATE_RAW_OK) { - /* Terminate first pass */ - if (cinfo->next_scanline < cinfo->image_height) - ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); - (*cinfo->master->finish_pass) (cinfo); - } else if (cinfo->global_state != CSTATE_WRCOEFS) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - /* Perform any remaining passes */ - while (! cinfo->master->is_last_pass) { - (*cinfo->master->prepare_for_pass) (cinfo); - for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) { - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) iMCU_row; - cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - /* We bypass the main controller and invoke coef controller directly; - * all work is being done from the coefficient buffer. - */ - if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL)) - ERREXIT(cinfo, JERR_CANT_SUSPEND); - } - (*cinfo->master->finish_pass) (cinfo); - } - /* Write EOI, do final cleanup */ - (*cinfo->marker->write_file_trailer) (cinfo); - (*cinfo->dest->term_destination) (cinfo); - /* We can use jpeg_abort to release memory and reset global_state */ - jpeg_abort((j_common_ptr) cinfo); -} - - -/* - * Write a special marker. - * This is only recommended for writing COM or APPn markers. - * Must be called after jpeg_start_compress() and before - * first call to jpeg_write_scanlines() or jpeg_write_raw_data(). - */ - -GLOBAL(void) -jpeg_write_marker (j_compress_ptr cinfo, int marker, - const JOCTET *dataptr, unsigned int datalen) -{ - JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val)); - - if (cinfo->next_scanline != 0 || - (cinfo->global_state != CSTATE_SCANNING && - cinfo->global_state != CSTATE_RAW_OK && - cinfo->global_state != CSTATE_WRCOEFS)) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); - write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */ - while (datalen--) { - (*write_marker_byte) (cinfo, *dataptr); - dataptr++; - } -} - -/* Same, but piecemeal. */ - -GLOBAL(void) -jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen) -{ - if (cinfo->next_scanline != 0 || - (cinfo->global_state != CSTATE_SCANNING && - cinfo->global_state != CSTATE_RAW_OK && - cinfo->global_state != CSTATE_WRCOEFS)) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); -} - -GLOBAL(void) -jpeg_write_m_byte (j_compress_ptr cinfo, int val) -{ - (*cinfo->marker->write_marker_byte) (cinfo, val); -} - - -/* - * Alternate compression function: just write an abbreviated table file. - * Before calling this, all parameters and a data destination must be set up. - * - * To produce a pair of files containing abbreviated tables and abbreviated - * image data, one would proceed as follows: - * - * initialize JPEG object - * set JPEG parameters - * set destination to table file - * jpeg_write_tables(cinfo); - * set destination to image file - * jpeg_start_compress(cinfo, FALSE); - * write data... - * jpeg_finish_compress(cinfo); - * - * jpeg_write_tables has the side effect of marking all tables written - * (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress - * will not re-emit the tables unless it is passed write_all_tables=TRUE. - */ - -GLOBAL(void) -jpeg_write_tables (j_compress_ptr cinfo) -{ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - /* (Re)initialize error mgr and destination modules */ - (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); - (*cinfo->dest->init_destination) (cinfo); - /* Initialize the marker writer ... bit of a crock to do it here. */ - jinit_marker_writer(cinfo); - /* Write them tables! */ - (*cinfo->marker->write_tables_only) (cinfo); - /* And clean up. */ - (*cinfo->dest->term_destination) (cinfo); - /* - * In library releases up through v6a, we called jpeg_abort() here to free - * any working memory allocated by the destination manager and marker - * writer. Some applications had a problem with that: they allocated space - * of their own from the library memory manager, and didn't want it to go - * away during write_tables. So now we do nothing. This will cause a - * memory leak if an app calls write_tables repeatedly without doing a full - * compression cycle or otherwise resetting the JPEG object. However, that - * seems less bad than unexpectedly freeing memory in the normal case. - * An app that prefers the old behavior can call jpeg_abort for itself after - * each call to jpeg_write_tables(). - */ -} diff --git a/src/SFML/Graphics/libjpeg/jcapistd.c b/src/SFML/Graphics/libjpeg/jcapistd.c deleted file mode 100644 index fed66caf..00000000 --- a/src/SFML/Graphics/libjpeg/jcapistd.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * jcapistd.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface code for the compression half - * of the JPEG library. These are the "standard" API routines that are - * used in the normal full-compression case. They are not used by a - * transcoding-only application. Note that if an application links in - * jpeg_start_compress, it will end up linking in the entire compressor. - * We thus must separate this file from jcapimin.c to avoid linking the - * whole compression library into a transcoder. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Compression initialization. - * Before calling this, all parameters and a data destination must be set up. - * - * We require a write_all_tables parameter as a failsafe check when writing - * multiple datastreams from the same compression object. Since prior runs - * will have left all the tables marked sent_table=TRUE, a subsequent run - * would emit an abbreviated stream (no tables) by default. This may be what - * is wanted, but for safety's sake it should not be the default behavior: - * programmers should have to make a deliberate choice to emit abbreviated - * images. Therefore the documentation and examples should encourage people - * to pass write_all_tables=TRUE; then it will take active thought to do the - * wrong thing. - */ - -GLOBAL(void) -jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables) -{ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - if (write_all_tables) - jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */ - - /* (Re)initialize error mgr and destination modules */ - (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); - (*cinfo->dest->init_destination) (cinfo); - /* Perform master selection of active modules */ - jinit_compress_master(cinfo); - /* Set up for the first pass */ - (*cinfo->master->prepare_for_pass) (cinfo); - /* Ready for application to drive first pass through jpeg_write_scanlines - * or jpeg_write_raw_data. - */ - cinfo->next_scanline = 0; - cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING); -} - - -/* - * Write some scanlines of data to the JPEG compressor. - * - * The return value will be the number of lines actually written. - * This should be less than the supplied num_lines only in case that - * the data destination module has requested suspension of the compressor, - * or if more than image_height scanlines are passed in. - * - * Note: we warn about excess calls to jpeg_write_scanlines() since - * this likely signals an application programmer error. However, - * excess scanlines passed in the last valid call are *silently* ignored, - * so that the application need not adjust num_lines for end-of-image - * when using a multiple-scanline buffer. - */ - -GLOBAL(JDIMENSION) -jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines, - JDIMENSION num_lines) -{ - JDIMENSION row_ctr, rows_left; - - if (cinfo->global_state != CSTATE_SCANNING) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - if (cinfo->next_scanline >= cinfo->image_height) - WARNMS(cinfo, JWRN_TOO_MUCH_DATA); - - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->next_scanline; - cinfo->progress->pass_limit = (long) cinfo->image_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - - /* Give master control module another chance if this is first call to - * jpeg_write_scanlines. This lets output of the frame/scan headers be - * delayed so that application can write COM, etc, markers between - * jpeg_start_compress and jpeg_write_scanlines. - */ - if (cinfo->master->call_pass_startup) - (*cinfo->master->pass_startup) (cinfo); - - /* Ignore any extra scanlines at bottom of image. */ - rows_left = cinfo->image_height - cinfo->next_scanline; - if (num_lines > rows_left) - num_lines = rows_left; - - row_ctr = 0; - (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines); - cinfo->next_scanline += row_ctr; - return row_ctr; -} - - -/* - * Alternate entry point to write raw data. - * Processes exactly one iMCU row per call, unless suspended. - */ - -GLOBAL(JDIMENSION) -jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data, - JDIMENSION num_lines) -{ - JDIMENSION lines_per_iMCU_row; - - if (cinfo->global_state != CSTATE_RAW_OK) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - if (cinfo->next_scanline >= cinfo->image_height) { - WARNMS(cinfo, JWRN_TOO_MUCH_DATA); - return 0; - } - - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->next_scanline; - cinfo->progress->pass_limit = (long) cinfo->image_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - - /* Give master control module another chance if this is first call to - * jpeg_write_raw_data. This lets output of the frame/scan headers be - * delayed so that application can write COM, etc, markers between - * jpeg_start_compress and jpeg_write_raw_data. - */ - if (cinfo->master->call_pass_startup) - (*cinfo->master->pass_startup) (cinfo); - - /* Verify that at least one iMCU row has been passed. */ - lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE; - if (num_lines < lines_per_iMCU_row) - ERREXIT(cinfo, JERR_BUFFER_SIZE); - - /* Directly compress the row. */ - if (! (*cinfo->coef->compress_data) (cinfo, data)) { - /* If compressor did not consume the whole row, suspend processing. */ - return 0; - } - - /* OK, we processed one iMCU row. */ - cinfo->next_scanline += lines_per_iMCU_row; - return lines_per_iMCU_row; -} diff --git a/src/SFML/Graphics/libjpeg/jccoefct.c b/src/SFML/Graphics/libjpeg/jccoefct.c deleted file mode 100644 index c713b858..00000000 --- a/src/SFML/Graphics/libjpeg/jccoefct.c +++ /dev/null @@ -1,449 +0,0 @@ -/* - * jccoefct.c - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the coefficient buffer controller for compression. - * This controller is the top level of the JPEG compressor proper. - * The coefficient buffer lies between forward-DCT and entropy encoding steps. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* We use a full-image coefficient buffer when doing Huffman optimization, - * and also for writing multiple-scan JPEG files. In all cases, the DCT - * step is run during the first pass, and subsequent passes need only read - * the buffered coefficients. - */ -#ifdef ENTROPY_OPT_SUPPORTED -#define FULL_COEF_BUFFER_SUPPORTED -#else -#ifdef C_MULTISCAN_FILES_SUPPORTED -#define FULL_COEF_BUFFER_SUPPORTED -#endif -#endif - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_c_coef_controller pub; /* public fields */ - - JDIMENSION iMCU_row_num; /* iMCU row # within image */ - JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ - int MCU_vert_offset; /* counts MCU rows within iMCU row */ - int MCU_rows_per_iMCU_row; /* number of such rows needed */ - - /* For single-pass compression, it's sufficient to buffer just one MCU - * (although this may prove a bit slow in practice). We allocate a - * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each - * MCU constructed and sent. (On 80x86, the workspace is FAR even though - * it's not really very big; this is to keep the module interfaces unchanged - * when a large coefficient buffer is necessary.) - * In multi-pass modes, this array points to the current MCU's blocks - * within the virtual arrays. - */ - JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; - - /* In multi-pass modes, we need a virtual block array for each component. */ - jvirt_barray_ptr whole_image[MAX_COMPONENTS]; -} my_coef_controller; - -typedef my_coef_controller * my_coef_ptr; - - -/* Forward declarations */ -METHODDEF(boolean) compress_data - JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); -#ifdef FULL_COEF_BUFFER_SUPPORTED -METHODDEF(boolean) compress_first_pass - JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); -METHODDEF(boolean) compress_output - JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); -#endif - - -LOCAL(void) -start_iMCU_row (j_compress_ptr cinfo) -/* Reset within-iMCU-row counters for a new row */ -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - - /* In an interleaved scan, an MCU row is the same as an iMCU row. - * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. - * But at the bottom of the image, process only what's left. - */ - if (cinfo->comps_in_scan > 1) { - coef->MCU_rows_per_iMCU_row = 1; - } else { - if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; - else - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; - } - - coef->mcu_ctr = 0; - coef->MCU_vert_offset = 0; -} - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - - coef->iMCU_row_num = 0; - start_iMCU_row(cinfo); - - switch (pass_mode) { - case JBUF_PASS_THRU: - if (coef->whole_image[0] != NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - coef->pub.compress_data = compress_data; - break; -#ifdef FULL_COEF_BUFFER_SUPPORTED - case JBUF_SAVE_AND_PASS: - if (coef->whole_image[0] == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - coef->pub.compress_data = compress_first_pass; - break; - case JBUF_CRANK_DEST: - if (coef->whole_image[0] == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - coef->pub.compress_data = compress_output; - break; -#endif - default: - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; - } -} - - -/* - * Process some data in the single-pass case. - * We process the equivalent of one fully interleaved MCU row ("iMCU" row) - * per call, ie, v_samp_factor block rows for each component in the image. - * Returns TRUE if the iMCU row is completed, FALSE if suspended. - * - * NB: input_buf contains a plane for each component in image, - * which we index according to the component's SOF position. - */ - -METHODDEF(boolean) -compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - int blkn, bi, ci, yindex, yoffset, blockcnt; - JDIMENSION ypos, xpos; - jpeg_component_info *compptr; - - /* Loop to write as much as one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col; - MCU_col_num++) { - /* Determine where data comes from in input_buf and do the DCT thing. - * Each call on forward_DCT processes a horizontal row of DCT blocks - * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks - * sequentially. Dummy blocks at the right or bottom edge are filled in - * specially. The data in them does not matter for image reconstruction, - * so we fill them with values that will encode to the smallest amount of - * data, viz: all zeroes in the AC entries, DC entries equal to previous - * block's DC value. (Thanks to Thomas Kinsman for this idea.) - */ - blkn = 0; - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width - : compptr->last_col_width; - xpos = MCU_col_num * compptr->MCU_sample_width; - ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */ - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - if (coef->iMCU_row_num < last_iMCU_row || - yoffset+yindex < compptr->last_row_height) { - (*cinfo->fdct->forward_DCT) (cinfo, compptr, - input_buf[compptr->component_index], - coef->MCU_buffer[blkn], - ypos, xpos, (JDIMENSION) blockcnt); - if (blockcnt < compptr->MCU_width) { - /* Create some dummy blocks at the right edge of the image. */ - jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt], - (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); - for (bi = blockcnt; bi < compptr->MCU_width; bi++) { - coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0]; - } - } - } else { - /* Create a row of dummy blocks at the bottom of the image. */ - jzero_far((void FAR *) coef->MCU_buffer[blkn], - compptr->MCU_width * SIZEOF(JBLOCK)); - for (bi = 0; bi < compptr->MCU_width; bi++) { - coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0]; - } - } - blkn += compptr->MCU_width; - ypos += DCTSIZE; - } - } - /* Try to write the MCU. In event of a suspension failure, we will - * re-DCT the MCU on restart (a bit inefficient, could be fixed...) - */ - if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->mcu_ctr = MCU_col_num; - return FALSE; - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->mcu_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - coef->iMCU_row_num++; - start_iMCU_row(cinfo); - return TRUE; -} - - -#ifdef FULL_COEF_BUFFER_SUPPORTED - -/* - * Process some data in the first pass of a multi-pass case. - * We process the equivalent of one fully interleaved MCU row ("iMCU" row) - * per call, ie, v_samp_factor block rows for each component in the image. - * This amount of data is read from the source buffer, DCT'd and quantized, - * and saved into the virtual arrays. We also generate suitable dummy blocks - * as needed at the right and lower edges. (The dummy blocks are constructed - * in the virtual arrays, which have been padded appropriately.) This makes - * it possible for subsequent passes not to worry about real vs. dummy blocks. - * - * We must also emit the data to the entropy encoder. This is conveniently - * done by calling compress_output() after we've loaded the current strip - * of the virtual arrays. - * - * NB: input_buf contains a plane for each component in image. All - * components are DCT'd and loaded into the virtual arrays in this pass. - * However, it may be that only a subset of the components are emitted to - * the entropy encoder during this first pass; be careful about looking - * at the scan-dependent variables (MCU dimensions, etc). - */ - -METHODDEF(boolean) -compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - JDIMENSION blocks_across, MCUs_across, MCUindex; - int bi, ci, h_samp_factor, block_row, block_rows, ndummy; - JCOEF lastDC; - jpeg_component_info *compptr; - JBLOCKARRAY buffer; - JBLOCKROW thisblockrow, lastblockrow; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Align the virtual buffer for this component. */ - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[ci], - coef->iMCU_row_num * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, TRUE); - /* Count non-dummy DCT block rows in this iMCU row. */ - if (coef->iMCU_row_num < last_iMCU_row) - block_rows = compptr->v_samp_factor; - else { - /* NB: can't use last_row_height here, since may not be set! */ - block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (block_rows == 0) block_rows = compptr->v_samp_factor; - } - blocks_across = compptr->width_in_blocks; - h_samp_factor = compptr->h_samp_factor; - /* Count number of dummy blocks to be added at the right margin. */ - ndummy = (int) (blocks_across % h_samp_factor); - if (ndummy > 0) - ndummy = h_samp_factor - ndummy; - /* Perform DCT for all non-dummy blocks in this iMCU row. Each call - * on forward_DCT processes a complete horizontal row of DCT blocks. - */ - for (block_row = 0; block_row < block_rows; block_row++) { - thisblockrow = buffer[block_row]; - (*cinfo->fdct->forward_DCT) (cinfo, compptr, - input_buf[ci], thisblockrow, - (JDIMENSION) (block_row * DCTSIZE), - (JDIMENSION) 0, blocks_across); - if (ndummy > 0) { - /* Create dummy blocks at the right edge of the image. */ - thisblockrow += blocks_across; /* => first dummy block */ - jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); - lastDC = thisblockrow[-1][0]; - for (bi = 0; bi < ndummy; bi++) { - thisblockrow[bi][0] = lastDC; - } - } - } - /* If at end of image, create dummy block rows as needed. - * The tricky part here is that within each MCU, we want the DC values - * of the dummy blocks to match the last real block's DC value. - * This squeezes a few more bytes out of the resulting file... - */ - if (coef->iMCU_row_num == last_iMCU_row) { - blocks_across += ndummy; /* include lower right corner */ - MCUs_across = blocks_across / h_samp_factor; - for (block_row = block_rows; block_row < compptr->v_samp_factor; - block_row++) { - thisblockrow = buffer[block_row]; - lastblockrow = buffer[block_row-1]; - jzero_far((void FAR *) thisblockrow, - (size_t) (blocks_across * SIZEOF(JBLOCK))); - for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { - lastDC = lastblockrow[h_samp_factor-1][0]; - for (bi = 0; bi < h_samp_factor; bi++) { - thisblockrow[bi][0] = lastDC; - } - thisblockrow += h_samp_factor; /* advance to next MCU in row */ - lastblockrow += h_samp_factor; - } - } - } - } - /* NB: compress_output will increment iMCU_row_num if successful. - * A suspension return will result in redoing all the work above next time. - */ - - /* Emit data to the entropy encoder, sharing code with subsequent passes */ - return compress_output(cinfo, input_buf); -} - - -/* - * Process some data in subsequent passes of a multi-pass case. - * We process the equivalent of one fully interleaved MCU row ("iMCU" row) - * per call, ie, v_samp_factor block rows for each component in the scan. - * The data is obtained from the virtual arrays and fed to the entropy coder. - * Returns TRUE if the iMCU row is completed, FALSE if suspended. - * - * NB: input_buf is ignored; it is likely to be a NULL pointer. - */ - -METHODDEF(boolean) -compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - int blkn, ci, xindex, yindex, yoffset; - JDIMENSION start_col; - JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; - JBLOCKROW buffer_ptr; - jpeg_component_info *compptr; - - /* Align the virtual buffers for the components used in this scan. - * NB: during first pass, this is safe only because the buffers will - * already be aligned properly, so jmemmgr.c won't need to do any I/O. - */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - buffer[ci] = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], - coef->iMCU_row_num * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - - /* Loop to process one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; - MCU_col_num++) { - /* Construct list of pointers to DCT blocks belonging to this MCU */ - blkn = 0; /* index of current DCT block within MCU */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - start_col = MCU_col_num * compptr->MCU_width; - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - buffer_ptr = buffer[ci][yindex+yoffset] + start_col; - for (xindex = 0; xindex < compptr->MCU_width; xindex++) { - coef->MCU_buffer[blkn++] = buffer_ptr++; - } - } - } - /* Try to write the MCU. */ - if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->mcu_ctr = MCU_col_num; - return FALSE; - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->mcu_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - coef->iMCU_row_num++; - start_iMCU_row(cinfo); - return TRUE; -} - -#endif /* FULL_COEF_BUFFER_SUPPORTED */ - - -/* - * Initialize coefficient buffer controller. - */ - -GLOBAL(void) -jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer) -{ - my_coef_ptr coef; - - coef = (my_coef_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_coef_controller)); - cinfo->coef = (struct jpeg_c_coef_controller *) coef; - coef->pub.start_pass = start_pass_coef; - - /* Create the coefficient buffer. */ - if (need_full_buffer) { -#ifdef FULL_COEF_BUFFER_SUPPORTED - /* Allocate a full-image virtual array for each component, */ - /* padded to a multiple of samp_factor DCT blocks in each direction. */ - int ci; - jpeg_component_info *compptr; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - (JDIMENSION) jround_up((long) compptr->width_in_blocks, - (long) compptr->h_samp_factor), - (JDIMENSION) jround_up((long) compptr->height_in_blocks, - (long) compptr->v_samp_factor), - (JDIMENSION) compptr->v_samp_factor); - } -#else - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); -#endif - } else { - /* We only need a single-MCU buffer. */ - JBLOCKROW buffer; - int i; - - buffer = (JBLOCKROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { - coef->MCU_buffer[i] = buffer + i; - } - coef->whole_image[0] = NULL; /* flag for no virtual arrays */ - } -} diff --git a/src/SFML/Graphics/libjpeg/jccolor.c b/src/SFML/Graphics/libjpeg/jccolor.c deleted file mode 100644 index 26637245..00000000 --- a/src/SFML/Graphics/libjpeg/jccolor.c +++ /dev/null @@ -1,459 +0,0 @@ -/* - * jccolor.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains input colorspace conversion routines. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private subobject */ - -typedef struct { - struct jpeg_color_converter pub; /* public fields */ - - /* Private state for RGB->YCC conversion */ - INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */ -} my_color_converter; - -typedef my_color_converter * my_cconvert_ptr; - - -/**************** RGB -> YCbCr conversion: most common case **************/ - -/* - * YCbCr is defined per CCIR 601-1, except that Cb and Cr are - * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. - * The conversion equations to be implemented are therefore - * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B - * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE - * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE - * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) - * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2, - * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and - * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0) - * were not represented exactly. Now we sacrifice exact representation of - * maximum red and maximum blue in order to get exact grayscales. - * - * To avoid floating-point arithmetic, we represent the fractional constants - * as integers scaled up by 2^16 (about 4 digits precision); we have to divide - * the products by 2^16, with appropriate rounding, to get the correct answer. - * - * For even more speed, we avoid doing any multiplications in the inner loop - * by precalculating the constants times R,G,B for all possible values. - * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); - * for 12-bit samples it is still acceptable. It's not very reasonable for - * 16-bit samples, but if you want lossless storage you shouldn't be changing - * colorspace anyway. - * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included - * in the tables to save adding them separately in the inner loop. - */ - -#define SCALEBITS 16 /* speediest right-shift on some machines */ -#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS) -#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) -#define FIX(x) ((INT32) ((x) * (1L< Y section */ -#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */ -#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */ -#define R_CB_OFF (3*(MAXJSAMPLE+1)) -#define G_CB_OFF (4*(MAXJSAMPLE+1)) -#define B_CB_OFF (5*(MAXJSAMPLE+1)) -#define R_CR_OFF B_CB_OFF /* B=>Cb, R=>Cr are the same */ -#define G_CR_OFF (6*(MAXJSAMPLE+1)) -#define B_CR_OFF (7*(MAXJSAMPLE+1)) -#define TABLE_SIZE (8*(MAXJSAMPLE+1)) - - -/* - * Initialize for RGB->YCC colorspace conversion. - */ - -METHODDEF(void) -rgb_ycc_start (j_compress_ptr cinfo) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - INT32 * rgb_ycc_tab; - INT32 i; - - /* Allocate and fill in the conversion tables. */ - cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (TABLE_SIZE * SIZEOF(INT32))); - - for (i = 0; i <= MAXJSAMPLE; i++) { - rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i; - rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i; - rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF; - rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i; - rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i; - /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr. - * This ensures that the maximum output will round to MAXJSAMPLE - * not MAXJSAMPLE+1, and thus that we don't have to range-limit. - */ - rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; -/* B=>Cb and R=>Cr tables are the same - rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; -*/ - rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i; - rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i; - } -} - - -/* - * Convert some rows of samples to the JPEG colorspace. - * - * Note that we change from the application's interleaved-pixel format - * to our internal noninterleaved, one-plane-per-component format. - * The input buffer is therefore three times as wide as the output buffer. - * - * A starting row offset is provided only for the output buffer. The caller - * can easily adjust the passed input_buf value to accommodate any row - * offset required on that side. - */ - -METHODDEF(void) -rgb_ycc_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - register int r, g, b; - register INT32 * ctab = cconvert->rgb_ycc_tab; - register JSAMPROW inptr; - register JSAMPROW outptr0, outptr1, outptr2; - register JDIMENSION col; - JDIMENSION num_cols = cinfo->image_width; - - while (--num_rows >= 0) { - inptr = *input_buf++; - outptr0 = output_buf[0][output_row]; - outptr1 = output_buf[1][output_row]; - outptr2 = output_buf[2][output_row]; - output_row++; - for (col = 0; col < num_cols; col++) { - r = GETJSAMPLE(inptr[RGB_RED]); - g = GETJSAMPLE(inptr[RGB_GREEN]); - b = GETJSAMPLE(inptr[RGB_BLUE]); - inptr += RGB_PIXELSIZE; - /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations - * must be too; we do not need an explicit range-limiting operation. - * Hence the value being shifted is never negative, and we don't - * need the general RIGHT_SHIFT macro. - */ - /* Y */ - outptr0[col] = (JSAMPLE) - ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) - >> SCALEBITS); - /* Cb */ - outptr1[col] = (JSAMPLE) - ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) - >> SCALEBITS); - /* Cr */ - outptr2[col] = (JSAMPLE) - ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) - >> SCALEBITS); - } - } -} - - -/**************** Cases other than RGB -> YCbCr **************/ - - -/* - * Convert some rows of samples to the JPEG colorspace. - * This version handles RGB->grayscale conversion, which is the same - * as the RGB->Y portion of RGB->YCbCr. - * We assume rgb_ycc_start has been called (we only use the Y tables). - */ - -METHODDEF(void) -rgb_gray_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - register int r, g, b; - register INT32 * ctab = cconvert->rgb_ycc_tab; - register JSAMPROW inptr; - register JSAMPROW outptr; - register JDIMENSION col; - JDIMENSION num_cols = cinfo->image_width; - - while (--num_rows >= 0) { - inptr = *input_buf++; - outptr = output_buf[0][output_row]; - output_row++; - for (col = 0; col < num_cols; col++) { - r = GETJSAMPLE(inptr[RGB_RED]); - g = GETJSAMPLE(inptr[RGB_GREEN]); - b = GETJSAMPLE(inptr[RGB_BLUE]); - inptr += RGB_PIXELSIZE; - /* Y */ - outptr[col] = (JSAMPLE) - ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) - >> SCALEBITS); - } - } -} - - -/* - * Convert some rows of samples to the JPEG colorspace. - * This version handles Adobe-style CMYK->YCCK conversion, - * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same - * conversion as above, while passing K (black) unchanged. - * We assume rgb_ycc_start has been called. - */ - -METHODDEF(void) -cmyk_ycck_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - register int r, g, b; - register INT32 * ctab = cconvert->rgb_ycc_tab; - register JSAMPROW inptr; - register JSAMPROW outptr0, outptr1, outptr2, outptr3; - register JDIMENSION col; - JDIMENSION num_cols = cinfo->image_width; - - while (--num_rows >= 0) { - inptr = *input_buf++; - outptr0 = output_buf[0][output_row]; - outptr1 = output_buf[1][output_row]; - outptr2 = output_buf[2][output_row]; - outptr3 = output_buf[3][output_row]; - output_row++; - for (col = 0; col < num_cols; col++) { - r = MAXJSAMPLE - GETJSAMPLE(inptr[0]); - g = MAXJSAMPLE - GETJSAMPLE(inptr[1]); - b = MAXJSAMPLE - GETJSAMPLE(inptr[2]); - /* K passes through as-is */ - outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */ - inptr += 4; - /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations - * must be too; we do not need an explicit range-limiting operation. - * Hence the value being shifted is never negative, and we don't - * need the general RIGHT_SHIFT macro. - */ - /* Y */ - outptr0[col] = (JSAMPLE) - ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) - >> SCALEBITS); - /* Cb */ - outptr1[col] = (JSAMPLE) - ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) - >> SCALEBITS); - /* Cr */ - outptr2[col] = (JSAMPLE) - ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) - >> SCALEBITS); - } - } -} - - -/* - * Convert some rows of samples to the JPEG colorspace. - * This version handles grayscale output with no conversion. - * The source can be either plain grayscale or YCbCr (since Y == gray). - */ - -METHODDEF(void) -grayscale_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - register JSAMPROW inptr; - register JSAMPROW outptr; - register JDIMENSION col; - JDIMENSION num_cols = cinfo->image_width; - int instride = cinfo->input_components; - - while (--num_rows >= 0) { - inptr = *input_buf++; - outptr = output_buf[0][output_row]; - output_row++; - for (col = 0; col < num_cols; col++) { - outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */ - inptr += instride; - } - } -} - - -/* - * Convert some rows of samples to the JPEG colorspace. - * This version handles multi-component colorspaces without conversion. - * We assume input_components == num_components. - */ - -METHODDEF(void) -null_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - register JSAMPROW inptr; - register JSAMPROW outptr; - register JDIMENSION col; - register int ci; - int nc = cinfo->num_components; - JDIMENSION num_cols = cinfo->image_width; - - while (--num_rows >= 0) { - /* It seems fastest to make a separate pass for each component. */ - for (ci = 0; ci < nc; ci++) { - inptr = *input_buf; - outptr = output_buf[ci][output_row]; - for (col = 0; col < num_cols; col++) { - outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */ - inptr += nc; - } - } - input_buf++; - output_row++; - } -} - - -/* - * Empty method for start_pass. - */ - -METHODDEF(void) -null_method (j_compress_ptr cinfo) -{ - /* no work needed */ -} - - -/* - * Module initialization routine for input colorspace conversion. - */ - -GLOBAL(void) -jinit_color_converter (j_compress_ptr cinfo) -{ - my_cconvert_ptr cconvert; - - cconvert = (my_cconvert_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_color_converter)); - cinfo->cconvert = (struct jpeg_color_converter *) cconvert; - /* set start_pass to null method until we find out differently */ - cconvert->pub.start_pass = null_method; - - /* Make sure input_components agrees with in_color_space */ - switch (cinfo->in_color_space) { - case JCS_GRAYSCALE: - if (cinfo->input_components != 1) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; - - case JCS_RGB: -#if RGB_PIXELSIZE != 3 - if (cinfo->input_components != RGB_PIXELSIZE) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; -#endif /* else share code with YCbCr */ - - case JCS_YCbCr: - if (cinfo->input_components != 3) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; - - case JCS_CMYK: - case JCS_YCCK: - if (cinfo->input_components != 4) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; - - default: /* JCS_UNKNOWN can be anything */ - if (cinfo->input_components < 1) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; - } - - /* Check num_components, set conversion method based on requested space */ - switch (cinfo->jpeg_color_space) { - case JCS_GRAYSCALE: - if (cinfo->num_components != 1) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_GRAYSCALE) - cconvert->pub.color_convert = grayscale_convert; - else if (cinfo->in_color_space == JCS_RGB) { - cconvert->pub.start_pass = rgb_ycc_start; - cconvert->pub.color_convert = rgb_gray_convert; - } else if (cinfo->in_color_space == JCS_YCbCr) - cconvert->pub.color_convert = grayscale_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_RGB: - if (cinfo->num_components != 3) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3) - cconvert->pub.color_convert = null_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_YCbCr: - if (cinfo->num_components != 3) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_RGB) { - cconvert->pub.start_pass = rgb_ycc_start; - cconvert->pub.color_convert = rgb_ycc_convert; - } else if (cinfo->in_color_space == JCS_YCbCr) - cconvert->pub.color_convert = null_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_CMYK: - if (cinfo->num_components != 4) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_CMYK) - cconvert->pub.color_convert = null_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_YCCK: - if (cinfo->num_components != 4) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_CMYK) { - cconvert->pub.start_pass = rgb_ycc_start; - cconvert->pub.color_convert = cmyk_ycck_convert; - } else if (cinfo->in_color_space == JCS_YCCK) - cconvert->pub.color_convert = null_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - default: /* allow null conversion of JCS_UNKNOWN */ - if (cinfo->jpeg_color_space != cinfo->in_color_space || - cinfo->num_components != cinfo->input_components) - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - cconvert->pub.color_convert = null_convert; - break; - } -} diff --git a/src/SFML/Graphics/libjpeg/jcdctmgr.c b/src/SFML/Graphics/libjpeg/jcdctmgr.c deleted file mode 100644 index e3f90dc3..00000000 --- a/src/SFML/Graphics/libjpeg/jcdctmgr.c +++ /dev/null @@ -1,387 +0,0 @@ -/* - * jcdctmgr.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the forward-DCT management logic. - * This code selects a particular DCT implementation to be used, - * and it performs related housekeeping chores including coefficient - * quantization. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - - -/* Private subobject for this module */ - -typedef struct { - struct jpeg_forward_dct pub; /* public fields */ - - /* Pointer to the DCT routine actually in use */ - forward_DCT_method_ptr do_dct; - - /* The actual post-DCT divisors --- not identical to the quant table - * entries, because of scaling (especially for an unnormalized DCT). - * Each table is given in normal array order. - */ - DCTELEM * divisors[NUM_QUANT_TBLS]; - -#ifdef DCT_FLOAT_SUPPORTED - /* Same as above for the floating-point case. */ - float_DCT_method_ptr do_float_dct; - FAST_FLOAT * float_divisors[NUM_QUANT_TBLS]; -#endif -} my_fdct_controller; - -typedef my_fdct_controller * my_fdct_ptr; - - -/* - * Initialize for a processing pass. - * Verify that all referenced Q-tables are present, and set up - * the divisor table for each one. - * In the current implementation, DCT of all components is done during - * the first pass, even if only some components will be output in the - * first scan. Hence all components should be examined here. - */ - -METHODDEF(void) -start_pass_fdctmgr (j_compress_ptr cinfo) -{ - my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; - int ci, qtblno, i; - jpeg_component_info *compptr; - JQUANT_TBL * qtbl; - DCTELEM * dtbl; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - qtblno = compptr->quant_tbl_no; - /* Make sure specified quantization table is present */ - if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || - cinfo->quant_tbl_ptrs[qtblno] == NULL) - ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); - qtbl = cinfo->quant_tbl_ptrs[qtblno]; - /* Compute divisors for this quant table */ - /* We may do this more than once for same table, but it's not a big deal */ - switch (cinfo->dct_method) { -#ifdef DCT_ISLOW_SUPPORTED - case JDCT_ISLOW: - /* For LL&M IDCT method, divisors are equal to raw quantization - * coefficients multiplied by 8 (to counteract scaling). - */ - if (fdct->divisors[qtblno] == NULL) { - fdct->divisors[qtblno] = (DCTELEM *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - DCTSIZE2 * SIZEOF(DCTELEM)); - } - dtbl = fdct->divisors[qtblno]; - for (i = 0; i < DCTSIZE2; i++) { - dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3; - } - break; -#endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - { - /* For AA&N IDCT method, divisors are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * We apply a further scale factor of 8. - */ -#define CONST_BITS 14 - static const INT16 aanscales[DCTSIZE2] = { - /* precomputed values scaled up by 14 bits */ - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, - 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, - 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, - 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, - 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 - }; - SHIFT_TEMPS - - if (fdct->divisors[qtblno] == NULL) { - fdct->divisors[qtblno] = (DCTELEM *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - DCTSIZE2 * SIZEOF(DCTELEM)); - } - dtbl = fdct->divisors[qtblno]; - for (i = 0; i < DCTSIZE2; i++) { - dtbl[i] = (DCTELEM) - DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], - (INT32) aanscales[i]), - CONST_BITS-3); - } - } - break; -#endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - { - /* For float AA&N IDCT method, divisors are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * We apply a further scale factor of 8. - * What's actually stored is 1/divisor so that the inner loop can - * use a multiplication rather than a division. - */ - FAST_FLOAT * fdtbl; - int row, col; - static const double aanscalefactor[DCTSIZE] = { - 1.0, 1.387039845, 1.306562965, 1.175875602, - 1.0, 0.785694958, 0.541196100, 0.275899379 - }; - - if (fdct->float_divisors[qtblno] == NULL) { - fdct->float_divisors[qtblno] = (FAST_FLOAT *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - DCTSIZE2 * SIZEOF(FAST_FLOAT)); - } - fdtbl = fdct->float_divisors[qtblno]; - i = 0; - for (row = 0; row < DCTSIZE; row++) { - for (col = 0; col < DCTSIZE; col++) { - fdtbl[i] = (FAST_FLOAT) - (1.0 / (((double) qtbl->quantval[i] * - aanscalefactor[row] * aanscalefactor[col] * 8.0))); - i++; - } - } - } - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - } -} - - -/* - * Perform forward DCT on one or more blocks of a component. - * - * The input samples are taken from the sample_data[] array starting at - * position start_row/start_col, and moving to the right for any additional - * blocks. The quantized coefficients are returned in coef_blocks[]. - */ - -METHODDEF(void) -forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks) -/* This version is used for integer DCT implementations. */ -{ - /* This routine is heavily used, so it's worth coding it tightly. */ - my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; - forward_DCT_method_ptr do_dct = fdct->do_dct; - DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no]; - DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */ - JDIMENSION bi; - - sample_data += start_row; /* fold in the vertical offset once */ - - for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) { - /* Load data into workspace, applying unsigned->signed conversion */ - { register DCTELEM *workspaceptr; - register JSAMPROW elemptr; - register int elemr; - - workspaceptr = workspace; - for (elemr = 0; elemr < DCTSIZE; elemr++) { - elemptr = sample_data[elemr] + start_col; -#if DCTSIZE == 8 /* unroll the inner loop */ - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; -#else - { register int elemc; - for (elemc = DCTSIZE; elemc > 0; elemc--) { - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - } - } -#endif - } - } - - /* Perform the DCT */ - (*do_dct) (workspace); - - /* Quantize/descale the coefficients, and store into coef_blocks[] */ - { register DCTELEM temp, qval; - register int i; - register JCOEFPTR output_ptr = coef_blocks[bi]; - - for (i = 0; i < DCTSIZE2; i++) { - qval = divisors[i]; - temp = workspace[i]; - /* Divide the coefficient value by qval, ensuring proper rounding. - * Since C does not specify the direction of rounding for negative - * quotients, we have to force the dividend positive for portability. - * - * In most files, at least half of the output values will be zero - * (at default quantization settings, more like three-quarters...) - * so we should ensure that this case is fast. On many machines, - * a comparison is enough cheaper than a divide to make a special test - * a win. Since both inputs will be nonnegative, we need only test - * for a < b to discover whether a/b is 0. - * If your machine's division is fast enough, define FAST_DIVIDE. - */ -#ifdef FAST_DIVIDE -#define DIVIDE_BY(a,b) a /= b -#else -#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0 -#endif - if (temp < 0) { - temp = -temp; - temp += qval>>1; /* for rounding */ - DIVIDE_BY(temp, qval); - temp = -temp; - } else { - temp += qval>>1; /* for rounding */ - DIVIDE_BY(temp, qval); - } - output_ptr[i] = (JCOEF) temp; - } - } - } -} - - -#ifdef DCT_FLOAT_SUPPORTED - -METHODDEF(void) -forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks) -/* This version is used for floating-point DCT implementations. */ -{ - /* This routine is heavily used, so it's worth coding it tightly. */ - my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; - float_DCT_method_ptr do_dct = fdct->do_float_dct; - FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no]; - FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */ - JDIMENSION bi; - - sample_data += start_row; /* fold in the vertical offset once */ - - for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) { - /* Load data into workspace, applying unsigned->signed conversion */ - { register FAST_FLOAT *workspaceptr; - register JSAMPROW elemptr; - register int elemr; - - workspaceptr = workspace; - for (elemr = 0; elemr < DCTSIZE; elemr++) { - elemptr = sample_data[elemr] + start_col; -#if DCTSIZE == 8 /* unroll the inner loop */ - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); -#else - { register int elemc; - for (elemc = DCTSIZE; elemc > 0; elemc--) { - *workspaceptr++ = (FAST_FLOAT) - (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - } - } -#endif - } - } - - /* Perform the DCT */ - (*do_dct) (workspace); - - /* Quantize/descale the coefficients, and store into coef_blocks[] */ - { register FAST_FLOAT temp; - register int i; - register JCOEFPTR output_ptr = coef_blocks[bi]; - - for (i = 0; i < DCTSIZE2; i++) { - /* Apply the quantization and scaling factor */ - temp = workspace[i] * divisors[i]; - /* Round to nearest integer. - * Since C does not specify the direction of rounding for negative - * quotients, we have to force the dividend positive for portability. - * The maximum coefficient size is +-16K (for 12-bit data), so this - * code should work for either 16-bit or 32-bit ints. - */ - output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384); - } - } - } -} - -#endif /* DCT_FLOAT_SUPPORTED */ - - -/* - * Initialize FDCT manager. - */ - -GLOBAL(void) -jinit_forward_dct (j_compress_ptr cinfo) -{ - my_fdct_ptr fdct; - int i; - - fdct = (my_fdct_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_fdct_controller)); - cinfo->fdct = (struct jpeg_forward_dct *) fdct; - fdct->pub.start_pass = start_pass_fdctmgr; - - switch (cinfo->dct_method) { -#ifdef DCT_ISLOW_SUPPORTED - case JDCT_ISLOW: - fdct->pub.forward_DCT = forward_DCT; - fdct->do_dct = jpeg_fdct_islow; - break; -#endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - fdct->pub.forward_DCT = forward_DCT; - fdct->do_dct = jpeg_fdct_ifast; - break; -#endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - fdct->pub.forward_DCT = forward_DCT_float; - fdct->do_float_dct = jpeg_fdct_float; - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - - /* Mark divisor tables unallocated */ - for (i = 0; i < NUM_QUANT_TBLS; i++) { - fdct->divisors[i] = NULL; -#ifdef DCT_FLOAT_SUPPORTED - fdct->float_divisors[i] = NULL; -#endif - } -} diff --git a/src/SFML/Graphics/libjpeg/jchuff.c b/src/SFML/Graphics/libjpeg/jchuff.c deleted file mode 100644 index 16d9366a..00000000 --- a/src/SFML/Graphics/libjpeg/jchuff.c +++ /dev/null @@ -1,909 +0,0 @@ -/* - * jchuff.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy encoding routines. - * - * Much of the complexity here has to do with supporting output suspension. - * If the data destination module demands suspension, we want to be able to - * back up to the start of the current MCU. To do this, we copy state - * variables into local working storage, and update them back to the - * permanent JPEG objects only upon successful completion of an MCU. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jchuff.h" /* Declarations shared with jcphuff.c */ - - -/* Expanded entropy encoder object for Huffman encoding. - * - * The savable_state subrecord contains fields that change within an MCU, - * but must not be updated permanently until we complete the MCU. - */ - -typedef struct { - INT32 put_buffer; /* current bit-accumulation buffer */ - int put_bits; /* # of bits now in it */ - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ -} savable_state; - -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest,src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest,src) \ - ((dest).put_buffer = (src).put_buffer, \ - (dest).put_bits = (src).put_bits, \ - (dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - -typedef struct { - struct jpeg_entropy_encoder pub; /* public fields */ - - savable_state saved; /* Bit buffer & DC state at start of MCU */ - - /* These fields are NOT loaded into local working state. */ - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - int next_restart_num; /* next restart number to write (0-7) */ - - /* Pointers to derived tables (these workspaces have image lifespan) */ - c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; - c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; - -#ifdef ENTROPY_OPT_SUPPORTED /* Statistics tables for optimization */ - long * dc_count_ptrs[NUM_HUFF_TBLS]; - long * ac_count_ptrs[NUM_HUFF_TBLS]; -#endif -} huff_entropy_encoder; - -typedef huff_entropy_encoder * huff_entropy_ptr; - -/* Working state while writing an MCU. - * This struct contains all the fields that are needed by subroutines. - */ - -typedef struct { - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - savable_state cur; /* Current bit buffer & DC state */ - j_compress_ptr cinfo; /* dump_buffer needs access to this */ -} working_state; - - -/* Forward declarations */ -METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo)); -#ifdef ENTROPY_OPT_SUPPORTED -METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo)); -#endif - - -/* - * Initialize for a Huffman-compressed scan. - * If gather_statistics is TRUE, we do not output anything during the scan, - * just count the Huffman symbols used and generate Huffman code tables. - */ - -METHODDEF(void) -start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int ci, dctbl, actbl; - jpeg_component_info * compptr; - - if (gather_statistics) { -#ifdef ENTROPY_OPT_SUPPORTED - entropy->pub.encode_mcu = encode_mcu_gather; - entropy->pub.finish_pass = finish_pass_gather; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - entropy->pub.encode_mcu = encode_mcu_huff; - entropy->pub.finish_pass = finish_pass_huff; - } - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - dctbl = compptr->dc_tbl_no; - actbl = compptr->ac_tbl_no; - if (gather_statistics) { -#ifdef ENTROPY_OPT_SUPPORTED - /* Check for invalid table indexes */ - /* (make_c_derived_tbl does this in the other path) */ - if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl); - if (actbl < 0 || actbl >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl); - /* Allocate and zero the statistics tables */ - /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ - if (entropy->dc_count_ptrs[dctbl] == NULL) - entropy->dc_count_ptrs[dctbl] = (long *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 257 * SIZEOF(long)); - MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long)); - if (entropy->ac_count_ptrs[actbl] == NULL) - entropy->ac_count_ptrs[actbl] = (long *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 257 * SIZEOF(long)); - MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long)); -#endif - } else { - /* Compute derived values for Huffman tables */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl, - & entropy->dc_derived_tbls[dctbl]); - jpeg_make_c_derived_tbl(cinfo, FALSE, actbl, - & entropy->ac_derived_tbls[actbl]); - } - /* Initialize DC predictions to 0 */ - entropy->saved.last_dc_val[ci] = 0; - } - - /* Initialize bit buffer to empty */ - entropy->saved.put_buffer = 0; - entropy->saved.put_bits = 0; - - /* Initialize restart stuff */ - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num = 0; -} - - -/* - * Compute the derived values for a Huffman table. - * This routine also performs some validation checks on the table. - * - * Note this is also used by jcphuff.c. - */ - -GLOBAL(void) -jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno, - c_derived_tbl ** pdtbl) -{ - JHUFF_TBL *htbl; - c_derived_tbl *dtbl; - int p, i, l, lastp, si, maxsymbol; - char huffsize[257]; - unsigned int huffcode[257]; - unsigned int code; - - /* Note that huffsize[] and huffcode[] are filled in code-length order, - * paralleling the order of the symbols themselves in htbl->huffval[]. - */ - - /* Find the input Huffman table */ - if (tblno < 0 || tblno >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); - htbl = - isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; - if (htbl == NULL) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); - - /* Allocate a workspace if we haven't already done so. */ - if (*pdtbl == NULL) - *pdtbl = (c_derived_tbl *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(c_derived_tbl)); - dtbl = *pdtbl; - - /* Figure C.1: make table of Huffman code length for each symbol */ - - p = 0; - for (l = 1; l <= 16; l++) { - i = (int) htbl->bits[l]; - if (i < 0 || p + i > 256) /* protect against table overrun */ - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - while (i--) - huffsize[p++] = (char) l; - } - huffsize[p] = 0; - lastp = p; - - /* Figure C.2: generate the codes themselves */ - /* We also validate that the counts represent a legal Huffman code tree. */ - - code = 0; - si = huffsize[0]; - p = 0; - while (huffsize[p]) { - while (((int) huffsize[p]) == si) { - huffcode[p++] = code; - code++; - } - /* code is now 1 more than the last code used for codelength si; but - * it must still fit in si bits, since no code is allowed to be all ones. - */ - if (((INT32) code) >= (((INT32) 1) << si)) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - code <<= 1; - si++; - } - - /* Figure C.3: generate encoding tables */ - /* These are code and size indexed by symbol value */ - - /* Set all codeless symbols to have code length 0; - * this lets us detect duplicate VAL entries here, and later - * allows emit_bits to detect any attempt to emit such symbols. - */ - MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi)); - - /* This is also a convenient place to check for out-of-range - * and duplicated VAL entries. We allow 0..255 for AC symbols - * but only 0..15 for DC. (We could constrain them further - * based on data depth and mode, but this seems enough.) - */ - maxsymbol = isDC ? 15 : 255; - - for (p = 0; p < lastp; p++) { - i = htbl->huffval[p]; - if (i < 0 || i > maxsymbol || dtbl->ehufsi[i]) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - dtbl->ehufco[i] = huffcode[p]; - dtbl->ehufsi[i] = huffsize[p]; - } -} - - -/* Outputting bytes to the file */ - -/* Emit a byte, taking 'action' if must suspend. */ -#define emit_byte(state,val,action) \ - { *(state)->next_output_byte++ = (JOCTET) (val); \ - if (--(state)->free_in_buffer == 0) \ - if (! dump_buffer(state)) \ - { action; } } - - -LOCAL(boolean) -dump_buffer (working_state * state) -/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */ -{ - struct jpeg_destination_mgr * dest = state->cinfo->dest; - - if (! (*dest->empty_output_buffer) (state->cinfo)) - return FALSE; - /* After a successful buffer dump, must reset buffer pointers */ - state->next_output_byte = dest->next_output_byte; - state->free_in_buffer = dest->free_in_buffer; - return TRUE; -} - - -/* Outputting bits to the file */ - -/* Only the right 24 bits of put_buffer are used; the valid bits are - * left-justified in this part. At most 16 bits can be passed to emit_bits - * in one call, and we never retain more than 7 bits in put_buffer - * between calls, so 24 bits are sufficient. - */ - -INLINE -LOCAL(boolean) -emit_bits (working_state * state, unsigned int code, int size) -/* Emit some bits; return TRUE if successful, FALSE if must suspend */ -{ - /* This routine is heavily used, so it's worth coding tightly. */ - register INT32 put_buffer = (INT32) code; - register int put_bits = state->cur.put_bits; - - /* if size is 0, caller used an invalid Huffman table entry */ - if (size == 0) - ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE); - - put_buffer &= (((INT32) 1)<cur.put_buffer; /* and merge with old buffer contents */ - - while (put_bits >= 8) { - int c = (int) ((put_buffer >> 16) & 0xFF); - - emit_byte(state, c, return FALSE); - if (c == 0xFF) { /* need to stuff a zero byte? */ - emit_byte(state, 0, return FALSE); - } - put_buffer <<= 8; - put_bits -= 8; - } - - state->cur.put_buffer = put_buffer; /* update state variables */ - state->cur.put_bits = put_bits; - - return TRUE; -} - - -LOCAL(boolean) -flush_bits (working_state * state) -{ - if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */ - return FALSE; - state->cur.put_buffer = 0; /* and reset bit-buffer to empty */ - state->cur.put_bits = 0; - return TRUE; -} - - -/* Encode a single block's worth of coefficients */ - -LOCAL(boolean) -encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, - c_derived_tbl *dctbl, c_derived_tbl *actbl) -{ - register int temp, temp2; - register int nbits; - register int k, r, i; - - /* Encode the DC coefficient difference per section F.1.2.1 */ - - temp = temp2 = block[0] - last_dc_val; - - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - /* For a negative input, want temp2 = bitwise complement of abs(input) */ - /* This code assumes we are on a two's complement machine */ - temp2--; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 0; - while (temp) { - nbits++; - temp >>= 1; - } - /* Check for out-of-range coefficient values. - * Since we're encoding a difference, the range limit is twice as much. - */ - if (nbits > MAX_COEF_BITS+1) - ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); - - /* Emit the Huffman-coded symbol for the number of bits */ - if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits])) - return FALSE; - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - if (nbits) /* emit_bits rejects calls with size 0 */ - if (! emit_bits(state, (unsigned int) temp2, nbits)) - return FALSE; - - /* Encode the AC coefficients per section F.1.2.2 */ - - r = 0; /* r = run length of zeros */ - - for (k = 1; k < DCTSIZE2; k++) { - if ((temp = block[jpeg_natural_order[k]]) == 0) { - r++; - } else { - /* if run length > 15, must emit special run-length-16 codes (0xF0) */ - while (r > 15) { - if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0])) - return FALSE; - r -= 16; - } - - temp2 = temp; - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - /* This code assumes we are on a two's complement machine */ - temp2--; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 1; /* there must be at least one 1 bit */ - while ((temp >>= 1)) - nbits++; - /* Check for out-of-range coefficient values */ - if (nbits > MAX_COEF_BITS) - ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); - - /* Emit Huffman symbol for run length / number of bits */ - i = (r << 4) + nbits; - if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i])) - return FALSE; - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - if (! emit_bits(state, (unsigned int) temp2, nbits)) - return FALSE; - - r = 0; - } - } - - /* If the last coef(s) were zero, emit an end-of-block code */ - if (r > 0) - if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0])) - return FALSE; - - return TRUE; -} - - -/* - * Emit a restart marker & resynchronize predictions. - */ - -LOCAL(boolean) -emit_restart (working_state * state, int restart_num) -{ - int ci; - - if (! flush_bits(state)) - return FALSE; - - emit_byte(state, 0xFF, return FALSE); - emit_byte(state, JPEG_RST0 + restart_num, return FALSE); - - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < state->cinfo->comps_in_scan; ci++) - state->cur.last_dc_val[ci] = 0; - - /* The restart counter is not updated until we successfully write the MCU. */ - - return TRUE; -} - - -/* - * Encode and output one MCU's worth of Huffman-compressed coefficients. - */ - -METHODDEF(boolean) -encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - working_state state; - int blkn, ci; - jpeg_component_info * compptr; - - /* Load up working state */ - state.next_output_byte = cinfo->dest->next_output_byte; - state.free_in_buffer = cinfo->dest->free_in_buffer; - ASSIGN_STATE(state.cur, entropy->saved); - state.cinfo = cinfo; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! emit_restart(&state, entropy->next_restart_num)) - return FALSE; - } - - /* Encode the MCU data blocks */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - if (! encode_one_block(&state, - MCU_data[blkn][0], state.cur.last_dc_val[ci], - entropy->dc_derived_tbls[compptr->dc_tbl_no], - entropy->ac_derived_tbls[compptr->ac_tbl_no])) - return FALSE; - /* Update last_dc_val */ - state.cur.last_dc_val[ci] = MCU_data[blkn][0][0]; - } - - /* Completed MCU, so update state */ - cinfo->dest->next_output_byte = state.next_output_byte; - cinfo->dest->free_in_buffer = state.free_in_buffer; - ASSIGN_STATE(entropy->saved, state.cur); - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * Finish up at the end of a Huffman-compressed scan. - */ - -METHODDEF(void) -finish_pass_huff (j_compress_ptr cinfo) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - working_state state; - - /* Load up working state ... flush_bits needs it */ - state.next_output_byte = cinfo->dest->next_output_byte; - state.free_in_buffer = cinfo->dest->free_in_buffer; - ASSIGN_STATE(state.cur, entropy->saved); - state.cinfo = cinfo; - - /* Flush out the last data */ - if (! flush_bits(&state)) - ERREXIT(cinfo, JERR_CANT_SUSPEND); - - /* Update state */ - cinfo->dest->next_output_byte = state.next_output_byte; - cinfo->dest->free_in_buffer = state.free_in_buffer; - ASSIGN_STATE(entropy->saved, state.cur); -} - - -/* - * Huffman coding optimization. - * - * We first scan the supplied data and count the number of uses of each symbol - * that is to be Huffman-coded. (This process MUST agree with the code above.) - * Then we build a Huffman coding tree for the observed counts. - * Symbols which are not needed at all for the particular image are not - * assigned any code, which saves space in the DHT marker as well as in - * the compressed data. - */ - -#ifdef ENTROPY_OPT_SUPPORTED - - -/* Process a single block's worth of coefficients */ - -LOCAL(void) -htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val, - long dc_counts[], long ac_counts[]) -{ - register int temp; - register int nbits; - register int k, r; - - /* Encode the DC coefficient difference per section F.1.2.1 */ - - temp = block[0] - last_dc_val; - if (temp < 0) - temp = -temp; - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 0; - while (temp) { - nbits++; - temp >>= 1; - } - /* Check for out-of-range coefficient values. - * Since we're encoding a difference, the range limit is twice as much. - */ - if (nbits > MAX_COEF_BITS+1) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count the Huffman symbol for the number of bits */ - dc_counts[nbits]++; - - /* Encode the AC coefficients per section F.1.2.2 */ - - r = 0; /* r = run length of zeros */ - - for (k = 1; k < DCTSIZE2; k++) { - if ((temp = block[jpeg_natural_order[k]]) == 0) { - r++; - } else { - /* if run length > 15, must emit special run-length-16 codes (0xF0) */ - while (r > 15) { - ac_counts[0xF0]++; - r -= 16; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - if (temp < 0) - temp = -temp; - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 1; /* there must be at least one 1 bit */ - while ((temp >>= 1)) - nbits++; - /* Check for out-of-range coefficient values */ - if (nbits > MAX_COEF_BITS) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count Huffman symbol for run length / number of bits */ - ac_counts[(r << 4) + nbits]++; - - r = 0; - } - } - - /* If the last coef(s) were zero, emit an end-of-block code */ - if (r > 0) - ac_counts[0]++; -} - - -/* - * Trial-encode one MCU's worth of Huffman-compressed coefficients. - * No data is actually output, so no suspension return is possible. - */ - -METHODDEF(boolean) -encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int blkn, ci; - jpeg_component_info * compptr; - - /* Take care of restart intervals if needed */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) - entropy->saved.last_dc_val[ci] = 0; - /* Update restart state */ - entropy->restarts_to_go = cinfo->restart_interval; - } - entropy->restarts_to_go--; - } - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci], - entropy->dc_count_ptrs[compptr->dc_tbl_no], - entropy->ac_count_ptrs[compptr->ac_tbl_no]); - entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0]; - } - - return TRUE; -} - - -/* - * Generate the best Huffman code table for the given counts, fill htbl. - * Note this is also used by jcphuff.c. - * - * The JPEG standard requires that no symbol be assigned a codeword of all - * one bits (so that padding bits added at the end of a compressed segment - * can't look like a valid code). Because of the canonical ordering of - * codewords, this just means that there must be an unused slot in the - * longest codeword length category. Section K.2 of the JPEG spec suggests - * reserving such a slot by pretending that symbol 256 is a valid symbol - * with count 1. In theory that's not optimal; giving it count zero but - * including it in the symbol set anyway should give a better Huffman code. - * But the theoretically better code actually seems to come out worse in - * practice, because it produces more all-ones bytes (which incur stuffed - * zero bytes in the final file). In any case the difference is tiny. - * - * The JPEG standard requires Huffman codes to be no more than 16 bits long. - * If some symbols have a very small but nonzero probability, the Huffman tree - * must be adjusted to meet the code length restriction. We currently use - * the adjustment method suggested in JPEG section K.2. This method is *not* - * optimal; it may not choose the best possible limited-length code. But - * typically only very-low-frequency symbols will be given less-than-optimal - * lengths, so the code is almost optimal. Experimental comparisons against - * an optimal limited-length-code algorithm indicate that the difference is - * microscopic --- usually less than a hundredth of a percent of total size. - * So the extra complexity of an optimal algorithm doesn't seem worthwhile. - */ - -GLOBAL(void) -jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]) -{ -#define MAX_CLEN 32 /* assumed maximum initial code length */ - UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */ - int codesize[257]; /* codesize[k] = code length of symbol k */ - int others[257]; /* next symbol in current branch of tree */ - int c1, c2; - int p, i, j; - long v; - - /* This algorithm is explained in section K.2 of the JPEG standard */ - - MEMZERO(bits, SIZEOF(bits)); - MEMZERO(codesize, SIZEOF(codesize)); - for (i = 0; i < 257; i++) - others[i] = -1; /* init links to empty */ - - freq[256] = 1; /* make sure 256 has a nonzero count */ - /* Including the pseudo-symbol 256 in the Huffman procedure guarantees - * that no real symbol is given code-value of all ones, because 256 - * will be placed last in the largest codeword category. - */ - - /* Huffman's basic algorithm to assign optimal code lengths to symbols */ - - for (;;) { - /* Find the smallest nonzero frequency, set c1 = its symbol */ - /* In case of ties, take the larger symbol number */ - c1 = -1; - v = 1000000000L; - for (i = 0; i <= 256; i++) { - if (freq[i] && freq[i] <= v) { - v = freq[i]; - c1 = i; - } - } - - /* Find the next smallest nonzero frequency, set c2 = its symbol */ - /* In case of ties, take the larger symbol number */ - c2 = -1; - v = 1000000000L; - for (i = 0; i <= 256; i++) { - if (freq[i] && freq[i] <= v && i != c1) { - v = freq[i]; - c2 = i; - } - } - - /* Done if we've merged everything into one frequency */ - if (c2 < 0) - break; - - /* Else merge the two counts/trees */ - freq[c1] += freq[c2]; - freq[c2] = 0; - - /* Increment the codesize of everything in c1's tree branch */ - codesize[c1]++; - while (others[c1] >= 0) { - c1 = others[c1]; - codesize[c1]++; - } - - others[c1] = c2; /* chain c2 onto c1's tree branch */ - - /* Increment the codesize of everything in c2's tree branch */ - codesize[c2]++; - while (others[c2] >= 0) { - c2 = others[c2]; - codesize[c2]++; - } - } - - /* Now count the number of symbols of each code length */ - for (i = 0; i <= 256; i++) { - if (codesize[i]) { - /* The JPEG standard seems to think that this can't happen, */ - /* but I'm paranoid... */ - if (codesize[i] > MAX_CLEN) - ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW); - - bits[codesize[i]]++; - } - } - - /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure - * Huffman procedure assigned any such lengths, we must adjust the coding. - * Here is what the JPEG spec says about how this next bit works: - * Since symbols are paired for the longest Huffman code, the symbols are - * removed from this length category two at a time. The prefix for the pair - * (which is one bit shorter) is allocated to one of the pair; then, - * skipping the BITS entry for that prefix length, a code word from the next - * shortest nonzero BITS entry is converted into a prefix for two code words - * one bit longer. - */ - - for (i = MAX_CLEN; i > 16; i--) { - while (bits[i] > 0) { - j = i - 2; /* find length of new prefix to be used */ - while (bits[j] == 0) - j--; - - bits[i] -= 2; /* remove two symbols */ - bits[i-1]++; /* one goes in this length */ - bits[j+1] += 2; /* two new symbols in this length */ - bits[j]--; /* symbol of this length is now a prefix */ - } - } - - /* Remove the count for the pseudo-symbol 256 from the largest codelength */ - while (bits[i] == 0) /* find largest codelength still in use */ - i--; - bits[i]--; - - /* Return final symbol counts (only for lengths 0..16) */ - MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits)); - - /* Return a list of the symbols sorted by code length */ - /* It's not real clear to me why we don't need to consider the codelength - * changes made above, but the JPEG spec seems to think this works. - */ - p = 0; - for (i = 1; i <= MAX_CLEN; i++) { - for (j = 0; j <= 255; j++) { - if (codesize[j] == i) { - htbl->huffval[p] = (UINT8) j; - p++; - } - } - } - - /* Set sent_table FALSE so updated table will be written to JPEG file. */ - htbl->sent_table = FALSE; -} - - -/* - * Finish up a statistics-gathering pass and create the new Huffman tables. - */ - -METHODDEF(void) -finish_pass_gather (j_compress_ptr cinfo) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int ci, dctbl, actbl; - jpeg_component_info * compptr; - JHUFF_TBL **htblptr; - boolean did_dc[NUM_HUFF_TBLS]; - boolean did_ac[NUM_HUFF_TBLS]; - - /* It's important not to apply jpeg_gen_optimal_table more than once - * per table, because it clobbers the input frequency counts! - */ - MEMZERO(did_dc, SIZEOF(did_dc)); - MEMZERO(did_ac, SIZEOF(did_ac)); - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - dctbl = compptr->dc_tbl_no; - actbl = compptr->ac_tbl_no; - if (! did_dc[dctbl]) { - htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl]; - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]); - did_dc[dctbl] = TRUE; - } - if (! did_ac[actbl]) { - htblptr = & cinfo->ac_huff_tbl_ptrs[actbl]; - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]); - did_ac[actbl] = TRUE; - } - } -} - - -#endif /* ENTROPY_OPT_SUPPORTED */ - - -/* - * Module initialization routine for Huffman entropy encoding. - */ - -GLOBAL(void) -jinit_huff_encoder (j_compress_ptr cinfo) -{ - huff_entropy_ptr entropy; - int i; - - entropy = (huff_entropy_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(huff_entropy_encoder)); - cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; - entropy->pub.start_pass = start_pass_huff; - - /* Mark tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; -#ifdef ENTROPY_OPT_SUPPORTED - entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL; -#endif - } -} diff --git a/src/SFML/Graphics/libjpeg/jchuff.h b/src/SFML/Graphics/libjpeg/jchuff.h deleted file mode 100644 index 8c02c09a..00000000 --- a/src/SFML/Graphics/libjpeg/jchuff.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * jchuff.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for Huffman entropy encoding routines - * that are shared between the sequential encoder (jchuff.c) and the - * progressive encoder (jcphuff.c). No other modules need to see these. - */ - -/* The legal range of a DCT coefficient is - * -1024 .. +1023 for 8-bit data; - * -16384 .. +16383 for 12-bit data. - * Hence the magnitude should always fit in 10 or 14 bits respectively. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MAX_COEF_BITS 10 -#else -#define MAX_COEF_BITS 14 -#endif - -/* Derived data constructed for each Huffman table */ - -typedef struct { - unsigned int ehufco[256]; /* code for each symbol */ - char ehufsi[256]; /* length of code for each symbol */ - /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ -} c_derived_tbl; - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_make_c_derived_tbl jMkCDerived -#define jpeg_gen_optimal_table jGenOptTbl -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - -/* Expand a Huffman table definition into the derived format */ -EXTERN(void) jpeg_make_c_derived_tbl - JPP((j_compress_ptr cinfo, boolean isDC, int tblno, - c_derived_tbl ** pdtbl)); - -/* Generate an optimal table definition given the specified counts */ -EXTERN(void) jpeg_gen_optimal_table - JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])); diff --git a/src/SFML/Graphics/libjpeg/jcinit.c b/src/SFML/Graphics/libjpeg/jcinit.c deleted file mode 100644 index 19de8d0e..00000000 --- a/src/SFML/Graphics/libjpeg/jcinit.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * jcinit.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains initialization logic for the JPEG compressor. - * This routine is in charge of selecting the modules to be executed and - * making an initialization call to each one. - * - * Logically, this code belongs in jcmaster.c. It's split out because - * linking this routine implies linking the entire compression library. - * For a transcoding-only application, we want to be able to use jcmaster.c - * without linking in the whole library. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Master selection of compression modules. - * This is done once at the start of processing an image. We determine - * which modules will be used and give them appropriate initialization calls. - */ - -GLOBAL(void) -jinit_compress_master (j_compress_ptr cinfo) -{ - /* Initialize master control (includes parameter checking/processing) */ - jinit_c_master_control(cinfo, FALSE /* full compression */); - - /* Preprocessing */ - if (! cinfo->raw_data_in) { - jinit_color_converter(cinfo); - jinit_downsampler(cinfo); - jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */); - } - /* Forward DCT */ - jinit_forward_dct(cinfo); - /* Entropy encoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - jinit_phuff_encoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_encoder(cinfo); - } - - /* Need a full-image coefficient buffer in any multi-pass mode. */ - jinit_c_coef_controller(cinfo, - (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding)); - jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */); - - jinit_marker_writer(cinfo); - - /* We can now tell the memory manager to allocate virtual arrays. */ - (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); - - /* Write the datastream header (SOI) immediately. - * Frame and scan headers are postponed till later. - * This lets application insert special markers after the SOI. - */ - (*cinfo->marker->write_file_header) (cinfo); -} diff --git a/src/SFML/Graphics/libjpeg/jcmainct.c b/src/SFML/Graphics/libjpeg/jcmainct.c deleted file mode 100644 index 14aa4c75..00000000 --- a/src/SFML/Graphics/libjpeg/jcmainct.c +++ /dev/null @@ -1,293 +0,0 @@ -/* - * jcmainct.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the main buffer controller for compression. - * The main buffer lies between the pre-processor and the JPEG - * compressor proper; it holds downsampled data in the JPEG colorspace. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Note: currently, there is no operating mode in which a full-image buffer - * is needed at this step. If there were, that mode could not be used with - * "raw data" input, since this module is bypassed in that case. However, - * we've left the code here for possible use in special applications. - */ -#undef FULL_MAIN_BUFFER_SUPPORTED - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_c_main_controller pub; /* public fields */ - - JDIMENSION cur_iMCU_row; /* number of current iMCU row */ - JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */ - boolean suspended; /* remember if we suspended output */ - J_BUF_MODE pass_mode; /* current operating mode */ - - /* If using just a strip buffer, this points to the entire set of buffers - * (we allocate one for each component). In the full-image case, this - * points to the currently accessible strips of the virtual arrays. - */ - JSAMPARRAY buffer[MAX_COMPONENTS]; - -#ifdef FULL_MAIN_BUFFER_SUPPORTED - /* If using full-image storage, this array holds pointers to virtual-array - * control blocks for each component. Unused if not full-image storage. - */ - jvirt_sarray_ptr whole_image[MAX_COMPONENTS]; -#endif -} my_main_controller; - -typedef my_main_controller * my_main_ptr; - - -/* Forward declarations */ -METHODDEF(void) process_data_simple_main - JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, - JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); -#ifdef FULL_MAIN_BUFFER_SUPPORTED -METHODDEF(void) process_data_buffer_main - JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, - JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); -#endif - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - - /* Do nothing in raw-data mode. */ - if (cinfo->raw_data_in) - return; - - main->cur_iMCU_row = 0; /* initialize counters */ - main->rowgroup_ctr = 0; - main->suspended = FALSE; - main->pass_mode = pass_mode; /* save mode for use by process_data */ - - switch (pass_mode) { - case JBUF_PASS_THRU: -#ifdef FULL_MAIN_BUFFER_SUPPORTED - if (main->whole_image[0] != NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); -#endif - main->pub.process_data = process_data_simple_main; - break; -#ifdef FULL_MAIN_BUFFER_SUPPORTED - case JBUF_SAVE_SOURCE: - case JBUF_CRANK_DEST: - case JBUF_SAVE_AND_PASS: - if (main->whole_image[0] == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - main->pub.process_data = process_data_buffer_main; - break; -#endif - default: - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; - } -} - - -/* - * Process some data. - * This routine handles the simple pass-through mode, - * where we have only a strip buffer. - */ - -METHODDEF(void) -process_data_simple_main (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail) -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - - while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { - /* Read input data if we haven't filled the main buffer yet */ - if (main->rowgroup_ctr < DCTSIZE) - (*cinfo->prep->pre_process_data) (cinfo, - input_buf, in_row_ctr, in_rows_avail, - main->buffer, &main->rowgroup_ctr, - (JDIMENSION) DCTSIZE); - - /* If we don't have a full iMCU row buffered, return to application for - * more data. Note that preprocessor will always pad to fill the iMCU row - * at the bottom of the image. - */ - if (main->rowgroup_ctr != DCTSIZE) - return; - - /* Send the completed row to the compressor */ - if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { - /* If compressor did not consume the whole row, then we must need to - * suspend processing and return to the application. In this situation - * we pretend we didn't yet consume the last input row; otherwise, if - * it happened to be the last row of the image, the application would - * think we were done. - */ - if (! main->suspended) { - (*in_row_ctr)--; - main->suspended = TRUE; - } - return; - } - /* We did finish the row. Undo our little suspension hack if a previous - * call suspended; then mark the main buffer empty. - */ - if (main->suspended) { - (*in_row_ctr)++; - main->suspended = FALSE; - } - main->rowgroup_ctr = 0; - main->cur_iMCU_row++; - } -} - - -#ifdef FULL_MAIN_BUFFER_SUPPORTED - -/* - * Process some data. - * This routine handles all of the modes that use a full-size buffer. - */ - -METHODDEF(void) -process_data_buffer_main (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail) -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - int ci; - jpeg_component_info *compptr; - boolean writing = (main->pass_mode != JBUF_CRANK_DEST); - - while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { - /* Realign the virtual buffers if at the start of an iMCU row. */ - if (main->rowgroup_ctr == 0) { - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - main->buffer[ci] = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, main->whole_image[ci], - main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE), - (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing); - } - /* In a read pass, pretend we just read some source data. */ - if (! writing) { - *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE; - main->rowgroup_ctr = DCTSIZE; - } - } - - /* If a write pass, read input data until the current iMCU row is full. */ - /* Note: preprocessor will pad if necessary to fill the last iMCU row. */ - if (writing) { - (*cinfo->prep->pre_process_data) (cinfo, - input_buf, in_row_ctr, in_rows_avail, - main->buffer, &main->rowgroup_ctr, - (JDIMENSION) DCTSIZE); - /* Return to application if we need more data to fill the iMCU row. */ - if (main->rowgroup_ctr < DCTSIZE) - return; - } - - /* Emit data, unless this is a sink-only pass. */ - if (main->pass_mode != JBUF_SAVE_SOURCE) { - if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { - /* If compressor did not consume the whole row, then we must need to - * suspend processing and return to the application. In this situation - * we pretend we didn't yet consume the last input row; otherwise, if - * it happened to be the last row of the image, the application would - * think we were done. - */ - if (! main->suspended) { - (*in_row_ctr)--; - main->suspended = TRUE; - } - return; - } - /* We did finish the row. Undo our little suspension hack if a previous - * call suspended; then mark the main buffer empty. - */ - if (main->suspended) { - (*in_row_ctr)++; - main->suspended = FALSE; - } - } - - /* If get here, we are done with this iMCU row. Mark buffer empty. */ - main->rowgroup_ctr = 0; - main->cur_iMCU_row++; - } -} - -#endif /* FULL_MAIN_BUFFER_SUPPORTED */ - - -/* - * Initialize main buffer controller. - */ - -GLOBAL(void) -jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer) -{ - my_main_ptr main; - int ci; - jpeg_component_info *compptr; - - main = (my_main_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_main_controller)); - cinfo->main = (struct jpeg_c_main_controller *) main; - main->pub.start_pass = start_pass_main; - - /* We don't need to create a buffer in raw-data mode. */ - if (cinfo->raw_data_in) - return; - - /* Create the buffer. It holds downsampled data, so each component - * may be of a different size. - */ - if (need_full_buffer) { -#ifdef FULL_MAIN_BUFFER_SUPPORTED - /* Allocate a full-image virtual array for each component */ - /* Note we pad the bottom to a multiple of the iMCU height */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - main->whole_image[ci] = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - compptr->width_in_blocks * DCTSIZE, - (JDIMENSION) jround_up((long) compptr->height_in_blocks, - (long) compptr->v_samp_factor) * DCTSIZE, - (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); - } -#else - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); -#endif - } else { -#ifdef FULL_MAIN_BUFFER_SUPPORTED - main->whole_image[0] = NULL; /* flag for no virtual arrays */ -#endif - /* Allocate a strip buffer for each component */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - main->buffer[ci] = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - compptr->width_in_blocks * DCTSIZE, - (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); - } - } -} diff --git a/src/SFML/Graphics/libjpeg/jcmarker.c b/src/SFML/Graphics/libjpeg/jcmarker.c deleted file mode 100644 index 0d3ca5e5..00000000 --- a/src/SFML/Graphics/libjpeg/jcmarker.c +++ /dev/null @@ -1,664 +0,0 @@ -/* - * jcmarker.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to write JPEG datastream markers. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -typedef enum { /* JPEG marker codes */ - M_SOF0 = 0xc0, - M_SOF1 = 0xc1, - M_SOF2 = 0xc2, - M_SOF3 = 0xc3, - - M_SOF5 = 0xc5, - M_SOF6 = 0xc6, - M_SOF7 = 0xc7, - - M_JPG = 0xc8, - M_SOF9 = 0xc9, - M_SOF10 = 0xca, - M_SOF11 = 0xcb, - - M_SOF13 = 0xcd, - M_SOF14 = 0xce, - M_SOF15 = 0xcf, - - M_DHT = 0xc4, - - M_DAC = 0xcc, - - M_RST0 = 0xd0, - M_RST1 = 0xd1, - M_RST2 = 0xd2, - M_RST3 = 0xd3, - M_RST4 = 0xd4, - M_RST5 = 0xd5, - M_RST6 = 0xd6, - M_RST7 = 0xd7, - - M_SOI = 0xd8, - M_EOI = 0xd9, - M_SOS = 0xda, - M_DQT = 0xdb, - M_DNL = 0xdc, - M_DRI = 0xdd, - M_DHP = 0xde, - M_EXP = 0xdf, - - M_APP0 = 0xe0, - M_APP1 = 0xe1, - M_APP2 = 0xe2, - M_APP3 = 0xe3, - M_APP4 = 0xe4, - M_APP5 = 0xe5, - M_APP6 = 0xe6, - M_APP7 = 0xe7, - M_APP8 = 0xe8, - M_APP9 = 0xe9, - M_APP10 = 0xea, - M_APP11 = 0xeb, - M_APP12 = 0xec, - M_APP13 = 0xed, - M_APP14 = 0xee, - M_APP15 = 0xef, - - M_JPG0 = 0xf0, - M_JPG13 = 0xfd, - M_COM = 0xfe, - - M_TEM = 0x01, - - M_ERROR = 0x100 -} JPEG_MARKER; - - -/* Private state */ - -typedef struct { - struct jpeg_marker_writer pub; /* public fields */ - - unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */ -} my_marker_writer; - -typedef my_marker_writer * my_marker_ptr; - - -/* - * Basic output routines. - * - * Note that we do not support suspension while writing a marker. - * Therefore, an application using suspension must ensure that there is - * enough buffer space for the initial markers (typ. 600-700 bytes) before - * calling jpeg_start_compress, and enough space to write the trailing EOI - * (a few bytes) before calling jpeg_finish_compress. Multipass compression - * modes are not supported at all with suspension, so those two are the only - * points where markers will be written. - */ - -LOCAL(void) -emit_byte (j_compress_ptr cinfo, int val) -/* Emit a byte */ -{ - struct jpeg_destination_mgr * dest = cinfo->dest; - - *(dest->next_output_byte)++ = (JOCTET) val; - if (--dest->free_in_buffer == 0) { - if (! (*dest->empty_output_buffer) (cinfo)) - ERREXIT(cinfo, JERR_CANT_SUSPEND); - } -} - - -LOCAL(void) -emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark) -/* Emit a marker code */ -{ - emit_byte(cinfo, 0xFF); - emit_byte(cinfo, (int) mark); -} - - -LOCAL(void) -emit_2bytes (j_compress_ptr cinfo, int value) -/* Emit a 2-byte integer; these are always MSB first in JPEG files */ -{ - emit_byte(cinfo, (value >> 8) & 0xFF); - emit_byte(cinfo, value & 0xFF); -} - - -/* - * Routines to write specific marker types. - */ - -LOCAL(int) -emit_dqt (j_compress_ptr cinfo, int index) -/* Emit a DQT marker */ -/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */ -{ - JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index]; - int prec; - int i; - - if (qtbl == NULL) - ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index); - - prec = 0; - for (i = 0; i < DCTSIZE2; i++) { - if (qtbl->quantval[i] > 255) - prec = 1; - } - - if (! qtbl->sent_table) { - emit_marker(cinfo, M_DQT); - - emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2); - - emit_byte(cinfo, index + (prec<<4)); - - for (i = 0; i < DCTSIZE2; i++) { - /* The table entries must be emitted in zigzag order. */ - unsigned int qval = qtbl->quantval[jpeg_natural_order[i]]; - if (prec) - emit_byte(cinfo, (int) (qval >> 8)); - emit_byte(cinfo, (int) (qval & 0xFF)); - } - - qtbl->sent_table = TRUE; - } - - return prec; -} - - -LOCAL(void) -emit_dht (j_compress_ptr cinfo, int index, boolean is_ac) -/* Emit a DHT marker */ -{ - JHUFF_TBL * htbl; - int length, i; - - if (is_ac) { - htbl = cinfo->ac_huff_tbl_ptrs[index]; - index += 0x10; /* output index has AC bit set */ - } else { - htbl = cinfo->dc_huff_tbl_ptrs[index]; - } - - if (htbl == NULL) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index); - - if (! htbl->sent_table) { - emit_marker(cinfo, M_DHT); - - length = 0; - for (i = 1; i <= 16; i++) - length += htbl->bits[i]; - - emit_2bytes(cinfo, length + 2 + 1 + 16); - emit_byte(cinfo, index); - - for (i = 1; i <= 16; i++) - emit_byte(cinfo, htbl->bits[i]); - - for (i = 0; i < length; i++) - emit_byte(cinfo, htbl->huffval[i]); - - htbl->sent_table = TRUE; - } -} - - -LOCAL(void) -emit_dac (j_compress_ptr cinfo) -/* Emit a DAC marker */ -/* Since the useful info is so small, we want to emit all the tables in */ -/* one DAC marker. Therefore this routine does its own scan of the table. */ -{ -#ifdef C_ARITH_CODING_SUPPORTED - char dc_in_use[NUM_ARITH_TBLS]; - char ac_in_use[NUM_ARITH_TBLS]; - int length, i; - jpeg_component_info *compptr; - - for (i = 0; i < NUM_ARITH_TBLS; i++) - dc_in_use[i] = ac_in_use[i] = 0; - - for (i = 0; i < cinfo->comps_in_scan; i++) { - compptr = cinfo->cur_comp_info[i]; - dc_in_use[compptr->dc_tbl_no] = 1; - ac_in_use[compptr->ac_tbl_no] = 1; - } - - length = 0; - for (i = 0; i < NUM_ARITH_TBLS; i++) - length += dc_in_use[i] + ac_in_use[i]; - - emit_marker(cinfo, M_DAC); - - emit_2bytes(cinfo, length*2 + 2); - - for (i = 0; i < NUM_ARITH_TBLS; i++) { - if (dc_in_use[i]) { - emit_byte(cinfo, i); - emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); - } - if (ac_in_use[i]) { - emit_byte(cinfo, i + 0x10); - emit_byte(cinfo, cinfo->arith_ac_K[i]); - } - } -#endif /* C_ARITH_CODING_SUPPORTED */ -} - - -LOCAL(void) -emit_dri (j_compress_ptr cinfo) -/* Emit a DRI marker */ -{ - emit_marker(cinfo, M_DRI); - - emit_2bytes(cinfo, 4); /* fixed length */ - - emit_2bytes(cinfo, (int) cinfo->restart_interval); -} - - -LOCAL(void) -emit_sof (j_compress_ptr cinfo, JPEG_MARKER code) -/* Emit a SOF marker */ -{ - int ci; - jpeg_component_info *compptr; - - emit_marker(cinfo, code); - - emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */ - - /* Make sure image isn't bigger than SOF field can handle */ - if ((long) cinfo->image_height > 65535L || - (long) cinfo->image_width > 65535L) - ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535); - - emit_byte(cinfo, cinfo->data_precision); - emit_2bytes(cinfo, (int) cinfo->image_height); - emit_2bytes(cinfo, (int) cinfo->image_width); - - emit_byte(cinfo, cinfo->num_components); - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - emit_byte(cinfo, compptr->component_id); - emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor); - emit_byte(cinfo, compptr->quant_tbl_no); - } -} - - -LOCAL(void) -emit_sos (j_compress_ptr cinfo) -/* Emit a SOS marker */ -{ - int i, td, ta; - jpeg_component_info *compptr; - - emit_marker(cinfo, M_SOS); - - emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */ - - emit_byte(cinfo, cinfo->comps_in_scan); - - for (i = 0; i < cinfo->comps_in_scan; i++) { - compptr = cinfo->cur_comp_info[i]; - emit_byte(cinfo, compptr->component_id); - td = compptr->dc_tbl_no; - ta = compptr->ac_tbl_no; - if (cinfo->progressive_mode) { - /* Progressive mode: only DC or only AC tables are used in one scan; - * furthermore, Huffman coding of DC refinement uses no table at all. - * We emit 0 for unused field(s); this is recommended by the P&M text - * but does not seem to be specified in the standard. - */ - if (cinfo->Ss == 0) { - ta = 0; /* DC scan */ - if (cinfo->Ah != 0 && !cinfo->arith_code) - td = 0; /* no DC table either */ - } else { - td = 0; /* AC scan */ - } - } - emit_byte(cinfo, (td << 4) + ta); - } - - emit_byte(cinfo, cinfo->Ss); - emit_byte(cinfo, cinfo->Se); - emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al); -} - - -LOCAL(void) -emit_jfif_app0 (j_compress_ptr cinfo) -/* Emit a JFIF-compliant APP0 marker */ -{ - /* - * Length of APP0 block (2 bytes) - * Block ID (4 bytes - ASCII "JFIF") - * Zero byte (1 byte to terminate the ID string) - * Version Major, Minor (2 bytes - major first) - * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm) - * Xdpu (2 bytes - dots per unit horizontal) - * Ydpu (2 bytes - dots per unit vertical) - * Thumbnail X size (1 byte) - * Thumbnail Y size (1 byte) - */ - - emit_marker(cinfo, M_APP0); - - emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */ - - emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */ - emit_byte(cinfo, 0x46); - emit_byte(cinfo, 0x49); - emit_byte(cinfo, 0x46); - emit_byte(cinfo, 0); - emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */ - emit_byte(cinfo, cinfo->JFIF_minor_version); - emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */ - emit_2bytes(cinfo, (int) cinfo->X_density); - emit_2bytes(cinfo, (int) cinfo->Y_density); - emit_byte(cinfo, 0); /* No thumbnail image */ - emit_byte(cinfo, 0); -} - - -LOCAL(void) -emit_adobe_app14 (j_compress_ptr cinfo) -/* Emit an Adobe APP14 marker */ -{ - /* - * Length of APP14 block (2 bytes) - * Block ID (5 bytes - ASCII "Adobe") - * Version Number (2 bytes - currently 100) - * Flags0 (2 bytes - currently 0) - * Flags1 (2 bytes - currently 0) - * Color transform (1 byte) - * - * Although Adobe TN 5116 mentions Version = 101, all the Adobe files - * now in circulation seem to use Version = 100, so that's what we write. - * - * We write the color transform byte as 1 if the JPEG color space is - * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with - * whether the encoder performed a transformation, which is pretty useless. - */ - - emit_marker(cinfo, M_APP14); - - emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */ - - emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */ - emit_byte(cinfo, 0x64); - emit_byte(cinfo, 0x6F); - emit_byte(cinfo, 0x62); - emit_byte(cinfo, 0x65); - emit_2bytes(cinfo, 100); /* Version */ - emit_2bytes(cinfo, 0); /* Flags0 */ - emit_2bytes(cinfo, 0); /* Flags1 */ - switch (cinfo->jpeg_color_space) { - case JCS_YCbCr: - emit_byte(cinfo, 1); /* Color transform = 1 */ - break; - case JCS_YCCK: - emit_byte(cinfo, 2); /* Color transform = 2 */ - break; - default: - emit_byte(cinfo, 0); /* Color transform = 0 */ - break; - } -} - - -/* - * These routines allow writing an arbitrary marker with parameters. - * The only intended use is to emit COM or APPn markers after calling - * write_file_header and before calling write_frame_header. - * Other uses are not guaranteed to produce desirable results. - * Counting the parameter bytes properly is the caller's responsibility. - */ - -METHODDEF(void) -write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen) -/* Emit an arbitrary marker header */ -{ - if (datalen > (unsigned int) 65533) /* safety check */ - ERREXIT(cinfo, JERR_BAD_LENGTH); - - emit_marker(cinfo, (JPEG_MARKER) marker); - - emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */ -} - -METHODDEF(void) -write_marker_byte (j_compress_ptr cinfo, int val) -/* Emit one byte of marker parameters following write_marker_header */ -{ - emit_byte(cinfo, val); -} - - -/* - * Write datastream header. - * This consists of an SOI and optional APPn markers. - * We recommend use of the JFIF marker, but not the Adobe marker, - * when using YCbCr or grayscale data. The JFIF marker should NOT - * be used for any other JPEG colorspace. The Adobe marker is helpful - * to distinguish RGB, CMYK, and YCCK colorspaces. - * Note that an application can write additional header markers after - * jpeg_start_compress returns. - */ - -METHODDEF(void) -write_file_header (j_compress_ptr cinfo) -{ - my_marker_ptr marker = (my_marker_ptr) cinfo->marker; - - emit_marker(cinfo, M_SOI); /* first the SOI */ - - /* SOI is defined to reset restart interval to 0 */ - marker->last_restart_interval = 0; - - if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */ - emit_jfif_app0(cinfo); - if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */ - emit_adobe_app14(cinfo); -} - - -/* - * Write frame header. - * This consists of DQT and SOFn markers. - * Note that we do not emit the SOF until we have emitted the DQT(s). - * This avoids compatibility problems with incorrect implementations that - * try to error-check the quant table numbers as soon as they see the SOF. - */ - -METHODDEF(void) -write_frame_header (j_compress_ptr cinfo) -{ - int ci, prec; - boolean is_baseline; - jpeg_component_info *compptr; - - /* Emit DQT for each quantization table. - * Note that emit_dqt() suppresses any duplicate tables. - */ - prec = 0; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - prec += emit_dqt(cinfo, compptr->quant_tbl_no); - } - /* now prec is nonzero iff there are any 16-bit quant tables. */ - - /* Check for a non-baseline specification. - * Note we assume that Huffman table numbers won't be changed later. - */ - if (cinfo->arith_code || cinfo->progressive_mode || - cinfo->data_precision != 8) { - is_baseline = FALSE; - } else { - is_baseline = TRUE; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1) - is_baseline = FALSE; - } - if (prec && is_baseline) { - is_baseline = FALSE; - /* If it's baseline except for quantizer size, warn the user */ - TRACEMS(cinfo, 0, JTRC_16BIT_TABLES); - } - } - - /* Emit the proper SOF marker */ - if (cinfo->arith_code) { - emit_sof(cinfo, M_SOF9); /* SOF code for arithmetic coding */ - } else { - if (cinfo->progressive_mode) - emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */ - else if (is_baseline) - emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */ - else - emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */ - } -} - - -/* - * Write scan header. - * This consists of DHT or DAC markers, optional DRI, and SOS. - * Compressed data will be written following the SOS. - */ - -METHODDEF(void) -write_scan_header (j_compress_ptr cinfo) -{ - my_marker_ptr marker = (my_marker_ptr) cinfo->marker; - int i; - jpeg_component_info *compptr; - - if (cinfo->arith_code) { - /* Emit arith conditioning info. We may have some duplication - * if the file has multiple scans, but it's so small it's hardly - * worth worrying about. - */ - emit_dac(cinfo); - } else { - /* Emit Huffman tables. - * Note that emit_dht() suppresses any duplicate tables. - */ - for (i = 0; i < cinfo->comps_in_scan; i++) { - compptr = cinfo->cur_comp_info[i]; - if (cinfo->progressive_mode) { - /* Progressive mode: only DC or only AC tables are used in one scan */ - if (cinfo->Ss == 0) { - if (cinfo->Ah == 0) /* DC needs no table for refinement scan */ - emit_dht(cinfo, compptr->dc_tbl_no, FALSE); - } else { - emit_dht(cinfo, compptr->ac_tbl_no, TRUE); - } - } else { - /* Sequential mode: need both DC and AC tables */ - emit_dht(cinfo, compptr->dc_tbl_no, FALSE); - emit_dht(cinfo, compptr->ac_tbl_no, TRUE); - } - } - } - - /* Emit DRI if required --- note that DRI value could change for each scan. - * We avoid wasting space with unnecessary DRIs, however. - */ - if (cinfo->restart_interval != marker->last_restart_interval) { - emit_dri(cinfo); - marker->last_restart_interval = cinfo->restart_interval; - } - - emit_sos(cinfo); -} - - -/* - * Write datastream trailer. - */ - -METHODDEF(void) -write_file_trailer (j_compress_ptr cinfo) -{ - emit_marker(cinfo, M_EOI); -} - - -/* - * Write an abbreviated table-specification datastream. - * This consists of SOI, DQT and DHT tables, and EOI. - * Any table that is defined and not marked sent_table = TRUE will be - * emitted. Note that all tables will be marked sent_table = TRUE at exit. - */ - -METHODDEF(void) -write_tables_only (j_compress_ptr cinfo) -{ - int i; - - emit_marker(cinfo, M_SOI); - - for (i = 0; i < NUM_QUANT_TBLS; i++) { - if (cinfo->quant_tbl_ptrs[i] != NULL) - (void) emit_dqt(cinfo, i); - } - - if (! cinfo->arith_code) { - for (i = 0; i < NUM_HUFF_TBLS; i++) { - if (cinfo->dc_huff_tbl_ptrs[i] != NULL) - emit_dht(cinfo, i, FALSE); - if (cinfo->ac_huff_tbl_ptrs[i] != NULL) - emit_dht(cinfo, i, TRUE); - } - } - - emit_marker(cinfo, M_EOI); -} - - -/* - * Initialize the marker writer module. - */ - -GLOBAL(void) -jinit_marker_writer (j_compress_ptr cinfo) -{ - my_marker_ptr marker; - - /* Create the subobject */ - marker = (my_marker_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_marker_writer)); - cinfo->marker = (struct jpeg_marker_writer *) marker; - /* Initialize method pointers */ - marker->pub.write_file_header = write_file_header; - marker->pub.write_frame_header = write_frame_header; - marker->pub.write_scan_header = write_scan_header; - marker->pub.write_file_trailer = write_file_trailer; - marker->pub.write_tables_only = write_tables_only; - marker->pub.write_marker_header = write_marker_header; - marker->pub.write_marker_byte = write_marker_byte; - /* Initialize private state */ - marker->last_restart_interval = 0; -} diff --git a/src/SFML/Graphics/libjpeg/jcmaster.c b/src/SFML/Graphics/libjpeg/jcmaster.c deleted file mode 100644 index e61138b1..00000000 --- a/src/SFML/Graphics/libjpeg/jcmaster.c +++ /dev/null @@ -1,590 +0,0 @@ -/* - * jcmaster.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains master control logic for the JPEG compressor. - * These routines are concerned with parameter validation, initial setup, - * and inter-pass control (determining the number of passes and the work - * to be done in each pass). - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private state */ - -typedef enum { - main_pass, /* input data, also do first output step */ - huff_opt_pass, /* Huffman code optimization pass */ - output_pass /* data output pass */ -} c_pass_type; - -typedef struct { - struct jpeg_comp_master pub; /* public fields */ - - c_pass_type pass_type; /* the type of the current pass */ - - int pass_number; /* # of passes completed */ - int total_passes; /* total # of passes needed */ - - int scan_number; /* current index in scan_info[] */ -} my_comp_master; - -typedef my_comp_master * my_master_ptr; - - -/* - * Support routines that do various essential calculations. - */ - -LOCAL(void) -initial_setup (j_compress_ptr cinfo) -/* Do computations that are needed before master selection phase */ -{ - int ci; - jpeg_component_info *compptr; - long samplesperrow; - JDIMENSION jd_samplesperrow; - - /* Sanity check on image dimensions */ - if (cinfo->image_height <= 0 || cinfo->image_width <= 0 - || cinfo->num_components <= 0 || cinfo->input_components <= 0) - ERREXIT(cinfo, JERR_EMPTY_IMAGE); - - /* Make sure image isn't bigger than I can handle */ - if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || - (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) - ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); - - /* Width of an input scanline must be representable as JDIMENSION. */ - samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components; - jd_samplesperrow = (JDIMENSION) samplesperrow; - if ((long) jd_samplesperrow != samplesperrow) - ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); - - /* For now, precision must match compiled-in value... */ - if (cinfo->data_precision != BITS_IN_JSAMPLE) - ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); - - /* Check that number of components won't exceed internal array sizes */ - if (cinfo->num_components > MAX_COMPONENTS) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, - MAX_COMPONENTS); - - /* Compute maximum sampling factors; check factor validity */ - cinfo->max_h_samp_factor = 1; - cinfo->max_v_samp_factor = 1; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || - compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) - ERREXIT(cinfo, JERR_BAD_SAMPLING); - cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, - compptr->h_samp_factor); - cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, - compptr->v_samp_factor); - } - - /* Compute dimensions of components */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Fill in the correct component_index value; don't rely on application */ - compptr->component_index = ci; - /* For compression, we never do DCT scaling. */ - compptr->DCT_scaled_size = DCTSIZE; - /* Size in DCT blocks */ - compptr->width_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) (cinfo->max_h_samp_factor * DCTSIZE)); - compptr->height_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) (cinfo->max_v_samp_factor * DCTSIZE)); - /* Size in samples */ - compptr->downsampled_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) cinfo->max_h_samp_factor); - compptr->downsampled_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) cinfo->max_v_samp_factor); - /* Mark component needed (this flag isn't actually used for compression) */ - compptr->component_needed = TRUE; - } - - /* Compute number of fully interleaved MCU rows (number of times that - * main controller will call coefficient controller). - */ - cinfo->total_iMCU_rows = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); -} - - -#ifdef C_MULTISCAN_FILES_SUPPORTED - -LOCAL(void) -validate_script (j_compress_ptr cinfo) -/* Verify that the scan script in cinfo->scan_info[] is valid; also - * determine whether it uses progressive JPEG, and set cinfo->progressive_mode. - */ -{ - const jpeg_scan_info * scanptr; - int scanno, ncomps, ci, coefi, thisi; - int Ss, Se, Ah, Al; - boolean component_sent[MAX_COMPONENTS]; -#ifdef C_PROGRESSIVE_SUPPORTED - int * last_bitpos_ptr; - int last_bitpos[MAX_COMPONENTS][DCTSIZE2]; - /* -1 until that coefficient has been seen; then last Al for it */ -#endif - - if (cinfo->num_scans <= 0) - ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0); - - /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1; - * for progressive JPEG, no scan can have this. - */ - scanptr = cinfo->scan_info; - if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) { -#ifdef C_PROGRESSIVE_SUPPORTED - cinfo->progressive_mode = TRUE; - last_bitpos_ptr = & last_bitpos[0][0]; - for (ci = 0; ci < cinfo->num_components; ci++) - for (coefi = 0; coefi < DCTSIZE2; coefi++) - *last_bitpos_ptr++ = -1; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - cinfo->progressive_mode = FALSE; - for (ci = 0; ci < cinfo->num_components; ci++) - component_sent[ci] = FALSE; - } - - for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) { - /* Validate component indexes */ - ncomps = scanptr->comps_in_scan; - if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN); - for (ci = 0; ci < ncomps; ci++) { - thisi = scanptr->component_index[ci]; - if (thisi < 0 || thisi >= cinfo->num_components) - ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); - /* Components must appear in SOF order within each scan */ - if (ci > 0 && thisi <= scanptr->component_index[ci-1]) - ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); - } - /* Validate progression parameters */ - Ss = scanptr->Ss; - Se = scanptr->Se; - Ah = scanptr->Ah; - Al = scanptr->Al; - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that - * seems wrong: the upper bound ought to depend on data precision. - * Perhaps they really meant 0..N+1 for N-bit precision. - * Here we allow 0..10 for 8-bit data; Al larger than 10 results in - * out-of-range reconstructed DC values during the first DC scan, - * which might cause problems for some decoders. - */ -#if BITS_IN_JSAMPLE == 8 -#define MAX_AH_AL 10 -#else -#define MAX_AH_AL 13 -#endif - if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 || - Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL) - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - if (Ss == 0) { - if (Se != 0) /* DC and AC together not OK */ - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - } else { - if (ncomps != 1) /* AC scans must be for only one component */ - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - } - for (ci = 0; ci < ncomps; ci++) { - last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0]; - if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */ - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - for (coefi = Ss; coefi <= Se; coefi++) { - if (last_bitpos_ptr[coefi] < 0) { - /* first scan of this coefficient */ - if (Ah != 0) - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - } else { - /* not first scan */ - if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1) - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - } - last_bitpos_ptr[coefi] = Al; - } - } -#endif - } else { - /* For sequential JPEG, all progression parameters must be these: */ - if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0) - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - /* Make sure components are not sent twice */ - for (ci = 0; ci < ncomps; ci++) { - thisi = scanptr->component_index[ci]; - if (component_sent[thisi]) - ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); - component_sent[thisi] = TRUE; - } - } - } - - /* Now verify that everything got sent. */ - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - /* For progressive mode, we only check that at least some DC data - * got sent for each component; the spec does not require that all bits - * of all coefficients be transmitted. Would it be wiser to enforce - * transmission of all coefficient bits?? - */ - for (ci = 0; ci < cinfo->num_components; ci++) { - if (last_bitpos[ci][0] < 0) - ERREXIT(cinfo, JERR_MISSING_DATA); - } -#endif - } else { - for (ci = 0; ci < cinfo->num_components; ci++) { - if (! component_sent[ci]) - ERREXIT(cinfo, JERR_MISSING_DATA); - } - } -} - -#endif /* C_MULTISCAN_FILES_SUPPORTED */ - - -LOCAL(void) -select_scan_parameters (j_compress_ptr cinfo) -/* Set up the scan parameters for the current scan */ -{ - int ci; - -#ifdef C_MULTISCAN_FILES_SUPPORTED - if (cinfo->scan_info != NULL) { - /* Prepare for current scan --- the script is already validated */ - my_master_ptr master = (my_master_ptr) cinfo->master; - const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number; - - cinfo->comps_in_scan = scanptr->comps_in_scan; - for (ci = 0; ci < scanptr->comps_in_scan; ci++) { - cinfo->cur_comp_info[ci] = - &cinfo->comp_info[scanptr->component_index[ci]]; - } - cinfo->Ss = scanptr->Ss; - cinfo->Se = scanptr->Se; - cinfo->Ah = scanptr->Ah; - cinfo->Al = scanptr->Al; - } - else -#endif - { - /* Prepare for single sequential-JPEG scan containing all components */ - if (cinfo->num_components > MAX_COMPS_IN_SCAN) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, - MAX_COMPS_IN_SCAN); - cinfo->comps_in_scan = cinfo->num_components; - for (ci = 0; ci < cinfo->num_components; ci++) { - cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci]; - } - cinfo->Ss = 0; - cinfo->Se = DCTSIZE2-1; - cinfo->Ah = 0; - cinfo->Al = 0; - } -} - - -LOCAL(void) -per_scan_setup (j_compress_ptr cinfo) -/* Do computations that are needed before processing a JPEG scan */ -/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */ -{ - int ci, mcublks, tmp; - jpeg_component_info *compptr; - - if (cinfo->comps_in_scan == 1) { - - /* Noninterleaved (single-component) scan */ - compptr = cinfo->cur_comp_info[0]; - - /* Overall image size in MCUs */ - cinfo->MCUs_per_row = compptr->width_in_blocks; - cinfo->MCU_rows_in_scan = compptr->height_in_blocks; - - /* For noninterleaved scan, always one block per MCU */ - compptr->MCU_width = 1; - compptr->MCU_height = 1; - compptr->MCU_blocks = 1; - compptr->MCU_sample_width = DCTSIZE; - compptr->last_col_width = 1; - /* For noninterleaved scans, it is convenient to define last_row_height - * as the number of block rows present in the last iMCU row. - */ - tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (tmp == 0) tmp = compptr->v_samp_factor; - compptr->last_row_height = tmp; - - /* Prepare array describing MCU composition */ - cinfo->blocks_in_MCU = 1; - cinfo->MCU_membership[0] = 0; - - } else { - - /* Interleaved (multi-component) scan */ - if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, - MAX_COMPS_IN_SCAN); - - /* Overall image size in MCUs */ - cinfo->MCUs_per_row = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, - (long) (cinfo->max_h_samp_factor*DCTSIZE)); - cinfo->MCU_rows_in_scan = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); - - cinfo->blocks_in_MCU = 0; - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Sampling factors give # of blocks of component in each MCU */ - compptr->MCU_width = compptr->h_samp_factor; - compptr->MCU_height = compptr->v_samp_factor; - compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; - compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE; - /* Figure number of non-dummy blocks in last MCU column & row */ - tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); - if (tmp == 0) tmp = compptr->MCU_width; - compptr->last_col_width = tmp; - tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); - if (tmp == 0) tmp = compptr->MCU_height; - compptr->last_row_height = tmp; - /* Prepare array describing MCU composition */ - mcublks = compptr->MCU_blocks; - if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU) - ERREXIT(cinfo, JERR_BAD_MCU_SIZE); - while (mcublks-- > 0) { - cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; - } - } - - } - - /* Convert restart specified in rows to actual MCU count. */ - /* Note that count must fit in 16 bits, so we provide limiting. */ - if (cinfo->restart_in_rows > 0) { - long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row; - cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L); - } -} - - -/* - * Per-pass setup. - * This is called at the beginning of each pass. We determine which modules - * will be active during this pass and give them appropriate start_pass calls. - * We also set is_last_pass to indicate whether any more passes will be - * required. - */ - -METHODDEF(void) -prepare_for_pass (j_compress_ptr cinfo) -{ - my_master_ptr master = (my_master_ptr) cinfo->master; - - switch (master->pass_type) { - case main_pass: - /* Initial pass: will collect input data, and do either Huffman - * optimization or data output for the first scan. - */ - select_scan_parameters(cinfo); - per_scan_setup(cinfo); - if (! cinfo->raw_data_in) { - (*cinfo->cconvert->start_pass) (cinfo); - (*cinfo->downsample->start_pass) (cinfo); - (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU); - } - (*cinfo->fdct->start_pass) (cinfo); - (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding); - (*cinfo->coef->start_pass) (cinfo, - (master->total_passes > 1 ? - JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); - (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); - if (cinfo->optimize_coding) { - /* No immediate data output; postpone writing frame/scan headers */ - master->pub.call_pass_startup = FALSE; - } else { - /* Will write frame/scan headers at first jpeg_write_scanlines call */ - master->pub.call_pass_startup = TRUE; - } - break; -#ifdef ENTROPY_OPT_SUPPORTED - case huff_opt_pass: - /* Do Huffman optimization for a scan after the first one. */ - select_scan_parameters(cinfo); - per_scan_setup(cinfo); - if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) { - (*cinfo->entropy->start_pass) (cinfo, TRUE); - (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); - master->pub.call_pass_startup = FALSE; - break; - } - /* Special case: Huffman DC refinement scans need no Huffman table - * and therefore we can skip the optimization pass for them. - */ - master->pass_type = output_pass; - master->pass_number++; - /*FALLTHROUGH*/ -#endif - case output_pass: - /* Do a data-output pass. */ - /* We need not repeat per-scan setup if prior optimization pass did it. */ - if (! cinfo->optimize_coding) { - select_scan_parameters(cinfo); - per_scan_setup(cinfo); - } - (*cinfo->entropy->start_pass) (cinfo, FALSE); - (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); - /* We emit frame/scan headers now */ - if (master->scan_number == 0) - (*cinfo->marker->write_frame_header) (cinfo); - (*cinfo->marker->write_scan_header) (cinfo); - master->pub.call_pass_startup = FALSE; - break; - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - } - - master->pub.is_last_pass = (master->pass_number == master->total_passes-1); - - /* Set up progress monitor's pass info if present */ - if (cinfo->progress != NULL) { - cinfo->progress->completed_passes = master->pass_number; - cinfo->progress->total_passes = master->total_passes; - } -} - - -/* - * Special start-of-pass hook. - * This is called by jpeg_write_scanlines if call_pass_startup is TRUE. - * In single-pass processing, we need this hook because we don't want to - * write frame/scan headers during jpeg_start_compress; we want to let the - * application write COM markers etc. between jpeg_start_compress and the - * jpeg_write_scanlines loop. - * In multi-pass processing, this routine is not used. - */ - -METHODDEF(void) -pass_startup (j_compress_ptr cinfo) -{ - cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */ - - (*cinfo->marker->write_frame_header) (cinfo); - (*cinfo->marker->write_scan_header) (cinfo); -} - - -/* - * Finish up at end of pass. - */ - -METHODDEF(void) -finish_pass_master (j_compress_ptr cinfo) -{ - my_master_ptr master = (my_master_ptr) cinfo->master; - - /* The entropy coder always needs an end-of-pass call, - * either to analyze statistics or to flush its output buffer. - */ - (*cinfo->entropy->finish_pass) (cinfo); - - /* Update state for next pass */ - switch (master->pass_type) { - case main_pass: - /* next pass is either output of scan 0 (after optimization) - * or output of scan 1 (if no optimization). - */ - master->pass_type = output_pass; - if (! cinfo->optimize_coding) - master->scan_number++; - break; - case huff_opt_pass: - /* next pass is always output of current scan */ - master->pass_type = output_pass; - break; - case output_pass: - /* next pass is either optimization or output of next scan */ - if (cinfo->optimize_coding) - master->pass_type = huff_opt_pass; - master->scan_number++; - break; - } - - master->pass_number++; -} - - -/* - * Initialize master compression control. - */ - -GLOBAL(void) -jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) -{ - my_master_ptr master; - - master = (my_master_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_comp_master)); - cinfo->master = (struct jpeg_comp_master *) master; - master->pub.prepare_for_pass = prepare_for_pass; - master->pub.pass_startup = pass_startup; - master->pub.finish_pass = finish_pass_master; - master->pub.is_last_pass = FALSE; - - /* Validate parameters, determine derived values */ - initial_setup(cinfo); - - if (cinfo->scan_info != NULL) { -#ifdef C_MULTISCAN_FILES_SUPPORTED - validate_script(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - cinfo->progressive_mode = FALSE; - cinfo->num_scans = 1; - } - - if (cinfo->progressive_mode) /* TEMPORARY HACK ??? */ - cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */ - - /* Initialize my private state */ - if (transcode_only) { - /* no main pass in transcoding */ - if (cinfo->optimize_coding) - master->pass_type = huff_opt_pass; - else - master->pass_type = output_pass; - } else { - /* for normal compression, first pass is always this type: */ - master->pass_type = main_pass; - } - master->scan_number = 0; - master->pass_number = 0; - if (cinfo->optimize_coding) - master->total_passes = cinfo->num_scans * 2; - else - master->total_passes = cinfo->num_scans; -} diff --git a/src/SFML/Graphics/libjpeg/jcomapi.c b/src/SFML/Graphics/libjpeg/jcomapi.c deleted file mode 100644 index 1b1a340c..00000000 --- a/src/SFML/Graphics/libjpeg/jcomapi.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * jcomapi.c - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface routines that are used for both - * compression and decompression. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Abort processing of a JPEG compression or decompression operation, - * but don't destroy the object itself. - * - * For this, we merely clean up all the nonpermanent memory pools. - * Note that temp files (virtual arrays) are not allowed to belong to - * the permanent pool, so we will be able to close all temp files here. - * Closing a data source or destination, if necessary, is the application's - * responsibility. - */ - -GLOBAL(void) -jpeg_abort (j_common_ptr cinfo) -{ - int pool; - - /* Do nothing if called on a not-initialized or destroyed JPEG object. */ - if (cinfo->mem == NULL) - return; - - /* Releasing pools in reverse order might help avoid fragmentation - * with some (brain-damaged) malloc libraries. - */ - for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) { - (*cinfo->mem->free_pool) (cinfo, pool); - } - - /* Reset overall state for possible reuse of object */ - if (cinfo->is_decompressor) { - cinfo->global_state = DSTATE_START; - /* Try to keep application from accessing now-deleted marker list. - * A bit kludgy to do it here, but this is the most central place. - */ - ((j_decompress_ptr) cinfo)->marker_list = NULL; - } else { - cinfo->global_state = CSTATE_START; - } -} - - -/* - * Destruction of a JPEG object. - * - * Everything gets deallocated except the master jpeg_compress_struct itself - * and the error manager struct. Both of these are supplied by the application - * and must be freed, if necessary, by the application. (Often they are on - * the stack and so don't need to be freed anyway.) - * Closing a data source or destination, if necessary, is the application's - * responsibility. - */ - -GLOBAL(void) -jpeg_destroy (j_common_ptr cinfo) -{ - /* We need only tell the memory manager to release everything. */ - /* NB: mem pointer is NULL if memory mgr failed to initialize. */ - if (cinfo->mem != NULL) - (*cinfo->mem->self_destruct) (cinfo); - cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */ - cinfo->global_state = 0; /* mark it destroyed */ -} - - -/* - * Convenience routines for allocating quantization and Huffman tables. - * (Would jutils.c be a more reasonable place to put these?) - */ - -GLOBAL(JQUANT_TBL *) -jpeg_alloc_quant_table (j_common_ptr cinfo) -{ - JQUANT_TBL *tbl; - - tbl = (JQUANT_TBL *) - (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL)); - tbl->sent_table = FALSE; /* make sure this is false in any new table */ - return tbl; -} - - -GLOBAL(JHUFF_TBL *) -jpeg_alloc_huff_table (j_common_ptr cinfo) -{ - JHUFF_TBL *tbl; - - tbl = (JHUFF_TBL *) - (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL)); - tbl->sent_table = FALSE; /* make sure this is false in any new table */ - return tbl; -} diff --git a/src/SFML/Graphics/libjpeg/jcparam.c b/src/SFML/Graphics/libjpeg/jcparam.c deleted file mode 100644 index bbd175c8..00000000 --- a/src/SFML/Graphics/libjpeg/jcparam.c +++ /dev/null @@ -1,610 +0,0 @@ -/* - * jcparam.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains optional default-setting code for the JPEG compressor. - * Applications do not have to use this file, but those that don't use it - * must know a lot more about the innards of the JPEG code. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Quantization table setup routines - */ - -GLOBAL(void) -jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, - const unsigned int *basic_table, - int scale_factor, boolean force_baseline) -/* Define a quantization table equal to the basic_table times - * a scale factor (given as a percentage). - * If force_baseline is TRUE, the computed quantization table entries - * are limited to 1..255 for JPEG baseline compatibility. - */ -{ - JQUANT_TBL ** qtblptr; - int i; - long temp; - - /* Safety check to ensure start_compress not called yet. */ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS) - ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl); - - qtblptr = & cinfo->quant_tbl_ptrs[which_tbl]; - - if (*qtblptr == NULL) - *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo); - - for (i = 0; i < DCTSIZE2; i++) { - temp = ((long) basic_table[i] * scale_factor + 50L) / 100L; - /* limit the values to the valid range */ - if (temp <= 0L) temp = 1L; - if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */ - if (force_baseline && temp > 255L) - temp = 255L; /* limit to baseline range if requested */ - (*qtblptr)->quantval[i] = (UINT16) temp; - } - - /* Initialize sent_table FALSE so table will be written to JPEG file. */ - (*qtblptr)->sent_table = FALSE; -} - - -GLOBAL(void) -jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, - boolean force_baseline) -/* Set or change the 'quality' (quantization) setting, using default tables - * and a straight percentage-scaling quality scale. In most cases it's better - * to use jpeg_set_quality (below); this entry point is provided for - * applications that insist on a linear percentage scaling. - */ -{ - /* These are the sample quantization tables given in JPEG spec section K.1. - * The spec says that the values given produce "good" quality, and - * when divided by 2, "very good" quality. - */ - static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { - 16, 11, 10, 16, 24, 40, 51, 61, - 12, 12, 14, 19, 26, 58, 60, 55, - 14, 13, 16, 24, 40, 57, 69, 56, - 14, 17, 22, 29, 51, 87, 80, 62, - 18, 22, 37, 56, 68, 109, 103, 77, - 24, 35, 55, 64, 81, 104, 113, 92, - 49, 64, 78, 87, 103, 121, 120, 101, - 72, 92, 95, 98, 112, 100, 103, 99 - }; - static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { - 17, 18, 24, 47, 99, 99, 99, 99, - 18, 21, 26, 66, 99, 99, 99, 99, - 24, 26, 56, 99, 99, 99, 99, 99, - 47, 66, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99 - }; - - /* Set up two quantization tables using the specified scaling */ - jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, - scale_factor, force_baseline); - jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, - scale_factor, force_baseline); -} - - -GLOBAL(int) -jpeg_quality_scaling (int quality) -/* Convert a user-specified quality rating to a percentage scaling factor - * for an underlying quantization table, using our recommended scaling curve. - * The input 'quality' factor should be 0 (terrible) to 100 (very good). - */ -{ - /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ - if (quality <= 0) quality = 1; - if (quality > 100) quality = 100; - - /* The basic table is used as-is (scaling 100) for a quality of 50. - * Qualities 50..100 are converted to scaling percentage 200 - 2*Q; - * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table - * to make all the table entries 1 (hence, minimum quantization loss). - * Qualities 1..50 are converted to scaling percentage 5000/Q. - */ - if (quality < 50) - quality = 5000 / quality; - else - quality = 200 - quality*2; - - return quality; -} - - -GLOBAL(void) -jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) -/* Set or change the 'quality' (quantization) setting, using default tables. - * This is the standard quality-adjusting entry point for typical user - * interfaces; only those who want detailed control over quantization tables - * would use the preceding three routines directly. - */ -{ - /* Convert user 0-100 rating to percentage scaling */ - quality = jpeg_quality_scaling(quality); - - /* Set up standard quality tables */ - jpeg_set_linear_quality(cinfo, quality, force_baseline); -} - - -/* - * Huffman table setup routines - */ - -LOCAL(void) -add_huff_table (j_compress_ptr cinfo, - JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) -/* Define a Huffman table */ -{ - int nsymbols, len; - - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - - /* Copy the number-of-symbols-of-each-code-length counts */ - MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); - - /* Validate the counts. We do this here mainly so we can copy the right - * number of symbols from the val[] array, without risking marching off - * the end of memory. jchuff.c will do a more thorough test later. - */ - nsymbols = 0; - for (len = 1; len <= 16; len++) - nsymbols += bits[len]; - if (nsymbols < 1 || nsymbols > 256) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - - MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8)); - - /* Initialize sent_table FALSE so table will be written to JPEG file. */ - (*htblptr)->sent_table = FALSE; -} - - -LOCAL(void) -std_huff_tables (j_compress_ptr cinfo) -/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ -/* IMPORTANT: these are only valid for 8-bit data precision! */ -{ - static const UINT8 bits_dc_luminance[17] = - { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; - static const UINT8 val_dc_luminance[] = - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - - static const UINT8 bits_dc_chrominance[17] = - { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; - static const UINT8 val_dc_chrominance[] = - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - - static const UINT8 bits_ac_luminance[17] = - { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; - static const UINT8 val_ac_luminance[] = - { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, - 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, - 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, - 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, - 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, - 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, - 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, - 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, - 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, - 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, - 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, - 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, - 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, - 0xf9, 0xfa }; - - static const UINT8 bits_ac_chrominance[17] = - { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; - static const UINT8 val_ac_chrominance[] = - { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, - 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, - 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, - 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, - 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, - 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, - 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, - 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, - 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, - 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, - 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, - 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, - 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, - 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, - 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, - 0xf9, 0xfa }; - - add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], - bits_dc_luminance, val_dc_luminance); - add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], - bits_ac_luminance, val_ac_luminance); - add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], - bits_dc_chrominance, val_dc_chrominance); - add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], - bits_ac_chrominance, val_ac_chrominance); -} - - -/* - * Default parameter setup for compression. - * - * Applications that don't choose to use this routine must do their - * own setup of all these parameters. Alternately, you can call this - * to establish defaults and then alter parameters selectively. This - * is the recommended approach since, if we add any new parameters, - * your code will still work (they'll be set to reasonable defaults). - */ - -GLOBAL(void) -jpeg_set_defaults (j_compress_ptr cinfo) -{ - int i; - - /* Safety check to ensure start_compress not called yet. */ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - /* Allocate comp_info array large enough for maximum component count. - * Array is made permanent in case application wants to compress - * multiple images at same param settings. - */ - if (cinfo->comp_info == NULL) - cinfo->comp_info = (jpeg_component_info *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - MAX_COMPONENTS * SIZEOF(jpeg_component_info)); - - /* Initialize everything not dependent on the color space */ - - cinfo->data_precision = BITS_IN_JSAMPLE; - /* Set up two quantization tables using default quality of 75 */ - jpeg_set_quality(cinfo, 75, TRUE); - /* Set up two Huffman tables */ - std_huff_tables(cinfo); - - /* Initialize default arithmetic coding conditioning */ - for (i = 0; i < NUM_ARITH_TBLS; i++) { - cinfo->arith_dc_L[i] = 0; - cinfo->arith_dc_U[i] = 1; - cinfo->arith_ac_K[i] = 5; - } - - /* Default is no multiple-scan output */ - cinfo->scan_info = NULL; - cinfo->num_scans = 0; - - /* Expect normal source image, not raw downsampled data */ - cinfo->raw_data_in = FALSE; - - /* Use Huffman coding, not arithmetic coding, by default */ - cinfo->arith_code = FALSE; - - /* By default, don't do extra passes to optimize entropy coding */ - cinfo->optimize_coding = FALSE; - /* The standard Huffman tables are only valid for 8-bit data precision. - * If the precision is higher, force optimization on so that usable - * tables will be computed. This test can be removed if default tables - * are supplied that are valid for the desired precision. - */ - if (cinfo->data_precision > 8) - cinfo->optimize_coding = TRUE; - - /* By default, use the simpler non-cosited sampling alignment */ - cinfo->CCIR601_sampling = FALSE; - - /* No input smoothing */ - cinfo->smoothing_factor = 0; - - /* DCT algorithm preference */ - cinfo->dct_method = JDCT_DEFAULT; - - /* No restart markers */ - cinfo->restart_interval = 0; - cinfo->restart_in_rows = 0; - - /* Fill in default JFIF marker parameters. Note that whether the marker - * will actually be written is determined by jpeg_set_colorspace. - * - * By default, the library emits JFIF version code 1.01. - * An application that wants to emit JFIF 1.02 extension markers should set - * JFIF_minor_version to 2. We could probably get away with just defaulting - * to 1.02, but there may still be some decoders in use that will complain - * about that; saying 1.01 should minimize compatibility problems. - */ - cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */ - cinfo->JFIF_minor_version = 1; - cinfo->density_unit = 0; /* Pixel size is unknown by default */ - cinfo->X_density = 1; /* Pixel aspect ratio is square by default */ - cinfo->Y_density = 1; - - /* Choose JPEG colorspace based on input space, set defaults accordingly */ - - jpeg_default_colorspace(cinfo); -} - - -/* - * Select an appropriate JPEG colorspace for in_color_space. - */ - -GLOBAL(void) -jpeg_default_colorspace (j_compress_ptr cinfo) -{ - switch (cinfo->in_color_space) { - case JCS_GRAYSCALE: - jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); - break; - case JCS_RGB: - jpeg_set_colorspace(cinfo, JCS_YCbCr); - break; - case JCS_YCbCr: - jpeg_set_colorspace(cinfo, JCS_YCbCr); - break; - case JCS_CMYK: - jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */ - break; - case JCS_YCCK: - jpeg_set_colorspace(cinfo, JCS_YCCK); - break; - case JCS_UNKNOWN: - jpeg_set_colorspace(cinfo, JCS_UNKNOWN); - break; - default: - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - } -} - - -/* - * Set the JPEG colorspace, and choose colorspace-dependent default values. - */ - -GLOBAL(void) -jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) -{ - jpeg_component_info * compptr; - int ci; - -#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \ - (compptr = &cinfo->comp_info[index], \ - compptr->component_id = (id), \ - compptr->h_samp_factor = (hsamp), \ - compptr->v_samp_factor = (vsamp), \ - compptr->quant_tbl_no = (quant), \ - compptr->dc_tbl_no = (dctbl), \ - compptr->ac_tbl_no = (actbl) ) - - /* Safety check to ensure start_compress not called yet. */ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - /* For all colorspaces, we use Q and Huff tables 0 for luminance components, - * tables 1 for chrominance components. - */ - - cinfo->jpeg_color_space = colorspace; - - cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */ - cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */ - - switch (colorspace) { - case JCS_GRAYSCALE: - cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ - cinfo->num_components = 1; - /* JFIF specifies component ID 1 */ - SET_COMP(0, 1, 1,1, 0, 0,0); - break; - case JCS_RGB: - cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */ - cinfo->num_components = 3; - SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0); - SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0); - SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0); - break; - case JCS_YCbCr: - cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ - cinfo->num_components = 3; - /* JFIF specifies component IDs 1,2,3 */ - /* We default to 2x2 subsamples of chrominance */ - SET_COMP(0, 1, 2,2, 0, 0,0); - SET_COMP(1, 2, 1,1, 1, 1,1); - SET_COMP(2, 3, 1,1, 1, 1,1); - break; - case JCS_CMYK: - cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */ - cinfo->num_components = 4; - SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0); - SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0); - SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0); - SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0); - break; - case JCS_YCCK: - cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */ - cinfo->num_components = 4; - SET_COMP(0, 1, 2,2, 0, 0,0); - SET_COMP(1, 2, 1,1, 1, 1,1); - SET_COMP(2, 3, 1,1, 1, 1,1); - SET_COMP(3, 4, 2,2, 0, 0,0); - break; - case JCS_UNKNOWN: - cinfo->num_components = cinfo->input_components; - if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, - MAX_COMPONENTS); - for (ci = 0; ci < cinfo->num_components; ci++) { - SET_COMP(ci, ci, 1,1, 0, 0,0); - } - break; - default: - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - } -} - - -#ifdef C_PROGRESSIVE_SUPPORTED - -LOCAL(jpeg_scan_info *) -fill_a_scan (jpeg_scan_info * scanptr, int ci, - int Ss, int Se, int Ah, int Al) -/* Support routine: generate one scan for specified component */ -{ - scanptr->comps_in_scan = 1; - scanptr->component_index[0] = ci; - scanptr->Ss = Ss; - scanptr->Se = Se; - scanptr->Ah = Ah; - scanptr->Al = Al; - scanptr++; - return scanptr; -} - -LOCAL(jpeg_scan_info *) -fill_scans (jpeg_scan_info * scanptr, int ncomps, - int Ss, int Se, int Ah, int Al) -/* Support routine: generate one scan for each component */ -{ - int ci; - - for (ci = 0; ci < ncomps; ci++) { - scanptr->comps_in_scan = 1; - scanptr->component_index[0] = ci; - scanptr->Ss = Ss; - scanptr->Se = Se; - scanptr->Ah = Ah; - scanptr->Al = Al; - scanptr++; - } - return scanptr; -} - -LOCAL(jpeg_scan_info *) -fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al) -/* Support routine: generate interleaved DC scan if possible, else N scans */ -{ - int ci; - - if (ncomps <= MAX_COMPS_IN_SCAN) { - /* Single interleaved DC scan */ - scanptr->comps_in_scan = ncomps; - for (ci = 0; ci < ncomps; ci++) - scanptr->component_index[ci] = ci; - scanptr->Ss = scanptr->Se = 0; - scanptr->Ah = Ah; - scanptr->Al = Al; - scanptr++; - } else { - /* Noninterleaved DC scan for each component */ - scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al); - } - return scanptr; -} - - -/* - * Create a recommended progressive-JPEG script. - * cinfo->num_components and cinfo->jpeg_color_space must be correct. - */ - -GLOBAL(void) -jpeg_simple_progression (j_compress_ptr cinfo) -{ - int ncomps = cinfo->num_components; - int nscans; - jpeg_scan_info * scanptr; - - /* Safety check to ensure start_compress not called yet. */ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - /* Figure space needed for script. Calculation must match code below! */ - if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { - /* Custom script for YCbCr color images. */ - nscans = 10; - } else { - /* All-purpose script for other color spaces. */ - if (ncomps > MAX_COMPS_IN_SCAN) - nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */ - else - nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */ - } - - /* Allocate space for script. - * We need to put it in the permanent pool in case the application performs - * multiple compressions without changing the settings. To avoid a memory - * leak if jpeg_simple_progression is called repeatedly for the same JPEG - * object, we try to re-use previously allocated space, and we allocate - * enough space to handle YCbCr even if initially asked for grayscale. - */ - if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) { - cinfo->script_space_size = MAX(nscans, 10); - cinfo->script_space = (jpeg_scan_info *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - cinfo->script_space_size * SIZEOF(jpeg_scan_info)); - } - scanptr = cinfo->script_space; - cinfo->scan_info = scanptr; - cinfo->num_scans = nscans; - - if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { - /* Custom script for YCbCr color images. */ - /* Initial DC scan */ - scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); - /* Initial AC scan: get some luma data out in a hurry */ - scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2); - /* Chroma data is too small to be worth expending many scans on */ - scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1); - scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1); - /* Complete spectral selection for luma AC */ - scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2); - /* Refine next bit of luma AC */ - scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1); - /* Finish DC successive approximation */ - scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); - /* Finish AC successive approximation */ - scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0); - scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0); - /* Luma bottom bit comes last since it's usually largest scan */ - scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0); - } else { - /* All-purpose script for other color spaces. */ - /* Successive approximation first pass */ - scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); - scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2); - scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2); - /* Successive approximation second pass */ - scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1); - /* Successive approximation final pass */ - scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); - scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0); - } -} - -#endif /* C_PROGRESSIVE_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jcphuff.c b/src/SFML/Graphics/libjpeg/jcphuff.c deleted file mode 100644 index a4ee850e..00000000 --- a/src/SFML/Graphics/libjpeg/jcphuff.c +++ /dev/null @@ -1,833 +0,0 @@ -/* - * jcphuff.c - * - * Copyright (C) 1995-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy encoding routines for progressive JPEG. - * - * We do not support output suspension in this module, since the library - * currently does not allow multiple-scan files to be written with output - * suspension. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jchuff.h" /* Declarations shared with jchuff.c */ - -#ifdef C_PROGRESSIVE_SUPPORTED - -/* Expanded entropy encoder object for progressive Huffman encoding. */ - -typedef struct { - struct jpeg_entropy_encoder pub; /* public fields */ - - /* Mode flag: TRUE for optimization, FALSE for actual data output */ - boolean gather_statistics; - - /* Bit-level coding status. - * next_output_byte/free_in_buffer are local copies of cinfo->dest fields. - */ - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - INT32 put_buffer; /* current bit-accumulation buffer */ - int put_bits; /* # of bits now in it */ - j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ - - /* Coding status for DC components */ - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ - - /* Coding status for AC components */ - int ac_tbl_no; /* the table number of the single component */ - unsigned int EOBRUN; /* run length of EOBs */ - unsigned int BE; /* # of buffered correction bits before MCU */ - char * bit_buffer; /* buffer for correction bits (1 per char) */ - /* packing correction bits tightly would save some space but cost time... */ - - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - int next_restart_num; /* next restart number to write (0-7) */ - - /* Pointers to derived tables (these workspaces have image lifespan). - * Since any one scan codes only DC or only AC, we only need one set - * of tables, not one for DC and one for AC. - */ - c_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; - - /* Statistics tables for optimization; again, one set is enough */ - long * count_ptrs[NUM_HUFF_TBLS]; -} phuff_entropy_encoder; - -typedef phuff_entropy_encoder * phuff_entropy_ptr; - -/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit - * buffer can hold. Larger sizes may slightly improve compression, but - * 1000 is already well into the realm of overkill. - * The minimum safe size is 64 bits. - */ - -#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ - -/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. - * We assume that int right shift is unsigned if INT32 right shift is, - * which should be safe. - */ - -#ifdef RIGHT_SHIFT_IS_UNSIGNED -#define ISHIFT_TEMPS int ishift_temp; -#define IRIGHT_SHIFT(x,shft) \ - ((ishift_temp = (x)) < 0 ? \ - (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ - (ishift_temp >> (shft))) -#else -#define ISHIFT_TEMPS -#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) -#endif - -/* Forward declarations */ -METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo)); -METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo)); - - -/* - * Initialize for a Huffman-compressed scan using progressive JPEG. - */ - -METHODDEF(void) -start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - boolean is_DC_band; - int ci, tbl; - jpeg_component_info * compptr; - - entropy->cinfo = cinfo; - entropy->gather_statistics = gather_statistics; - - is_DC_band = (cinfo->Ss == 0); - - /* We assume jcmaster.c already validated the scan parameters. */ - - /* Select execution routines */ - if (cinfo->Ah == 0) { - if (is_DC_band) - entropy->pub.encode_mcu = encode_mcu_DC_first; - else - entropy->pub.encode_mcu = encode_mcu_AC_first; - } else { - if (is_DC_band) - entropy->pub.encode_mcu = encode_mcu_DC_refine; - else { - entropy->pub.encode_mcu = encode_mcu_AC_refine; - /* AC refinement needs a correction bit buffer */ - if (entropy->bit_buffer == NULL) - entropy->bit_buffer = (char *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - MAX_CORR_BITS * SIZEOF(char)); - } - } - if (gather_statistics) - entropy->pub.finish_pass = finish_pass_gather_phuff; - else - entropy->pub.finish_pass = finish_pass_phuff; - - /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1 - * for AC coefficients. - */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Initialize DC predictions to 0 */ - entropy->last_dc_val[ci] = 0; - /* Get table index */ - if (is_DC_band) { - if (cinfo->Ah != 0) /* DC refinement needs no table */ - continue; - tbl = compptr->dc_tbl_no; - } else { - entropy->ac_tbl_no = tbl = compptr->ac_tbl_no; - } - if (gather_statistics) { - /* Check for invalid table index */ - /* (make_c_derived_tbl does this in the other path) */ - if (tbl < 0 || tbl >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); - /* Allocate and zero the statistics tables */ - /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ - if (entropy->count_ptrs[tbl] == NULL) - entropy->count_ptrs[tbl] = (long *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 257 * SIZEOF(long)); - MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long)); - } else { - /* Compute derived values for Huffman table */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl, - & entropy->derived_tbls[tbl]); - } - } - - /* Initialize AC stuff */ - entropy->EOBRUN = 0; - entropy->BE = 0; - - /* Initialize bit buffer to empty */ - entropy->put_buffer = 0; - entropy->put_bits = 0; - - /* Initialize restart stuff */ - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num = 0; -} - - -/* Outputting bytes to the file. - * NB: these must be called only when actually outputting, - * that is, entropy->gather_statistics == FALSE. - */ - -/* Emit a byte */ -#define emit_byte(entropy,val) \ - { *(entropy)->next_output_byte++ = (JOCTET) (val); \ - if (--(entropy)->free_in_buffer == 0) \ - dump_buffer(entropy); } - - -LOCAL(void) -dump_buffer (phuff_entropy_ptr entropy) -/* Empty the output buffer; we do not support suspension in this module. */ -{ - struct jpeg_destination_mgr * dest = entropy->cinfo->dest; - - if (! (*dest->empty_output_buffer) (entropy->cinfo)) - ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND); - /* After a successful buffer dump, must reset buffer pointers */ - entropy->next_output_byte = dest->next_output_byte; - entropy->free_in_buffer = dest->free_in_buffer; -} - - -/* Outputting bits to the file */ - -/* Only the right 24 bits of put_buffer are used; the valid bits are - * left-justified in this part. At most 16 bits can be passed to emit_bits - * in one call, and we never retain more than 7 bits in put_buffer - * between calls, so 24 bits are sufficient. - */ - -INLINE -LOCAL(void) -emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size) -/* Emit some bits, unless we are in gather mode */ -{ - /* This routine is heavily used, so it's worth coding tightly. */ - register INT32 put_buffer = (INT32) code; - register int put_bits = entropy->put_bits; - - /* if size is 0, caller used an invalid Huffman table entry */ - if (size == 0) - ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); - - if (entropy->gather_statistics) - return; /* do nothing if we're only getting stats */ - - put_buffer &= (((INT32) 1)<put_buffer; /* and merge with old buffer contents */ - - while (put_bits >= 8) { - int c = (int) ((put_buffer >> 16) & 0xFF); - - emit_byte(entropy, c); - if (c == 0xFF) { /* need to stuff a zero byte? */ - emit_byte(entropy, 0); - } - put_buffer <<= 8; - put_bits -= 8; - } - - entropy->put_buffer = put_buffer; /* update variables */ - entropy->put_bits = put_bits; -} - - -LOCAL(void) -flush_bits (phuff_entropy_ptr entropy) -{ - emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */ - entropy->put_buffer = 0; /* and reset bit-buffer to empty */ - entropy->put_bits = 0; -} - - -/* - * Emit (or just count) a Huffman symbol. - */ - -INLINE -LOCAL(void) -emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol) -{ - if (entropy->gather_statistics) - entropy->count_ptrs[tbl_no][symbol]++; - else { - c_derived_tbl * tbl = entropy->derived_tbls[tbl_no]; - emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); - } -} - - -/* - * Emit bits from a correction bit buffer. - */ - -LOCAL(void) -emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart, - unsigned int nbits) -{ - if (entropy->gather_statistics) - return; /* no real work */ - - while (nbits > 0) { - emit_bits(entropy, (unsigned int) (*bufstart), 1); - bufstart++; - nbits--; - } -} - - -/* - * Emit any pending EOBRUN symbol. - */ - -LOCAL(void) -emit_eobrun (phuff_entropy_ptr entropy) -{ - register int temp, nbits; - - if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ - temp = entropy->EOBRUN; - nbits = 0; - while ((temp >>= 1)) - nbits++; - /* safety check: shouldn't happen given limited correction-bit buffer */ - if (nbits > 14) - ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); - - emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4); - if (nbits) - emit_bits(entropy, entropy->EOBRUN, nbits); - - entropy->EOBRUN = 0; - - /* Emit any buffered correction bits */ - emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE); - entropy->BE = 0; - } -} - - -/* - * Emit a restart marker & resynchronize predictions. - */ - -LOCAL(void) -emit_restart (phuff_entropy_ptr entropy, int restart_num) -{ - int ci; - - emit_eobrun(entropy); - - if (! entropy->gather_statistics) { - flush_bits(entropy); - emit_byte(entropy, 0xFF); - emit_byte(entropy, JPEG_RST0 + restart_num); - } - - if (entropy->cinfo->Ss == 0) { - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++) - entropy->last_dc_val[ci] = 0; - } else { - /* Re-initialize all AC-related fields to 0 */ - entropy->EOBRUN = 0; - entropy->BE = 0; - } -} - - -/* - * MCU encoding for DC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - register int temp, temp2; - register int nbits; - int blkn, ci; - int Al = cinfo->Al; - JBLOCKROW block; - jpeg_component_info * compptr; - ISHIFT_TEMPS - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart(entropy, entropy->next_restart_num); - - /* Encode the MCU data blocks */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - - /* Compute the DC value after the required point transform by Al. - * This is simply an arithmetic right shift. - */ - temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al); - - /* DC differences are figured on the point-transformed values. */ - temp = temp2 - entropy->last_dc_val[ci]; - entropy->last_dc_val[ci] = temp2; - - /* Encode the DC coefficient difference per section G.1.2.1 */ - temp2 = temp; - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - /* For a negative input, want temp2 = bitwise complement of abs(input) */ - /* This code assumes we are on a two's complement machine */ - temp2--; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 0; - while (temp) { - nbits++; - temp >>= 1; - } - /* Check for out-of-range coefficient values. - * Since we're encoding a difference, the range limit is twice as much. - */ - if (nbits > MAX_COEF_BITS+1) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count/emit the Huffman-coded symbol for the number of bits */ - emit_symbol(entropy, compptr->dc_tbl_no, nbits); - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - if (nbits) /* emit_bits rejects calls with size 0 */ - emit_bits(entropy, (unsigned int) temp2, nbits); - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * MCU encoding for AC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - register int temp, temp2; - register int nbits; - register int r, k; - int Se = cinfo->Se; - int Al = cinfo->Al; - JBLOCKROW block; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart(entropy, entropy->next_restart_num); - - /* Encode the MCU data block */ - block = MCU_data[0]; - - /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ - - r = 0; /* r = run length of zeros */ - - for (k = cinfo->Ss; k <= Se; k++) { - if ((temp = (*block)[jpeg_natural_order[k]]) == 0) { - r++; - continue; - } - /* We must apply the point transform by Al. For AC coefficients this - * is an integer division with rounding towards 0. To do this portably - * in C, we shift after obtaining the absolute value; so the code is - * interwoven with finding the abs value (temp) and output bits (temp2). - */ - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - temp >>= Al; /* apply the point transform */ - /* For a negative coef, want temp2 = bitwise complement of abs(coef) */ - temp2 = ~temp; - } else { - temp >>= Al; /* apply the point transform */ - temp2 = temp; - } - /* Watch out for case that nonzero coef is zero after point transform */ - if (temp == 0) { - r++; - continue; - } - - /* Emit any pending EOBRUN */ - if (entropy->EOBRUN > 0) - emit_eobrun(entropy); - /* if run length > 15, must emit special run-length-16 codes (0xF0) */ - while (r > 15) { - emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); - r -= 16; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 1; /* there must be at least one 1 bit */ - while ((temp >>= 1)) - nbits++; - /* Check for out-of-range coefficient values */ - if (nbits > MAX_COEF_BITS) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count/emit Huffman symbol for run length / number of bits */ - emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits); - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - emit_bits(entropy, (unsigned int) temp2, nbits); - - r = 0; /* reset zero run length */ - } - - if (r > 0) { /* If there are trailing zeroes, */ - entropy->EOBRUN++; /* count an EOB */ - if (entropy->EOBRUN == 0x7FFF) - emit_eobrun(entropy); /* force it out to avoid overflow */ - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * MCU encoding for DC successive approximation refinement scan. - * Note: we assume such scans can be multi-component, although the spec - * is not very clear on the point. - */ - -METHODDEF(boolean) -encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - register int temp; - int blkn; - int Al = cinfo->Al; - JBLOCKROW block; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart(entropy, entropy->next_restart_num); - - /* Encode the MCU data blocks */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - - /* We simply emit the Al'th bit of the DC coefficient value. */ - temp = (*block)[0]; - emit_bits(entropy, (unsigned int) (temp >> Al), 1); - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * MCU encoding for AC successive approximation refinement scan. - */ - -METHODDEF(boolean) -encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - register int temp; - register int r, k; - int EOB; - char *BR_buffer; - unsigned int BR; - int Se = cinfo->Se; - int Al = cinfo->Al; - JBLOCKROW block; - int absvalues[DCTSIZE2]; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart(entropy, entropy->next_restart_num); - - /* Encode the MCU data block */ - block = MCU_data[0]; - - /* It is convenient to make a pre-pass to determine the transformed - * coefficients' absolute values and the EOB position. - */ - EOB = 0; - for (k = cinfo->Ss; k <= Se; k++) { - temp = (*block)[jpeg_natural_order[k]]; - /* We must apply the point transform by Al. For AC coefficients this - * is an integer division with rounding towards 0. To do this portably - * in C, we shift after obtaining the absolute value. - */ - if (temp < 0) - temp = -temp; /* temp is abs value of input */ - temp >>= Al; /* apply the point transform */ - absvalues[k] = temp; /* save abs value for main pass */ - if (temp == 1) - EOB = k; /* EOB = index of last newly-nonzero coef */ - } - - /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ - - r = 0; /* r = run length of zeros */ - BR = 0; /* BR = count of buffered bits added now */ - BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */ - - for (k = cinfo->Ss; k <= Se; k++) { - if ((temp = absvalues[k]) == 0) { - r++; - continue; - } - - /* Emit any required ZRLs, but not if they can be folded into EOB */ - while (r > 15 && k <= EOB) { - /* emit any pending EOBRUN and the BE correction bits */ - emit_eobrun(entropy); - /* Emit ZRL */ - emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); - r -= 16; - /* Emit buffered correction bits that must be associated with ZRL */ - emit_buffered_bits(entropy, BR_buffer, BR); - BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ - BR = 0; - } - - /* If the coef was previously nonzero, it only needs a correction bit. - * NOTE: a straight translation of the spec's figure G.7 would suggest - * that we also need to test r > 15. But if r > 15, we can only get here - * if k > EOB, which implies that this coefficient is not 1. - */ - if (temp > 1) { - /* The correction bit is the next bit of the absolute value. */ - BR_buffer[BR++] = (char) (temp & 1); - continue; - } - - /* Emit any pending EOBRUN and the BE correction bits */ - emit_eobrun(entropy); - - /* Count/emit Huffman symbol for run length / number of bits */ - emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); - - /* Emit output bit for newly-nonzero coef */ - temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1; - emit_bits(entropy, (unsigned int) temp, 1); - - /* Emit buffered correction bits that must be associated with this code */ - emit_buffered_bits(entropy, BR_buffer, BR); - BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ - BR = 0; - r = 0; /* reset zero run length */ - } - - if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ - entropy->EOBRUN++; /* count an EOB */ - entropy->BE += BR; /* concat my correction bits to older ones */ - /* We force out the EOB if we risk either: - * 1. overflow of the EOB counter; - * 2. overflow of the correction bit buffer during the next MCU. - */ - if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1)) - emit_eobrun(entropy); - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * Finish up at the end of a Huffman-compressed progressive scan. - */ - -METHODDEF(void) -finish_pass_phuff (j_compress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Flush out any buffered data */ - emit_eobrun(entropy); - flush_bits(entropy); - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; -} - - -/* - * Finish up a statistics-gathering pass and create the new Huffman tables. - */ - -METHODDEF(void) -finish_pass_gather_phuff (j_compress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - boolean is_DC_band; - int ci, tbl; - jpeg_component_info * compptr; - JHUFF_TBL **htblptr; - boolean did[NUM_HUFF_TBLS]; - - /* Flush out buffered data (all we care about is counting the EOB symbol) */ - emit_eobrun(entropy); - - is_DC_band = (cinfo->Ss == 0); - - /* It's important not to apply jpeg_gen_optimal_table more than once - * per table, because it clobbers the input frequency counts! - */ - MEMZERO(did, SIZEOF(did)); - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - if (is_DC_band) { - if (cinfo->Ah != 0) /* DC refinement needs no table */ - continue; - tbl = compptr->dc_tbl_no; - } else { - tbl = compptr->ac_tbl_no; - } - if (! did[tbl]) { - if (is_DC_band) - htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; - else - htblptr = & cinfo->ac_huff_tbl_ptrs[tbl]; - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]); - did[tbl] = TRUE; - } - } -} - - -/* - * Module initialization routine for progressive Huffman entropy encoding. - */ - -GLOBAL(void) -jinit_phuff_encoder (j_compress_ptr cinfo) -{ - phuff_entropy_ptr entropy; - int i; - - entropy = (phuff_entropy_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(phuff_entropy_encoder)); - cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; - entropy->pub.start_pass = start_pass_phuff; - - /* Mark tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->derived_tbls[i] = NULL; - entropy->count_ptrs[i] = NULL; - } - entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ -} - -#endif /* C_PROGRESSIVE_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jcprepct.c b/src/SFML/Graphics/libjpeg/jcprepct.c deleted file mode 100644 index fdc4bc2d..00000000 --- a/src/SFML/Graphics/libjpeg/jcprepct.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * jcprepct.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the compression preprocessing controller. - * This controller manages the color conversion, downsampling, - * and edge expansion steps. - * - * Most of the complexity here is associated with buffering input rows - * as required by the downsampler. See the comments at the head of - * jcsample.c for the downsampler's needs. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* At present, jcsample.c can request context rows only for smoothing. - * In the future, we might also need context rows for CCIR601 sampling - * or other more-complex downsampling procedures. The code to support - * context rows should be compiled only if needed. - */ -#ifdef INPUT_SMOOTHING_SUPPORTED -#define CONTEXT_ROWS_SUPPORTED -#endif - - -/* - * For the simple (no-context-row) case, we just need to buffer one - * row group's worth of pixels for the downsampling step. At the bottom of - * the image, we pad to a full row group by replicating the last pixel row. - * The downsampler's last output row is then replicated if needed to pad - * out to a full iMCU row. - * - * When providing context rows, we must buffer three row groups' worth of - * pixels. Three row groups are physically allocated, but the row pointer - * arrays are made five row groups high, with the extra pointers above and - * below "wrapping around" to point to the last and first real row groups. - * This allows the downsampler to access the proper context rows. - * At the top and bottom of the image, we create dummy context rows by - * copying the first or last real pixel row. This copying could be avoided - * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the - * trouble on the compression side. - */ - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_c_prep_controller pub; /* public fields */ - - /* Downsampling input buffer. This buffer holds color-converted data - * until we have enough to do a downsample step. - */ - JSAMPARRAY color_buf[MAX_COMPONENTS]; - - JDIMENSION rows_to_go; /* counts rows remaining in source image */ - int next_buf_row; /* index of next row to store in color_buf */ - -#ifdef CONTEXT_ROWS_SUPPORTED /* only needed for context case */ - int this_row_group; /* starting row index of group to process */ - int next_buf_stop; /* downsample when we reach this index */ -#endif -} my_prep_controller; - -typedef my_prep_controller * my_prep_ptr; - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_prep_ptr prep = (my_prep_ptr) cinfo->prep; - - if (pass_mode != JBUF_PASS_THRU) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - - /* Initialize total-height counter for detecting bottom of image */ - prep->rows_to_go = cinfo->image_height; - /* Mark the conversion buffer empty */ - prep->next_buf_row = 0; -#ifdef CONTEXT_ROWS_SUPPORTED - /* Preset additional state variables for context mode. - * These aren't used in non-context mode, so we needn't test which mode. - */ - prep->this_row_group = 0; - /* Set next_buf_stop to stop after two row groups have been read in. */ - prep->next_buf_stop = 2 * cinfo->max_v_samp_factor; -#endif -} - - -/* - * Expand an image vertically from height input_rows to height output_rows, - * by duplicating the bottom row. - */ - -LOCAL(void) -expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols, - int input_rows, int output_rows) -{ - register int row; - - for (row = input_rows; row < output_rows; row++) { - jcopy_sample_rows(image_data, input_rows-1, image_data, row, - 1, num_cols); - } -} - - -/* - * Process some data in the simple no-context case. - * - * Preprocessor output data is counted in "row groups". A row group - * is defined to be v_samp_factor sample rows of each component. - * Downsampling will produce this much data from each max_v_samp_factor - * input rows. - */ - -METHODDEF(void) -pre_process_data (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail, - JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, - JDIMENSION out_row_groups_avail) -{ - my_prep_ptr prep = (my_prep_ptr) cinfo->prep; - int numrows, ci; - JDIMENSION inrows; - jpeg_component_info * compptr; - - while (*in_row_ctr < in_rows_avail && - *out_row_group_ctr < out_row_groups_avail) { - /* Do color conversion to fill the conversion buffer. */ - inrows = in_rows_avail - *in_row_ctr; - numrows = cinfo->max_v_samp_factor - prep->next_buf_row; - numrows = (int) MIN((JDIMENSION) numrows, inrows); - (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, - prep->color_buf, - (JDIMENSION) prep->next_buf_row, - numrows); - *in_row_ctr += numrows; - prep->next_buf_row += numrows; - prep->rows_to_go -= numrows; - /* If at bottom of image, pad to fill the conversion buffer. */ - if (prep->rows_to_go == 0 && - prep->next_buf_row < cinfo->max_v_samp_factor) { - for (ci = 0; ci < cinfo->num_components; ci++) { - expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, - prep->next_buf_row, cinfo->max_v_samp_factor); - } - prep->next_buf_row = cinfo->max_v_samp_factor; - } - /* If we've filled the conversion buffer, empty it. */ - if (prep->next_buf_row == cinfo->max_v_samp_factor) { - (*cinfo->downsample->downsample) (cinfo, - prep->color_buf, (JDIMENSION) 0, - output_buf, *out_row_group_ctr); - prep->next_buf_row = 0; - (*out_row_group_ctr)++; - } - /* If at bottom of image, pad the output to a full iMCU height. - * Note we assume the caller is providing a one-iMCU-height output buffer! - */ - if (prep->rows_to_go == 0 && - *out_row_group_ctr < out_row_groups_avail) { - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - expand_bottom_edge(output_buf[ci], - compptr->width_in_blocks * DCTSIZE, - (int) (*out_row_group_ctr * compptr->v_samp_factor), - (int) (out_row_groups_avail * compptr->v_samp_factor)); - } - *out_row_group_ctr = out_row_groups_avail; - break; /* can exit outer loop without test */ - } - } -} - - -#ifdef CONTEXT_ROWS_SUPPORTED - -/* - * Process some data in the context case. - */ - -METHODDEF(void) -pre_process_context (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail, - JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, - JDIMENSION out_row_groups_avail) -{ - my_prep_ptr prep = (my_prep_ptr) cinfo->prep; - int numrows, ci; - int buf_height = cinfo->max_v_samp_factor * 3; - JDIMENSION inrows; - - while (*out_row_group_ctr < out_row_groups_avail) { - if (*in_row_ctr < in_rows_avail) { - /* Do color conversion to fill the conversion buffer. */ - inrows = in_rows_avail - *in_row_ctr; - numrows = prep->next_buf_stop - prep->next_buf_row; - numrows = (int) MIN((JDIMENSION) numrows, inrows); - (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, - prep->color_buf, - (JDIMENSION) prep->next_buf_row, - numrows); - /* Pad at top of image, if first time through */ - if (prep->rows_to_go == cinfo->image_height) { - for (ci = 0; ci < cinfo->num_components; ci++) { - int row; - for (row = 1; row <= cinfo->max_v_samp_factor; row++) { - jcopy_sample_rows(prep->color_buf[ci], 0, - prep->color_buf[ci], -row, - 1, cinfo->image_width); - } - } - } - *in_row_ctr += numrows; - prep->next_buf_row += numrows; - prep->rows_to_go -= numrows; - } else { - /* Return for more data, unless we are at the bottom of the image. */ - if (prep->rows_to_go != 0) - break; - /* When at bottom of image, pad to fill the conversion buffer. */ - if (prep->next_buf_row < prep->next_buf_stop) { - for (ci = 0; ci < cinfo->num_components; ci++) { - expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, - prep->next_buf_row, prep->next_buf_stop); - } - prep->next_buf_row = prep->next_buf_stop; - } - } - /* If we've gotten enough data, downsample a row group. */ - if (prep->next_buf_row == prep->next_buf_stop) { - (*cinfo->downsample->downsample) (cinfo, - prep->color_buf, - (JDIMENSION) prep->this_row_group, - output_buf, *out_row_group_ctr); - (*out_row_group_ctr)++; - /* Advance pointers with wraparound as necessary. */ - prep->this_row_group += cinfo->max_v_samp_factor; - if (prep->this_row_group >= buf_height) - prep->this_row_group = 0; - if (prep->next_buf_row >= buf_height) - prep->next_buf_row = 0; - prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor; - } - } -} - - -/* - * Create the wrapped-around downsampling input buffer needed for context mode. - */ - -LOCAL(void) -create_context_buffer (j_compress_ptr cinfo) -{ - my_prep_ptr prep = (my_prep_ptr) cinfo->prep; - int rgroup_height = cinfo->max_v_samp_factor; - int ci, i; - jpeg_component_info * compptr; - JSAMPARRAY true_buffer, fake_buffer; - - /* Grab enough space for fake row pointers for all the components; - * we need five row groups' worth of pointers for each component. - */ - fake_buffer = (JSAMPARRAY) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (cinfo->num_components * 5 * rgroup_height) * - SIZEOF(JSAMPROW)); - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Allocate the actual buffer space (3 row groups) for this component. - * We make the buffer wide enough to allow the downsampler to edge-expand - * horizontally within the buffer, if it so chooses. - */ - true_buffer = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE * - cinfo->max_h_samp_factor) / compptr->h_samp_factor), - (JDIMENSION) (3 * rgroup_height)); - /* Copy true buffer row pointers into the middle of the fake row array */ - MEMCOPY(fake_buffer + rgroup_height, true_buffer, - 3 * rgroup_height * SIZEOF(JSAMPROW)); - /* Fill in the above and below wraparound pointers */ - for (i = 0; i < rgroup_height; i++) { - fake_buffer[i] = true_buffer[2 * rgroup_height + i]; - fake_buffer[4 * rgroup_height + i] = true_buffer[i]; - } - prep->color_buf[ci] = fake_buffer + rgroup_height; - fake_buffer += 5 * rgroup_height; /* point to space for next component */ - } -} - -#endif /* CONTEXT_ROWS_SUPPORTED */ - - -/* - * Initialize preprocessing controller. - */ - -GLOBAL(void) -jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer) -{ - my_prep_ptr prep; - int ci; - jpeg_component_info * compptr; - - if (need_full_buffer) /* safety check */ - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - - prep = (my_prep_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_prep_controller)); - cinfo->prep = (struct jpeg_c_prep_controller *) prep; - prep->pub.start_pass = start_pass_prep; - - /* Allocate the color conversion buffer. - * We make the buffer wide enough to allow the downsampler to edge-expand - * horizontally within the buffer, if it so chooses. - */ - if (cinfo->downsample->need_context_rows) { - /* Set up to provide context rows */ -#ifdef CONTEXT_ROWS_SUPPORTED - prep->pub.pre_process_data = pre_process_context; - create_context_buffer(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - /* No context, just make it tall enough for one row group */ - prep->pub.pre_process_data = pre_process_data; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - prep->color_buf[ci] = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE * - cinfo->max_h_samp_factor) / compptr->h_samp_factor), - (JDIMENSION) cinfo->max_v_samp_factor); - } - } -} diff --git a/src/SFML/Graphics/libjpeg/jcsample.c b/src/SFML/Graphics/libjpeg/jcsample.c deleted file mode 100644 index fe29fcab..00000000 --- a/src/SFML/Graphics/libjpeg/jcsample.c +++ /dev/null @@ -1,519 +0,0 @@ -/* - * jcsample.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains downsampling routines. - * - * Downsampling input data is counted in "row groups". A row group - * is defined to be max_v_samp_factor pixel rows of each component, - * from which the downsampler produces v_samp_factor sample rows. - * A single row group is processed in each call to the downsampler module. - * - * The downsampler is responsible for edge-expansion of its output data - * to fill an integral number of DCT blocks horizontally. The source buffer - * may be modified if it is helpful for this purpose (the source buffer is - * allocated wide enough to correspond to the desired output width). - * The caller (the prep controller) is responsible for vertical padding. - * - * The downsampler may request "context rows" by setting need_context_rows - * during startup. In this case, the input arrays will contain at least - * one row group's worth of pixels above and below the passed-in data; - * the caller will create dummy rows at image top and bottom by replicating - * the first or last real pixel row. - * - * An excellent reference for image resampling is - * Digital Image Warping, George Wolberg, 1990. - * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. - * - * The downsampling algorithm used here is a simple average of the source - * pixels covered by the output pixel. The hi-falutin sampling literature - * refers to this as a "box filter". In general the characteristics of a box - * filter are not very good, but for the specific cases we normally use (1:1 - * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not - * nearly so bad. If you intend to use other sampling ratios, you'd be well - * advised to improve this code. - * - * A simple input-smoothing capability is provided. This is mainly intended - * for cleaning up color-dithered GIF input files (if you find it inadequate, - * we suggest using an external filtering program such as pnmconvol). When - * enabled, each input pixel P is replaced by a weighted sum of itself and its - * eight neighbors. P's weight is 1-8*SF and each neighbor's weight is SF, - * where SF = (smoothing_factor / 1024). - * Currently, smoothing is only supported for 2h2v sampling factors. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Pointer to routine to downsample a single component */ -typedef JMETHOD(void, downsample1_ptr, - (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data)); - -/* Private subobject */ - -typedef struct { - struct jpeg_downsampler pub; /* public fields */ - - /* Downsampling method pointers, one per component */ - downsample1_ptr methods[MAX_COMPONENTS]; -} my_downsampler; - -typedef my_downsampler * my_downsample_ptr; - - -/* - * Initialize for a downsampling pass. - */ - -METHODDEF(void) -start_pass_downsample (j_compress_ptr cinfo) -{ - /* no work for now */ -} - - -/* - * Expand a component horizontally from width input_cols to width output_cols, - * by duplicating the rightmost samples. - */ - -LOCAL(void) -expand_right_edge (JSAMPARRAY image_data, int num_rows, - JDIMENSION input_cols, JDIMENSION output_cols) -{ - register JSAMPROW ptr; - register JSAMPLE pixval; - register int count; - int row; - int numcols = (int) (output_cols - input_cols); - - if (numcols > 0) { - for (row = 0; row < num_rows; row++) { - ptr = image_data[row] + input_cols; - pixval = ptr[-1]; /* don't need GETJSAMPLE() here */ - for (count = numcols; count > 0; count--) - *ptr++ = pixval; - } - } -} - - -/* - * Do downsampling for a whole row group (all components). - * - * In this version we simply downsample each component independently. - */ - -METHODDEF(void) -sep_downsample (j_compress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_index, - JSAMPIMAGE output_buf, JDIMENSION out_row_group_index) -{ - my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample; - int ci; - jpeg_component_info * compptr; - JSAMPARRAY in_ptr, out_ptr; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - in_ptr = input_buf[ci] + in_row_index; - out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor); - (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr); - } -} - - -/* - * Downsample pixel values of a single component. - * One row group is processed per call. - * This version handles arbitrary integral sampling ratios, without smoothing. - * Note that this version is not actually used for customary sampling ratios. - */ - -METHODDEF(void) -int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v; - JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */ - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - JSAMPROW inptr, outptr; - INT32 outvalue; - - h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor; - v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor; - numpix = h_expand * v_expand; - numpix2 = numpix/2; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data, cinfo->max_v_samp_factor, - cinfo->image_width, output_cols * h_expand); - - inrow = 0; - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - for (outcol = 0, outcol_h = 0; outcol < output_cols; - outcol++, outcol_h += h_expand) { - outvalue = 0; - for (v = 0; v < v_expand; v++) { - inptr = input_data[inrow+v] + outcol_h; - for (h = 0; h < h_expand; h++) { - outvalue += (INT32) GETJSAMPLE(*inptr++); - } - } - *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix); - } - inrow += v_expand; - } -} - - -/* - * Downsample pixel values of a single component. - * This version handles the special case of a full-size component, - * without smoothing. - */ - -METHODDEF(void) -fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - /* Copy the data */ - jcopy_sample_rows(input_data, 0, output_data, 0, - cinfo->max_v_samp_factor, cinfo->image_width); - /* Edge-expand */ - expand_right_edge(output_data, cinfo->max_v_samp_factor, - cinfo->image_width, compptr->width_in_blocks * DCTSIZE); -} - - -/* - * Downsample pixel values of a single component. - * This version handles the common case of 2:1 horizontal and 1:1 vertical, - * without smoothing. - * - * A note about the "bias" calculations: when rounding fractional values to - * integer, we do not want to always round 0.5 up to the next integer. - * If we did that, we'd introduce a noticeable bias towards larger values. - * Instead, this code is arranged so that 0.5 will be rounded up or down at - * alternate pixel locations (a simple ordered dither pattern). - */ - -METHODDEF(void) -h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int outrow; - JDIMENSION outcol; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - register JSAMPROW inptr, outptr; - register int bias; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data, cinfo->max_v_samp_factor, - cinfo->image_width, output_cols * 2); - - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr = input_data[outrow]; - bias = 0; /* bias = 0,1,0,1,... for successive samples */ - for (outcol = 0; outcol < output_cols; outcol++) { - *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) - + bias) >> 1); - bias ^= 1; /* 0=>1, 1=>0 */ - inptr += 2; - } - } -} - - -/* - * Downsample pixel values of a single component. - * This version handles the standard case of 2:1 horizontal and 2:1 vertical, - * without smoothing. - */ - -METHODDEF(void) -h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int inrow, outrow; - JDIMENSION outcol; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - register JSAMPROW inptr0, inptr1, outptr; - register int bias; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data, cinfo->max_v_samp_factor, - cinfo->image_width, output_cols * 2); - - inrow = 0; - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr0 = input_data[inrow]; - inptr1 = input_data[inrow+1]; - bias = 1; /* bias = 1,2,1,2,... for successive samples */ - for (outcol = 0; outcol < output_cols; outcol++) { - *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]) - + bias) >> 2); - bias ^= 3; /* 1=>2, 2=>1 */ - inptr0 += 2; inptr1 += 2; - } - inrow += 2; - } -} - - -#ifdef INPUT_SMOOTHING_SUPPORTED - -/* - * Downsample pixel values of a single component. - * This version handles the standard case of 2:1 horizontal and 2:1 vertical, - * with smoothing. One row of context is required. - */ - -METHODDEF(void) -h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int inrow, outrow; - JDIMENSION colctr; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr; - INT32 membersum, neighsum, memberscale, neighscale; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, - cinfo->image_width, output_cols * 2); - - /* We don't bother to form the individual "smoothed" input pixel values; - * we can directly compute the output which is the average of the four - * smoothed values. Each of the four member pixels contributes a fraction - * (1-8*SF) to its own smoothed image and a fraction SF to each of the three - * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final - * output. The four corner-adjacent neighbor pixels contribute a fraction - * SF to just one smoothed pixel, or SF/4 to the final output; while the - * eight edge-adjacent neighbors contribute SF to each of two smoothed - * pixels, or SF/2 overall. In order to use integer arithmetic, these - * factors are scaled by 2^16 = 65536. - * Also recall that SF = smoothing_factor / 1024. - */ - - memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */ - neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */ - - inrow = 0; - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr0 = input_data[inrow]; - inptr1 = input_data[inrow+1]; - above_ptr = input_data[inrow-1]; - below_ptr = input_data[inrow+2]; - - /* Special case for first column: pretend column -1 is same as column 0 */ - membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); - neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + - GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]); - neighsum += neighsum; - neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]); - membersum = membersum * memberscale + neighsum * neighscale; - *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); - inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; - - for (colctr = output_cols - 2; colctr > 0; colctr--) { - /* sum of pixels directly mapped to this output element */ - membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); - /* sum of edge-neighbor pixels */ - neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + - GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) + - GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]); - /* The edge-neighbors count twice as much as corner-neighbors */ - neighsum += neighsum; - /* Add in the corner-neighbors */ - neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) + - GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]); - /* form final output scaled up by 2^16 */ - membersum = membersum * memberscale + neighsum * neighscale; - /* round, descale and output it */ - *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); - inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; - } - - /* Special case for last column */ - membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); - neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + - GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]); - neighsum += neighsum; - neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]); - membersum = membersum * memberscale + neighsum * neighscale; - *outptr = (JSAMPLE) ((membersum + 32768) >> 16); - - inrow += 2; - } -} - - -/* - * Downsample pixel values of a single component. - * This version handles the special case of a full-size component, - * with smoothing. One row of context is required. - */ - -METHODDEF(void) -fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int outrow; - JDIMENSION colctr; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - register JSAMPROW inptr, above_ptr, below_ptr, outptr; - INT32 membersum, neighsum, memberscale, neighscale; - int colsum, lastcolsum, nextcolsum; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, - cinfo->image_width, output_cols); - - /* Each of the eight neighbor pixels contributes a fraction SF to the - * smoothed pixel, while the main pixel contributes (1-8*SF). In order - * to use integer arithmetic, these factors are multiplied by 2^16 = 65536. - * Also recall that SF = smoothing_factor / 1024. - */ - - memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */ - neighscale = cinfo->smoothing_factor * 64; /* scaled SF */ - - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr = input_data[outrow]; - above_ptr = input_data[outrow-1]; - below_ptr = input_data[outrow+1]; - - /* Special case for first column */ - colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) + - GETJSAMPLE(*inptr); - membersum = GETJSAMPLE(*inptr++); - nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + - GETJSAMPLE(*inptr); - neighsum = colsum + (colsum - membersum) + nextcolsum; - membersum = membersum * memberscale + neighsum * neighscale; - *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); - lastcolsum = colsum; colsum = nextcolsum; - - for (colctr = output_cols - 2; colctr > 0; colctr--) { - membersum = GETJSAMPLE(*inptr++); - above_ptr++; below_ptr++; - nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + - GETJSAMPLE(*inptr); - neighsum = lastcolsum + (colsum - membersum) + nextcolsum; - membersum = membersum * memberscale + neighsum * neighscale; - *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); - lastcolsum = colsum; colsum = nextcolsum; - } - - /* Special case for last column */ - membersum = GETJSAMPLE(*inptr); - neighsum = lastcolsum + (colsum - membersum) + colsum; - membersum = membersum * memberscale + neighsum * neighscale; - *outptr = (JSAMPLE) ((membersum + 32768) >> 16); - - } -} - -#endif /* INPUT_SMOOTHING_SUPPORTED */ - - -/* - * Module initialization routine for downsampling. - * Note that we must select a routine for each component. - */ - -GLOBAL(void) -jinit_downsampler (j_compress_ptr cinfo) -{ - my_downsample_ptr downsample; - int ci; - jpeg_component_info * compptr; - boolean smoothok = TRUE; - - downsample = (my_downsample_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_downsampler)); - cinfo->downsample = (struct jpeg_downsampler *) downsample; - downsample->pub.start_pass = start_pass_downsample; - downsample->pub.downsample = sep_downsample; - downsample->pub.need_context_rows = FALSE; - - if (cinfo->CCIR601_sampling) - ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); - - /* Verify we can handle the sampling factors, and set up method pointers */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (compptr->h_samp_factor == cinfo->max_h_samp_factor && - compptr->v_samp_factor == cinfo->max_v_samp_factor) { -#ifdef INPUT_SMOOTHING_SUPPORTED - if (cinfo->smoothing_factor) { - downsample->methods[ci] = fullsize_smooth_downsample; - downsample->pub.need_context_rows = TRUE; - } else -#endif - downsample->methods[ci] = fullsize_downsample; - } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && - compptr->v_samp_factor == cinfo->max_v_samp_factor) { - smoothok = FALSE; - downsample->methods[ci] = h2v1_downsample; - } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && - compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) { -#ifdef INPUT_SMOOTHING_SUPPORTED - if (cinfo->smoothing_factor) { - downsample->methods[ci] = h2v2_smooth_downsample; - downsample->pub.need_context_rows = TRUE; - } else -#endif - downsample->methods[ci] = h2v2_downsample; - } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 && - (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) { - smoothok = FALSE; - downsample->methods[ci] = int_downsample; - } else - ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); - } - -#ifdef INPUT_SMOOTHING_SUPPORTED - if (cinfo->smoothing_factor && !smoothok) - TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL); -#endif -} diff --git a/src/SFML/Graphics/libjpeg/jctrans.c b/src/SFML/Graphics/libjpeg/jctrans.c deleted file mode 100644 index 8b36e363..00000000 --- a/src/SFML/Graphics/libjpeg/jctrans.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * jctrans.c - * - * Copyright (C) 1995-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains library routines for transcoding compression, - * that is, writing raw DCT coefficient arrays to an output JPEG file. - * The routines in jcapimin.c will also be needed by a transcoder. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Forward declarations */ -LOCAL(void) transencode_master_selection - JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); -LOCAL(void) transencode_coef_controller - JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); - - -/* - * Compression initialization for writing raw-coefficient data. - * Before calling this, all parameters and a data destination must be set up. - * Call jpeg_finish_compress() to actually write the data. - * - * The number of passed virtual arrays must match cinfo->num_components. - * Note that the virtual arrays need not be filled or even realized at - * the time write_coefficients is called; indeed, if the virtual arrays - * were requested from this compression object's memory manager, they - * typically will be realized during this routine and filled afterwards. - */ - -GLOBAL(void) -jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays) -{ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - /* Mark all tables to be written */ - jpeg_suppress_tables(cinfo, FALSE); - /* (Re)initialize error mgr and destination modules */ - (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); - (*cinfo->dest->init_destination) (cinfo); - /* Perform master selection of active modules */ - transencode_master_selection(cinfo, coef_arrays); - /* Wait for jpeg_finish_compress() call */ - cinfo->next_scanline = 0; /* so jpeg_write_marker works */ - cinfo->global_state = CSTATE_WRCOEFS; -} - - -/* - * Initialize the compression object with default parameters, - * then copy from the source object all parameters needed for lossless - * transcoding. Parameters that can be varied without loss (such as - * scan script and Huffman optimization) are left in their default states. - */ - -GLOBAL(void) -jpeg_copy_critical_parameters (j_decompress_ptr srcinfo, - j_compress_ptr dstinfo) -{ - JQUANT_TBL ** qtblptr; - jpeg_component_info *incomp, *outcomp; - JQUANT_TBL *c_quant, *slot_quant; - int tblno, ci, coefi; - - /* Safety check to ensure start_compress not called yet. */ - if (dstinfo->global_state != CSTATE_START) - ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state); - /* Copy fundamental image dimensions */ - dstinfo->image_width = srcinfo->image_width; - dstinfo->image_height = srcinfo->image_height; - dstinfo->input_components = srcinfo->num_components; - dstinfo->in_color_space = srcinfo->jpeg_color_space; - /* Initialize all parameters to default values */ - jpeg_set_defaults(dstinfo); - /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB. - * Fix it to get the right header markers for the image colorspace. - */ - jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space); - dstinfo->data_precision = srcinfo->data_precision; - dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling; - /* Copy the source's quantization tables. */ - for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { - if (srcinfo->quant_tbl_ptrs[tblno] != NULL) { - qtblptr = & dstinfo->quant_tbl_ptrs[tblno]; - if (*qtblptr == NULL) - *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo); - MEMCOPY((*qtblptr)->quantval, - srcinfo->quant_tbl_ptrs[tblno]->quantval, - SIZEOF((*qtblptr)->quantval)); - (*qtblptr)->sent_table = FALSE; - } - } - /* Copy the source's per-component info. - * Note we assume jpeg_set_defaults has allocated the dest comp_info array. - */ - dstinfo->num_components = srcinfo->num_components; - if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS) - ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components, - MAX_COMPONENTS); - for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info; - ci < dstinfo->num_components; ci++, incomp++, outcomp++) { - outcomp->component_id = incomp->component_id; - outcomp->h_samp_factor = incomp->h_samp_factor; - outcomp->v_samp_factor = incomp->v_samp_factor; - outcomp->quant_tbl_no = incomp->quant_tbl_no; - /* Make sure saved quantization table for component matches the qtable - * slot. If not, the input file re-used this qtable slot. - * IJG encoder currently cannot duplicate this. - */ - tblno = outcomp->quant_tbl_no; - if (tblno < 0 || tblno >= NUM_QUANT_TBLS || - srcinfo->quant_tbl_ptrs[tblno] == NULL) - ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno); - slot_quant = srcinfo->quant_tbl_ptrs[tblno]; - c_quant = incomp->quant_table; - if (c_quant != NULL) { - for (coefi = 0; coefi < DCTSIZE2; coefi++) { - if (c_quant->quantval[coefi] != slot_quant->quantval[coefi]) - ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno); - } - } - /* Note: we do not copy the source's Huffman table assignments; - * instead we rely on jpeg_set_colorspace to have made a suitable choice. - */ - } - /* Also copy JFIF version and resolution information, if available. - * Strictly speaking this isn't "critical" info, but it's nearly - * always appropriate to copy it if available. In particular, - * if the application chooses to copy JFIF 1.02 extension markers from - * the source file, we need to copy the version to make sure we don't - * emit a file that has 1.02 extensions but a claimed version of 1.01. - * We will *not*, however, copy version info from mislabeled "2.01" files. - */ - if (srcinfo->saw_JFIF_marker) { - if (srcinfo->JFIF_major_version == 1) { - dstinfo->JFIF_major_version = srcinfo->JFIF_major_version; - dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version; - } - dstinfo->density_unit = srcinfo->density_unit; - dstinfo->X_density = srcinfo->X_density; - dstinfo->Y_density = srcinfo->Y_density; - } -} - - -/* - * Master selection of compression modules for transcoding. - * This substitutes for jcinit.c's initialization of the full compressor. - */ - -LOCAL(void) -transencode_master_selection (j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays) -{ - /* Although we don't actually use input_components for transcoding, - * jcmaster.c's initial_setup will complain if input_components is 0. - */ - cinfo->input_components = 1; - /* Initialize master control (includes parameter checking/processing) */ - jinit_c_master_control(cinfo, TRUE /* transcode only */); - - /* Entropy encoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - jinit_phuff_encoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_encoder(cinfo); - } - - /* We need a special coefficient buffer controller. */ - transencode_coef_controller(cinfo, coef_arrays); - - jinit_marker_writer(cinfo); - - /* We can now tell the memory manager to allocate virtual arrays. */ - (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); - - /* Write the datastream header (SOI, JFIF) immediately. - * Frame and scan headers are postponed till later. - * This lets application insert special markers after the SOI. - */ - (*cinfo->marker->write_file_header) (cinfo); -} - - -/* - * The rest of this file is a special implementation of the coefficient - * buffer controller. This is similar to jccoefct.c, but it handles only - * output from presupplied virtual arrays. Furthermore, we generate any - * dummy padding blocks on-the-fly rather than expecting them to be present - * in the arrays. - */ - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_c_coef_controller pub; /* public fields */ - - JDIMENSION iMCU_row_num; /* iMCU row # within image */ - JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ - int MCU_vert_offset; /* counts MCU rows within iMCU row */ - int MCU_rows_per_iMCU_row; /* number of such rows needed */ - - /* Virtual block array for each component. */ - jvirt_barray_ptr * whole_image; - - /* Workspace for constructing dummy blocks at right/bottom edges. */ - JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU]; -} my_coef_controller; - -typedef my_coef_controller * my_coef_ptr; - - -LOCAL(void) -start_iMCU_row (j_compress_ptr cinfo) -/* Reset within-iMCU-row counters for a new row */ -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - - /* In an interleaved scan, an MCU row is the same as an iMCU row. - * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. - * But at the bottom of the image, process only what's left. - */ - if (cinfo->comps_in_scan > 1) { - coef->MCU_rows_per_iMCU_row = 1; - } else { - if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; - else - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; - } - - coef->mcu_ctr = 0; - coef->MCU_vert_offset = 0; -} - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - - if (pass_mode != JBUF_CRANK_DEST) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - - coef->iMCU_row_num = 0; - start_iMCU_row(cinfo); -} - - -/* - * Process some data. - * We process the equivalent of one fully interleaved MCU row ("iMCU" row) - * per call, ie, v_samp_factor block rows for each component in the scan. - * The data is obtained from the virtual arrays and fed to the entropy coder. - * Returns TRUE if the iMCU row is completed, FALSE if suspended. - * - * NB: input_buf is ignored; it is likely to be a NULL pointer. - */ - -METHODDEF(boolean) -compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - int blkn, ci, xindex, yindex, yoffset, blockcnt; - JDIMENSION start_col; - JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; - JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; - JBLOCKROW buffer_ptr; - jpeg_component_info *compptr; - - /* Align the virtual buffers for the components used in this scan. */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - buffer[ci] = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], - coef->iMCU_row_num * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - - /* Loop to process one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; - MCU_col_num++) { - /* Construct list of pointers to DCT blocks belonging to this MCU */ - blkn = 0; /* index of current DCT block within MCU */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - start_col = MCU_col_num * compptr->MCU_width; - blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width - : compptr->last_col_width; - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - if (coef->iMCU_row_num < last_iMCU_row || - yindex+yoffset < compptr->last_row_height) { - /* Fill in pointers to real blocks in this row */ - buffer_ptr = buffer[ci][yindex+yoffset] + start_col; - for (xindex = 0; xindex < blockcnt; xindex++) - MCU_buffer[blkn++] = buffer_ptr++; - } else { - /* At bottom of image, need a whole row of dummy blocks */ - xindex = 0; - } - /* Fill in any dummy blocks needed in this row. - * Dummy blocks are filled in the same way as in jccoefct.c: - * all zeroes in the AC entries, DC entries equal to previous - * block's DC value. The init routine has already zeroed the - * AC entries, so we need only set the DC entries correctly. - */ - for (; xindex < compptr->MCU_width; xindex++) { - MCU_buffer[blkn] = coef->dummy_buffer[blkn]; - MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0]; - blkn++; - } - } - } - /* Try to write the MCU. */ - if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->mcu_ctr = MCU_col_num; - return FALSE; - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->mcu_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - coef->iMCU_row_num++; - start_iMCU_row(cinfo); - return TRUE; -} - - -/* - * Initialize coefficient buffer controller. - * - * Each passed coefficient array must be the right size for that - * coefficient: width_in_blocks wide and height_in_blocks high, - * with unitheight at least v_samp_factor. - */ - -LOCAL(void) -transencode_coef_controller (j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays) -{ - my_coef_ptr coef; - JBLOCKROW buffer; - int i; - - coef = (my_coef_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_coef_controller)); - cinfo->coef = (struct jpeg_c_coef_controller *) coef; - coef->pub.start_pass = start_pass_coef; - coef->pub.compress_data = compress_output; - - /* Save pointer to virtual arrays */ - coef->whole_image = coef_arrays; - - /* Allocate and pre-zero space for dummy DCT blocks. */ - buffer = (JBLOCKROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { - coef->dummy_buffer[i] = buffer + i; - } -} diff --git a/src/SFML/Graphics/libjpeg/jdapimin.c b/src/SFML/Graphics/libjpeg/jdapimin.c deleted file mode 100644 index bd1df927..00000000 --- a/src/SFML/Graphics/libjpeg/jdapimin.c +++ /dev/null @@ -1,395 +0,0 @@ -/* - * jdapimin.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface code for the decompression half - * of the JPEG library. These are the "minimum" API routines that may be - * needed in either the normal full-decompression case or the - * transcoding-only case. - * - * Most of the routines intended to be called directly by an application - * are in this file or in jdapistd.c. But also see jcomapi.c for routines - * shared by compression and decompression, and jdtrans.c for the transcoding - * case. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Initialization of a JPEG decompression object. - * The error manager must already be set up (in case memory manager fails). - */ - -GLOBAL(void) -jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize) -{ - int i; - - /* Guard against version mismatches between library and caller. */ - cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ - if (version != JPEG_LIB_VERSION) - ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); - if (structsize != SIZEOF(struct jpeg_decompress_struct)) - ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, - (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize); - - /* For debugging purposes, we zero the whole master structure. - * But the application has already set the err pointer, and may have set - * client_data, so we have to save and restore those fields. - * Note: if application hasn't set client_data, tools like Purify may - * complain here. - */ - { - struct jpeg_error_mgr * err = cinfo->err; - void * client_data = cinfo->client_data; /* ignore Purify complaint here */ - MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct)); - cinfo->err = err; - cinfo->client_data = client_data; - } - cinfo->is_decompressor = TRUE; - - /* Initialize a memory manager instance for this object */ - jinit_memory_mgr((j_common_ptr) cinfo); - - /* Zero out pointers to permanent structures. */ - cinfo->progress = NULL; - cinfo->src = NULL; - - for (i = 0; i < NUM_QUANT_TBLS; i++) - cinfo->quant_tbl_ptrs[i] = NULL; - - for (i = 0; i < NUM_HUFF_TBLS; i++) { - cinfo->dc_huff_tbl_ptrs[i] = NULL; - cinfo->ac_huff_tbl_ptrs[i] = NULL; - } - - /* Initialize marker processor so application can override methods - * for COM, APPn markers before calling jpeg_read_header. - */ - cinfo->marker_list = NULL; - jinit_marker_reader(cinfo); - - /* And initialize the overall input controller. */ - jinit_input_controller(cinfo); - - /* OK, I'm ready */ - cinfo->global_state = DSTATE_START; -} - - -/* - * Destruction of a JPEG decompression object - */ - -GLOBAL(void) -jpeg_destroy_decompress (j_decompress_ptr cinfo) -{ - jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ -} - - -/* - * Abort processing of a JPEG decompression operation, - * but don't destroy the object itself. - */ - -GLOBAL(void) -jpeg_abort_decompress (j_decompress_ptr cinfo) -{ - jpeg_abort((j_common_ptr) cinfo); /* use common routine */ -} - - -/* - * Set default decompression parameters. - */ - -LOCAL(void) -default_decompress_parms (j_decompress_ptr cinfo) -{ - /* Guess the input colorspace, and set output colorspace accordingly. */ - /* (Wish JPEG committee had provided a real way to specify this...) */ - /* Note application may override our guesses. */ - switch (cinfo->num_components) { - case 1: - cinfo->jpeg_color_space = JCS_GRAYSCALE; - cinfo->out_color_space = JCS_GRAYSCALE; - break; - - case 3: - if (cinfo->saw_JFIF_marker) { - cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */ - } else if (cinfo->saw_Adobe_marker) { - switch (cinfo->Adobe_transform) { - case 0: - cinfo->jpeg_color_space = JCS_RGB; - break; - case 1: - cinfo->jpeg_color_space = JCS_YCbCr; - break; - default: - WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); - cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ - break; - } - } else { - /* Saw no special markers, try to guess from the component IDs */ - int cid0 = cinfo->comp_info[0].component_id; - int cid1 = cinfo->comp_info[1].component_id; - int cid2 = cinfo->comp_info[2].component_id; - - if (cid0 == 1 && cid1 == 2 && cid2 == 3) - cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */ - else if (cid0 == 82 && cid1 == 71 && cid2 == 66) - cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */ - else { - TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2); - cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ - } - } - /* Always guess RGB is proper output colorspace. */ - cinfo->out_color_space = JCS_RGB; - break; - - case 4: - if (cinfo->saw_Adobe_marker) { - switch (cinfo->Adobe_transform) { - case 0: - cinfo->jpeg_color_space = JCS_CMYK; - break; - case 2: - cinfo->jpeg_color_space = JCS_YCCK; - break; - default: - WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); - cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */ - break; - } - } else { - /* No special markers, assume straight CMYK. */ - cinfo->jpeg_color_space = JCS_CMYK; - } - cinfo->out_color_space = JCS_CMYK; - break; - - default: - cinfo->jpeg_color_space = JCS_UNKNOWN; - cinfo->out_color_space = JCS_UNKNOWN; - break; - } - - /* Set defaults for other decompression parameters. */ - cinfo->scale_num = 1; /* 1:1 scaling */ - cinfo->scale_denom = 1; - cinfo->output_gamma = 1.0; - cinfo->buffered_image = FALSE; - cinfo->raw_data_out = FALSE; - cinfo->dct_method = JDCT_DEFAULT; - cinfo->do_fancy_upsampling = TRUE; - cinfo->do_block_smoothing = TRUE; - cinfo->quantize_colors = FALSE; - /* We set these in case application only sets quantize_colors. */ - cinfo->dither_mode = JDITHER_FS; -#ifdef QUANT_2PASS_SUPPORTED - cinfo->two_pass_quantize = TRUE; -#else - cinfo->two_pass_quantize = FALSE; -#endif - cinfo->desired_number_of_colors = 256; - cinfo->colormap = NULL; - /* Initialize for no mode change in buffered-image mode. */ - cinfo->enable_1pass_quant = FALSE; - cinfo->enable_external_quant = FALSE; - cinfo->enable_2pass_quant = FALSE; -} - - -/* - * Decompression startup: read start of JPEG datastream to see what's there. - * Need only initialize JPEG object and supply a data source before calling. - * - * This routine will read as far as the first SOS marker (ie, actual start of - * compressed data), and will save all tables and parameters in the JPEG - * object. It will also initialize the decompression parameters to default - * values, and finally return JPEG_HEADER_OK. On return, the application may - * adjust the decompression parameters and then call jpeg_start_decompress. - * (Or, if the application only wanted to determine the image parameters, - * the data need not be decompressed. In that case, call jpeg_abort or - * jpeg_destroy to release any temporary space.) - * If an abbreviated (tables only) datastream is presented, the routine will - * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then - * re-use the JPEG object to read the abbreviated image datastream(s). - * It is unnecessary (but OK) to call jpeg_abort in this case. - * The JPEG_SUSPENDED return code only occurs if the data source module - * requests suspension of the decompressor. In this case the application - * should load more source data and then re-call jpeg_read_header to resume - * processing. - * If a non-suspending data source is used and require_image is TRUE, then the - * return code need not be inspected since only JPEG_HEADER_OK is possible. - * - * This routine is now just a front end to jpeg_consume_input, with some - * extra error checking. - */ - -GLOBAL(int) -jpeg_read_header (j_decompress_ptr cinfo, boolean require_image) -{ - int retcode; - - if (cinfo->global_state != DSTATE_START && - cinfo->global_state != DSTATE_INHEADER) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - retcode = jpeg_consume_input(cinfo); - - switch (retcode) { - case JPEG_REACHED_SOS: - retcode = JPEG_HEADER_OK; - break; - case JPEG_REACHED_EOI: - if (require_image) /* Complain if application wanted an image */ - ERREXIT(cinfo, JERR_NO_IMAGE); - /* Reset to start state; it would be safer to require the application to - * call jpeg_abort, but we can't change it now for compatibility reasons. - * A side effect is to free any temporary memory (there shouldn't be any). - */ - jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */ - retcode = JPEG_HEADER_TABLES_ONLY; - break; - case JPEG_SUSPENDED: - /* no work */ - break; - } - - return retcode; -} - - -/* - * Consume data in advance of what the decompressor requires. - * This can be called at any time once the decompressor object has - * been created and a data source has been set up. - * - * This routine is essentially a state machine that handles a couple - * of critical state-transition actions, namely initial setup and - * transition from header scanning to ready-for-start_decompress. - * All the actual input is done via the input controller's consume_input - * method. - */ - -GLOBAL(int) -jpeg_consume_input (j_decompress_ptr cinfo) -{ - int retcode = JPEG_SUSPENDED; - - /* NB: every possible DSTATE value should be listed in this switch */ - switch (cinfo->global_state) { - case DSTATE_START: - /* Start-of-datastream actions: reset appropriate modules */ - (*cinfo->inputctl->reset_input_controller) (cinfo); - /* Initialize application's data source module */ - (*cinfo->src->init_source) (cinfo); - cinfo->global_state = DSTATE_INHEADER; - /*FALLTHROUGH*/ - case DSTATE_INHEADER: - retcode = (*cinfo->inputctl->consume_input) (cinfo); - if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */ - /* Set up default parameters based on header data */ - default_decompress_parms(cinfo); - /* Set global state: ready for start_decompress */ - cinfo->global_state = DSTATE_READY; - } - break; - case DSTATE_READY: - /* Can't advance past first SOS until start_decompress is called */ - retcode = JPEG_REACHED_SOS; - break; - case DSTATE_PRELOAD: - case DSTATE_PRESCAN: - case DSTATE_SCANNING: - case DSTATE_RAW_OK: - case DSTATE_BUFIMAGE: - case DSTATE_BUFPOST: - case DSTATE_STOPPING: - retcode = (*cinfo->inputctl->consume_input) (cinfo); - break; - default: - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - } - return retcode; -} - - -/* - * Have we finished reading the input file? - */ - -GLOBAL(boolean) -jpeg_input_complete (j_decompress_ptr cinfo) -{ - /* Check for valid jpeg object */ - if (cinfo->global_state < DSTATE_START || - cinfo->global_state > DSTATE_STOPPING) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - return cinfo->inputctl->eoi_reached; -} - - -/* - * Is there more than one scan? - */ - -GLOBAL(boolean) -jpeg_has_multiple_scans (j_decompress_ptr cinfo) -{ - /* Only valid after jpeg_read_header completes */ - if (cinfo->global_state < DSTATE_READY || - cinfo->global_state > DSTATE_STOPPING) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - return cinfo->inputctl->has_multiple_scans; -} - - -/* - * Finish JPEG decompression. - * - * This will normally just verify the file trailer and release temp storage. - * - * Returns FALSE if suspended. The return value need be inspected only if - * a suspending data source is used. - */ - -GLOBAL(boolean) -jpeg_finish_decompress (j_decompress_ptr cinfo) -{ - if ((cinfo->global_state == DSTATE_SCANNING || - cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) { - /* Terminate final pass of non-buffered mode */ - if (cinfo->output_scanline < cinfo->output_height) - ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); - (*cinfo->master->finish_output_pass) (cinfo); - cinfo->global_state = DSTATE_STOPPING; - } else if (cinfo->global_state == DSTATE_BUFIMAGE) { - /* Finishing after a buffered-image operation */ - cinfo->global_state = DSTATE_STOPPING; - } else if (cinfo->global_state != DSTATE_STOPPING) { - /* STOPPING = repeat call after a suspension, anything else is error */ - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - } - /* Read until EOI */ - while (! cinfo->inputctl->eoi_reached) { - if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) - return FALSE; /* Suspend, come back later */ - } - /* Do final cleanup */ - (*cinfo->src->term_source) (cinfo); - /* We can use jpeg_abort to release memory and reset global_state */ - jpeg_abort((j_common_ptr) cinfo); - return TRUE; -} diff --git a/src/SFML/Graphics/libjpeg/jdapistd.c b/src/SFML/Graphics/libjpeg/jdapistd.c deleted file mode 100644 index f6c7fffe..00000000 --- a/src/SFML/Graphics/libjpeg/jdapistd.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * jdapistd.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface code for the decompression half - * of the JPEG library. These are the "standard" API routines that are - * used in the normal full-decompression case. They are not used by a - * transcoding-only application. Note that if an application links in - * jpeg_start_decompress, it will end up linking in the entire decompressor. - * We thus must separate this file from jdapimin.c to avoid linking the - * whole decompression library into a transcoder. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Forward declarations */ -LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo)); - - -/* - * Decompression initialization. - * jpeg_read_header must be completed before calling this. - * - * If a multipass operating mode was selected, this will do all but the - * last pass, and thus may take a great deal of time. - * - * Returns FALSE if suspended. The return value need be inspected only if - * a suspending data source is used. - */ - -GLOBAL(boolean) -jpeg_start_decompress (j_decompress_ptr cinfo) -{ - if (cinfo->global_state == DSTATE_READY) { - /* First call: initialize master control, select active modules */ - jinit_master_decompress(cinfo); - if (cinfo->buffered_image) { - /* No more work here; expecting jpeg_start_output next */ - cinfo->global_state = DSTATE_BUFIMAGE; - return TRUE; - } - cinfo->global_state = DSTATE_PRELOAD; - } - if (cinfo->global_state == DSTATE_PRELOAD) { - /* If file has multiple scans, absorb them all into the coef buffer */ - if (cinfo->inputctl->has_multiple_scans) { -#ifdef D_MULTISCAN_FILES_SUPPORTED - for (;;) { - int retcode; - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - /* Absorb some more input */ - retcode = (*cinfo->inputctl->consume_input) (cinfo); - if (retcode == JPEG_SUSPENDED) - return FALSE; - if (retcode == JPEG_REACHED_EOI) - break; - /* Advance progress counter if appropriate */ - if (cinfo->progress != NULL && - (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { - if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { - /* jdmaster underestimated number of scans; ratchet up one scan */ - cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; - } - } - } -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif /* D_MULTISCAN_FILES_SUPPORTED */ - } - cinfo->output_scan_number = cinfo->input_scan_number; - } else if (cinfo->global_state != DSTATE_PRESCAN) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - /* Perform any dummy output passes, and set up for the final pass */ - return output_pass_setup(cinfo); -} - - -/* - * Set up for an output pass, and perform any dummy pass(es) needed. - * Common subroutine for jpeg_start_decompress and jpeg_start_output. - * Entry: global_state = DSTATE_PRESCAN only if previously suspended. - * Exit: If done, returns TRUE and sets global_state for proper output mode. - * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN. - */ - -LOCAL(boolean) -output_pass_setup (j_decompress_ptr cinfo) -{ - if (cinfo->global_state != DSTATE_PRESCAN) { - /* First call: do pass setup */ - (*cinfo->master->prepare_for_output_pass) (cinfo); - cinfo->output_scanline = 0; - cinfo->global_state = DSTATE_PRESCAN; - } - /* Loop over any required dummy passes */ - while (cinfo->master->is_dummy_pass) { -#ifdef QUANT_2PASS_SUPPORTED - /* Crank through the dummy pass */ - while (cinfo->output_scanline < cinfo->output_height) { - JDIMENSION last_scanline; - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->output_scanline; - cinfo->progress->pass_limit = (long) cinfo->output_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - /* Process some data */ - last_scanline = cinfo->output_scanline; - (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL, - &cinfo->output_scanline, (JDIMENSION) 0); - if (cinfo->output_scanline == last_scanline) - return FALSE; /* No progress made, must suspend */ - } - /* Finish up dummy pass, and set up for another one */ - (*cinfo->master->finish_output_pass) (cinfo); - (*cinfo->master->prepare_for_output_pass) (cinfo); - cinfo->output_scanline = 0; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif /* QUANT_2PASS_SUPPORTED */ - } - /* Ready for application to drive output pass through - * jpeg_read_scanlines or jpeg_read_raw_data. - */ - cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING; - return TRUE; -} - - -/* - * Read some scanlines of data from the JPEG decompressor. - * - * The return value will be the number of lines actually read. - * This may be less than the number requested in several cases, - * including bottom of image, data source suspension, and operating - * modes that emit multiple scanlines at a time. - * - * Note: we warn about excess calls to jpeg_read_scanlines() since - * this likely signals an application programmer error. However, - * an oversize buffer (max_lines > scanlines remaining) is not an error. - */ - -GLOBAL(JDIMENSION) -jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines, - JDIMENSION max_lines) -{ - JDIMENSION row_ctr; - - if (cinfo->global_state != DSTATE_SCANNING) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - if (cinfo->output_scanline >= cinfo->output_height) { - WARNMS(cinfo, JWRN_TOO_MUCH_DATA); - return 0; - } - - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->output_scanline; - cinfo->progress->pass_limit = (long) cinfo->output_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - - /* Process some data */ - row_ctr = 0; - (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines); - cinfo->output_scanline += row_ctr; - return row_ctr; -} - - -/* - * Alternate entry point to read raw data. - * Processes exactly one iMCU row per call, unless suspended. - */ - -GLOBAL(JDIMENSION) -jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data, - JDIMENSION max_lines) -{ - JDIMENSION lines_per_iMCU_row; - - if (cinfo->global_state != DSTATE_RAW_OK) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - if (cinfo->output_scanline >= cinfo->output_height) { - WARNMS(cinfo, JWRN_TOO_MUCH_DATA); - return 0; - } - - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->output_scanline; - cinfo->progress->pass_limit = (long) cinfo->output_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - - /* Verify that at least one iMCU row can be returned. */ - lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size; - if (max_lines < lines_per_iMCU_row) - ERREXIT(cinfo, JERR_BUFFER_SIZE); - - /* Decompress directly into user's buffer. */ - if (! (*cinfo->coef->decompress_data) (cinfo, data)) - return 0; /* suspension forced, can do nothing more */ - - /* OK, we processed one iMCU row. */ - cinfo->output_scanline += lines_per_iMCU_row; - return lines_per_iMCU_row; -} - - -/* Additional entry points for buffered-image mode. */ - -#ifdef D_MULTISCAN_FILES_SUPPORTED - -/* - * Initialize for an output pass in buffered-image mode. - */ - -GLOBAL(boolean) -jpeg_start_output (j_decompress_ptr cinfo, int scan_number) -{ - if (cinfo->global_state != DSTATE_BUFIMAGE && - cinfo->global_state != DSTATE_PRESCAN) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - /* Limit scan number to valid range */ - if (scan_number <= 0) - scan_number = 1; - if (cinfo->inputctl->eoi_reached && - scan_number > cinfo->input_scan_number) - scan_number = cinfo->input_scan_number; - cinfo->output_scan_number = scan_number; - /* Perform any dummy output passes, and set up for the real pass */ - return output_pass_setup(cinfo); -} - - -/* - * Finish up after an output pass in buffered-image mode. - * - * Returns FALSE if suspended. The return value need be inspected only if - * a suspending data source is used. - */ - -GLOBAL(boolean) -jpeg_finish_output (j_decompress_ptr cinfo) -{ - if ((cinfo->global_state == DSTATE_SCANNING || - cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) { - /* Terminate this pass. */ - /* We do not require the whole pass to have been completed. */ - (*cinfo->master->finish_output_pass) (cinfo); - cinfo->global_state = DSTATE_BUFPOST; - } else if (cinfo->global_state != DSTATE_BUFPOST) { - /* BUFPOST = repeat call after a suspension, anything else is error */ - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - } - /* Read markers looking for SOS or EOI */ - while (cinfo->input_scan_number <= cinfo->output_scan_number && - ! cinfo->inputctl->eoi_reached) { - if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) - return FALSE; /* Suspend, come back later */ - } - cinfo->global_state = DSTATE_BUFIMAGE; - return TRUE; -} - -#endif /* D_MULTISCAN_FILES_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jdatadst.c b/src/SFML/Graphics/libjpeg/jdatadst.c deleted file mode 100644 index 2ece4e95..00000000 --- a/src/SFML/Graphics/libjpeg/jdatadst.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * jdatadst.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains compression data destination routines for the case of - * emitting JPEG data to a file (or any stdio stream). While these routines - * are sufficient for most applications, some will want to use a different - * destination manager. - * IMPORTANT: we assume that fwrite() will correctly transcribe an array of - * JOCTETs into 8-bit-wide elements on external storage. If char is wider - * than 8 bits on your machine, you may need to do some tweaking. - */ - -/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ -#include "jinclude.h" -#include "jpeglib.h" -#include "jerror.h" - - -/* Expanded data destination object for stdio output */ - -typedef struct { - struct jpeg_destination_mgr pub; /* public fields */ - - FILE * outfile; /* target stream */ - JOCTET * buffer; /* start of buffer */ -} my_destination_mgr; - -typedef my_destination_mgr * my_dest_ptr; - -#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ - - -/* - * Initialize destination --- called by jpeg_start_compress - * before any data is actually written. - */ - -METHODDEF(void) -init_destination (j_compress_ptr cinfo) -{ - my_dest_ptr dest = (my_dest_ptr) cinfo->dest; - - /* Allocate the output buffer --- it will be released when done with image */ - dest->buffer = (JOCTET *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - OUTPUT_BUF_SIZE * SIZEOF(JOCTET)); - - dest->pub.next_output_byte = dest->buffer; - dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; -} - - -/* - * Empty the output buffer --- called whenever buffer fills up. - * - * In typical applications, this should write the entire output buffer - * (ignoring the current state of next_output_byte & free_in_buffer), - * reset the pointer & count to the start of the buffer, and return TRUE - * indicating that the buffer has been dumped. - * - * In applications that need to be able to suspend compression due to output - * overrun, a FALSE return indicates that the buffer cannot be emptied now. - * In this situation, the compressor will return to its caller (possibly with - * an indication that it has not accepted all the supplied scanlines). The - * application should resume compression after it has made more room in the - * output buffer. Note that there are substantial restrictions on the use of - * suspension --- see the documentation. - * - * When suspending, the compressor will back up to a convenient restart point - * (typically the start of the current MCU). next_output_byte & free_in_buffer - * indicate where the restart point will be if the current call returns FALSE. - * Data beyond this point will be regenerated after resumption, so do not - * write it out when emptying the buffer externally. - */ - -METHODDEF(boolean) -empty_output_buffer (j_compress_ptr cinfo) -{ - my_dest_ptr dest = (my_dest_ptr) cinfo->dest; - - if (JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE) != - (size_t) OUTPUT_BUF_SIZE) - ERREXIT(cinfo, JERR_FILE_WRITE); - - dest->pub.next_output_byte = dest->buffer; - dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; - - return TRUE; -} - - -/* - * Terminate destination --- called by jpeg_finish_compress - * after all data has been written. Usually needs to flush buffer. - * - * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding - * application must deal with any cleanup that should happen even - * for error exit. - */ - -METHODDEF(void) -term_destination (j_compress_ptr cinfo) -{ - my_dest_ptr dest = (my_dest_ptr) cinfo->dest; - size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer; - - /* Write any data remaining in the buffer */ - if (datacount > 0) { - if (JFWRITE(dest->outfile, dest->buffer, datacount) != datacount) - ERREXIT(cinfo, JERR_FILE_WRITE); - } - fflush(dest->outfile); - /* Make sure we wrote the output file OK */ - if (ferror(dest->outfile)) - ERREXIT(cinfo, JERR_FILE_WRITE); -} - - -/* - * Prepare for output to a stdio stream. - * The caller must have already opened the stream, and is responsible - * for closing it after finishing compression. - */ - -GLOBAL(void) -jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile) -{ - my_dest_ptr dest; - - /* The destination object is made permanent so that multiple JPEG images - * can be written to the same file without re-executing jpeg_stdio_dest. - * This makes it dangerous to use this manager and a different destination - * manager serially with the same JPEG object, because their private object - * sizes may be different. Caveat programmer. - */ - if (cinfo->dest == NULL) { /* first time for this JPEG object? */ - cinfo->dest = (struct jpeg_destination_mgr *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - SIZEOF(my_destination_mgr)); - } - - dest = (my_dest_ptr) cinfo->dest; - dest->pub.init_destination = init_destination; - dest->pub.empty_output_buffer = empty_output_buffer; - dest->pub.term_destination = term_destination; - dest->outfile = outfile; -} diff --git a/src/SFML/Graphics/libjpeg/jdatasrc.c b/src/SFML/Graphics/libjpeg/jdatasrc.c deleted file mode 100644 index 29b69832..00000000 --- a/src/SFML/Graphics/libjpeg/jdatasrc.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - * jdatasrc.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains decompression data source routines for the case of - * reading JPEG data from a file (or any stdio stream). While these routines - * are sufficient for most applications, some will want to use a different - * source manager. - * IMPORTANT: we assume that fread() will correctly transcribe an array of - * JOCTETs from 8-bit-wide elements on external storage. If char is wider - * than 8 bits on your machine, you may need to do some tweaking. - */ - -/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ -#include "jinclude.h" -#include "jpeglib.h" -#include "jerror.h" - - -/* Expanded data source object for stdio input */ - -typedef struct { - struct jpeg_source_mgr pub; /* public fields */ - - FILE * infile; /* source stream */ - JOCTET * buffer; /* start of buffer */ - boolean start_of_file; /* have we gotten any data yet? */ -} my_source_mgr; - -typedef my_source_mgr * my_src_ptr; - -#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ - - -/* - * Initialize source --- called by jpeg_read_header - * before any data is actually read. - */ - -METHODDEF(void) -init_source (j_decompress_ptr cinfo) -{ - my_src_ptr src = (my_src_ptr) cinfo->src; - - /* We reset the empty-input-file flag for each image, - * but we don't clear the input buffer. - * This is correct behavior for reading a series of images from one source. - */ - src->start_of_file = TRUE; -} - - -/* - * Fill the input buffer --- called whenever buffer is emptied. - * - * In typical applications, this should read fresh data into the buffer - * (ignoring the current state of next_input_byte & bytes_in_buffer), - * reset the pointer & count to the start of the buffer, and return TRUE - * indicating that the buffer has been reloaded. It is not necessary to - * fill the buffer entirely, only to obtain at least one more byte. - * - * There is no such thing as an EOF return. If the end of the file has been - * reached, the routine has a choice of ERREXIT() or inserting fake data into - * the buffer. In most cases, generating a warning message and inserting a - * fake EOI marker is the best course of action --- this will allow the - * decompressor to output however much of the image is there. However, - * the resulting error message is misleading if the real problem is an empty - * input file, so we handle that case specially. - * - * In applications that need to be able to suspend compression due to input - * not being available yet, a FALSE return indicates that no more data can be - * obtained right now, but more may be forthcoming later. In this situation, - * the decompressor will return to its caller (with an indication of the - * number of scanlines it has read, if any). The application should resume - * decompression after it has loaded more data into the input buffer. Note - * that there are substantial restrictions on the use of suspension --- see - * the documentation. - * - * When suspending, the decompressor will back up to a convenient restart point - * (typically the start of the current MCU). next_input_byte & bytes_in_buffer - * indicate where the restart point will be if the current call returns FALSE. - * Data beyond this point must be rescanned after resumption, so move it to - * the front of the buffer rather than discarding it. - */ - -METHODDEF(boolean) -fill_input_buffer (j_decompress_ptr cinfo) -{ - my_src_ptr src = (my_src_ptr) cinfo->src; - size_t nbytes; - - nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE); - - if (nbytes <= 0) { - if (src->start_of_file) /* Treat empty input file as fatal error */ - ERREXIT(cinfo, JERR_INPUT_EMPTY); - WARNMS(cinfo, JWRN_JPEG_EOF); - /* Insert a fake EOI marker */ - src->buffer[0] = (JOCTET) 0xFF; - src->buffer[1] = (JOCTET) JPEG_EOI; - nbytes = 2; - } - - src->pub.next_input_byte = src->buffer; - src->pub.bytes_in_buffer = nbytes; - src->start_of_file = FALSE; - - return TRUE; -} - - -/* - * Skip data --- used to skip over a potentially large amount of - * uninteresting data (such as an APPn marker). - * - * Writers of suspendable-input applications must note that skip_input_data - * is not granted the right to give a suspension return. If the skip extends - * beyond the data currently in the buffer, the buffer can be marked empty so - * that the next read will cause a fill_input_buffer call that can suspend. - * Arranging for additional bytes to be discarded before reloading the input - * buffer is the application writer's problem. - */ - -METHODDEF(void) -skip_input_data (j_decompress_ptr cinfo, long num_bytes) -{ - my_src_ptr src = (my_src_ptr) cinfo->src; - - /* Just a dumb implementation for now. Could use fseek() except - * it doesn't work on pipes. Not clear that being smart is worth - * any trouble anyway --- large skips are infrequent. - */ - if (num_bytes > 0) { - while (num_bytes > (long) src->pub.bytes_in_buffer) { - num_bytes -= (long) src->pub.bytes_in_buffer; - (void) fill_input_buffer(cinfo); - /* note we assume that fill_input_buffer will never return FALSE, - * so suspension need not be handled. - */ - } - src->pub.next_input_byte += (size_t) num_bytes; - src->pub.bytes_in_buffer -= (size_t) num_bytes; - } -} - - -/* - * An additional method that can be provided by data source modules is the - * resync_to_restart method for error recovery in the presence of RST markers. - * For the moment, this source module just uses the default resync method - * provided by the JPEG library. That method assumes that no backtracking - * is possible. - */ - - -/* - * Terminate source --- called by jpeg_finish_decompress - * after all data has been read. Often a no-op. - * - * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding - * application must deal with any cleanup that should happen even - * for error exit. - */ - -METHODDEF(void) -term_source (j_decompress_ptr cinfo) -{ - /* no work necessary here */ -} - - -/* - * Prepare for input from a stdio stream. - * The caller must have already opened the stream, and is responsible - * for closing it after finishing decompression. - */ - -GLOBAL(void) -jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile) -{ - my_src_ptr src; - - /* The source object and input buffer are made permanent so that a series - * of JPEG images can be read from the same file by calling jpeg_stdio_src - * only before the first one. (If we discarded the buffer at the end of - * one image, we'd likely lose the start of the next one.) - * This makes it unsafe to use this manager and a different source - * manager serially with the same JPEG object. Caveat programmer. - */ - if (cinfo->src == NULL) { /* first time for this JPEG object? */ - cinfo->src = (struct jpeg_source_mgr *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - SIZEOF(my_source_mgr)); - src = (my_src_ptr) cinfo->src; - src->buffer = (JOCTET *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - INPUT_BUF_SIZE * SIZEOF(JOCTET)); - } - - src = (my_src_ptr) cinfo->src; - src->pub.init_source = init_source; - src->pub.fill_input_buffer = fill_input_buffer; - src->pub.skip_input_data = skip_input_data; - src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ - src->pub.term_source = term_source; - src->infile = infile; - src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ - src->pub.next_input_byte = NULL; /* until buffer loaded */ -} diff --git a/src/SFML/Graphics/libjpeg/jdcoefct.c b/src/SFML/Graphics/libjpeg/jdcoefct.c deleted file mode 100644 index 992bd105..00000000 --- a/src/SFML/Graphics/libjpeg/jdcoefct.c +++ /dev/null @@ -1,736 +0,0 @@ -/* - * jdcoefct.c - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the coefficient buffer controller for decompression. - * This controller is the top level of the JPEG decompressor proper. - * The coefficient buffer lies between entropy decoding and inverse-DCT steps. - * - * In buffered-image mode, this controller is the interface between - * input-oriented processing and output-oriented processing. - * Also, the input side (only) is used when reading a file for transcoding. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - -/* Block smoothing is only applicable for progressive JPEG, so: */ -#ifndef D_PROGRESSIVE_SUPPORTED -#undef BLOCK_SMOOTHING_SUPPORTED -#endif - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_d_coef_controller pub; /* public fields */ - - /* These variables keep track of the current location of the input side. */ - /* cinfo->input_iMCU_row is also used for this. */ - JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ - int MCU_vert_offset; /* counts MCU rows within iMCU row */ - int MCU_rows_per_iMCU_row; /* number of such rows needed */ - - /* The output side's location is represented by cinfo->output_iMCU_row. */ - - /* In single-pass modes, it's sufficient to buffer just one MCU. - * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, - * and let the entropy decoder write into that workspace each time. - * (On 80x86, the workspace is FAR even though it's not really very big; - * this is to keep the module interfaces unchanged when a large coefficient - * buffer is necessary.) - * In multi-pass modes, this array points to the current MCU's blocks - * within the virtual arrays; it is used only by the input side. - */ - JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU]; - -#ifdef D_MULTISCAN_FILES_SUPPORTED - /* In multi-pass modes, we need a virtual block array for each component. */ - jvirt_barray_ptr whole_image[MAX_COMPONENTS]; -#endif - -#ifdef BLOCK_SMOOTHING_SUPPORTED - /* When doing block smoothing, we latch coefficient Al values here */ - int * coef_bits_latch; -#define SAVED_COEFS 6 /* we save coef_bits[0..5] */ -#endif -} my_coef_controller; - -typedef my_coef_controller * my_coef_ptr; - -/* Forward declarations */ -METHODDEF(int) decompress_onepass - JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); -#ifdef D_MULTISCAN_FILES_SUPPORTED -METHODDEF(int) decompress_data - JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); -#endif -#ifdef BLOCK_SMOOTHING_SUPPORTED -LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo)); -METHODDEF(int) decompress_smooth_data - JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); -#endif - - -LOCAL(void) -start_iMCU_row (j_decompress_ptr cinfo) -/* Reset within-iMCU-row counters for a new row (input side) */ -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - - /* In an interleaved scan, an MCU row is the same as an iMCU row. - * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. - * But at the bottom of the image, process only what's left. - */ - if (cinfo->comps_in_scan > 1) { - coef->MCU_rows_per_iMCU_row = 1; - } else { - if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1)) - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; - else - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; - } - - coef->MCU_ctr = 0; - coef->MCU_vert_offset = 0; -} - - -/* - * Initialize for an input processing pass. - */ - -METHODDEF(void) -start_input_pass (j_decompress_ptr cinfo) -{ - cinfo->input_iMCU_row = 0; - start_iMCU_row(cinfo); -} - - -/* - * Initialize for an output processing pass. - */ - -METHODDEF(void) -start_output_pass (j_decompress_ptr cinfo) -{ -#ifdef BLOCK_SMOOTHING_SUPPORTED - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - - /* If multipass, check to see whether to use block smoothing on this pass */ - if (coef->pub.coef_arrays != NULL) { - if (cinfo->do_block_smoothing && smoothing_ok(cinfo)) - coef->pub.decompress_data = decompress_smooth_data; - else - coef->pub.decompress_data = decompress_data; - } -#endif - cinfo->output_iMCU_row = 0; -} - - -/* - * Decompress and return some data in the single-pass case. - * Always attempts to emit one fully interleaved MCU row ("iMCU" row). - * Input and output must run in lockstep since we have only a one-MCU buffer. - * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. - * - * NB: output_buf contains a plane for each component in image, - * which we index according to the component's SOF position. - */ - -METHODDEF(int) -decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - int blkn, ci, xindex, yindex, yoffset, useful_width; - JSAMPARRAY output_ptr; - JDIMENSION start_col, output_col; - jpeg_component_info *compptr; - inverse_DCT_method_ptr inverse_DCT; - - /* Loop to process as much as one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; - MCU_col_num++) { - /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ - jzero_far((void FAR *) coef->MCU_buffer[0], - (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); - if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->MCU_ctr = MCU_col_num; - return JPEG_SUSPENDED; - } - /* Determine where data should go in output_buf and do the IDCT thing. - * We skip dummy blocks at the right and bottom edges (but blkn gets - * incremented past them!). Note the inner loop relies on having - * allocated the MCU_buffer[] blocks sequentially. - */ - blkn = 0; /* index of current DCT block within MCU */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Don't bother to IDCT an uninteresting component. */ - if (! compptr->component_needed) { - blkn += compptr->MCU_blocks; - continue; - } - inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index]; - useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width - : compptr->last_col_width; - output_ptr = output_buf[compptr->component_index] + - yoffset * compptr->DCT_scaled_size; - start_col = MCU_col_num * compptr->MCU_sample_width; - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - if (cinfo->input_iMCU_row < last_iMCU_row || - yoffset+yindex < compptr->last_row_height) { - output_col = start_col; - for (xindex = 0; xindex < useful_width; xindex++) { - (*inverse_DCT) (cinfo, compptr, - (JCOEFPTR) coef->MCU_buffer[blkn+xindex], - output_ptr, output_col); - output_col += compptr->DCT_scaled_size; - } - } - blkn += compptr->MCU_width; - output_ptr += compptr->DCT_scaled_size; - } - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->MCU_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - cinfo->output_iMCU_row++; - if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { - start_iMCU_row(cinfo); - return JPEG_ROW_COMPLETED; - } - /* Completed the scan */ - (*cinfo->inputctl->finish_input_pass) (cinfo); - return JPEG_SCAN_COMPLETED; -} - - -/* - * Dummy consume-input routine for single-pass operation. - */ - -METHODDEF(int) -dummy_consume_data (j_decompress_ptr cinfo) -{ - return JPEG_SUSPENDED; /* Always indicate nothing was done */ -} - - -#ifdef D_MULTISCAN_FILES_SUPPORTED - -/* - * Consume input data and store it in the full-image coefficient buffer. - * We read as much as one fully interleaved MCU row ("iMCU" row) per call, - * ie, v_samp_factor block rows for each component in the scan. - * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. - */ - -METHODDEF(int) -consume_data (j_decompress_ptr cinfo) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - int blkn, ci, xindex, yindex, yoffset; - JDIMENSION start_col; - JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; - JBLOCKROW buffer_ptr; - jpeg_component_info *compptr; - - /* Align the virtual buffers for the components used in this scan. */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - buffer[ci] = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], - cinfo->input_iMCU_row * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, TRUE); - /* Note: entropy decoder expects buffer to be zeroed, - * but this is handled automatically by the memory manager - * because we requested a pre-zeroed array. - */ - } - - /* Loop to process one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; - MCU_col_num++) { - /* Construct list of pointers to DCT blocks belonging to this MCU */ - blkn = 0; /* index of current DCT block within MCU */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - start_col = MCU_col_num * compptr->MCU_width; - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - buffer_ptr = buffer[ci][yindex+yoffset] + start_col; - for (xindex = 0; xindex < compptr->MCU_width; xindex++) { - coef->MCU_buffer[blkn++] = buffer_ptr++; - } - } - } - /* Try to fetch the MCU. */ - if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->MCU_ctr = MCU_col_num; - return JPEG_SUSPENDED; - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->MCU_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { - start_iMCU_row(cinfo); - return JPEG_ROW_COMPLETED; - } - /* Completed the scan */ - (*cinfo->inputctl->finish_input_pass) (cinfo); - return JPEG_SCAN_COMPLETED; -} - - -/* - * Decompress and return some data in the multi-pass case. - * Always attempts to emit one fully interleaved MCU row ("iMCU" row). - * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. - * - * NB: output_buf contains a plane for each component in image. - */ - -METHODDEF(int) -decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - JDIMENSION block_num; - int ci, block_row, block_rows; - JBLOCKARRAY buffer; - JBLOCKROW buffer_ptr; - JSAMPARRAY output_ptr; - JDIMENSION output_col; - jpeg_component_info *compptr; - inverse_DCT_method_ptr inverse_DCT; - - /* Force some input to be done if we are getting ahead of the input. */ - while (cinfo->input_scan_number < cinfo->output_scan_number || - (cinfo->input_scan_number == cinfo->output_scan_number && - cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) { - if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) - return JPEG_SUSPENDED; - } - - /* OK, output from the virtual arrays. */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Don't bother to IDCT an uninteresting component. */ - if (! compptr->component_needed) - continue; - /* Align the virtual buffer for this component. */ - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[ci], - cinfo->output_iMCU_row * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - /* Count non-dummy DCT block rows in this iMCU row. */ - if (cinfo->output_iMCU_row < last_iMCU_row) - block_rows = compptr->v_samp_factor; - else { - /* NB: can't use last_row_height here; it is input-side-dependent! */ - block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (block_rows == 0) block_rows = compptr->v_samp_factor; - } - inverse_DCT = cinfo->idct->inverse_DCT[ci]; - output_ptr = output_buf[ci]; - /* Loop over all DCT blocks to be processed. */ - for (block_row = 0; block_row < block_rows; block_row++) { - buffer_ptr = buffer[block_row]; - output_col = 0; - for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) { - (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr, - output_ptr, output_col); - buffer_ptr++; - output_col += compptr->DCT_scaled_size; - } - output_ptr += compptr->DCT_scaled_size; - } - } - - if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) - return JPEG_ROW_COMPLETED; - return JPEG_SCAN_COMPLETED; -} - -#endif /* D_MULTISCAN_FILES_SUPPORTED */ - - -#ifdef BLOCK_SMOOTHING_SUPPORTED - -/* - * This code applies interblock smoothing as described by section K.8 - * of the JPEG standard: the first 5 AC coefficients are estimated from - * the DC values of a DCT block and its 8 neighboring blocks. - * We apply smoothing only for progressive JPEG decoding, and only if - * the coefficients it can estimate are not yet known to full precision. - */ - -/* Natural-order array positions of the first 5 zigzag-order coefficients */ -#define Q01_POS 1 -#define Q10_POS 8 -#define Q20_POS 16 -#define Q11_POS 9 -#define Q02_POS 2 - -/* - * Determine whether block smoothing is applicable and safe. - * We also latch the current states of the coef_bits[] entries for the - * AC coefficients; otherwise, if the input side of the decompressor - * advances into a new scan, we might think the coefficients are known - * more accurately than they really are. - */ - -LOCAL(boolean) -smoothing_ok (j_decompress_ptr cinfo) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - boolean smoothing_useful = FALSE; - int ci, coefi; - jpeg_component_info *compptr; - JQUANT_TBL * qtable; - int * coef_bits; - int * coef_bits_latch; - - if (! cinfo->progressive_mode || cinfo->coef_bits == NULL) - return FALSE; - - /* Allocate latch area if not already done */ - if (coef->coef_bits_latch == NULL) - coef->coef_bits_latch = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components * - (SAVED_COEFS * SIZEOF(int))); - coef_bits_latch = coef->coef_bits_latch; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* All components' quantization values must already be latched. */ - if ((qtable = compptr->quant_table) == NULL) - return FALSE; - /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ - if (qtable->quantval[0] == 0 || - qtable->quantval[Q01_POS] == 0 || - qtable->quantval[Q10_POS] == 0 || - qtable->quantval[Q20_POS] == 0 || - qtable->quantval[Q11_POS] == 0 || - qtable->quantval[Q02_POS] == 0) - return FALSE; - /* DC values must be at least partly known for all components. */ - coef_bits = cinfo->coef_bits[ci]; - if (coef_bits[0] < 0) - return FALSE; - /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ - for (coefi = 1; coefi <= 5; coefi++) { - coef_bits_latch[coefi] = coef_bits[coefi]; - if (coef_bits[coefi] != 0) - smoothing_useful = TRUE; - } - coef_bits_latch += SAVED_COEFS; - } - - return smoothing_useful; -} - - -/* - * Variant of decompress_data for use when doing block smoothing. - */ - -METHODDEF(int) -decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - JDIMENSION block_num, last_block_column; - int ci, block_row, block_rows, access_rows; - JBLOCKARRAY buffer; - JBLOCKROW buffer_ptr, prev_block_row, next_block_row; - JSAMPARRAY output_ptr; - JDIMENSION output_col; - jpeg_component_info *compptr; - inverse_DCT_method_ptr inverse_DCT; - boolean first_row, last_row; - JBLOCK workspace; - int *coef_bits; - JQUANT_TBL *quanttbl; - INT32 Q00,Q01,Q02,Q10,Q11,Q20, num; - int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9; - int Al, pred; - - /* Force some input to be done if we are getting ahead of the input. */ - while (cinfo->input_scan_number <= cinfo->output_scan_number && - ! cinfo->inputctl->eoi_reached) { - if (cinfo->input_scan_number == cinfo->output_scan_number) { - /* If input is working on current scan, we ordinarily want it to - * have completed the current row. But if input scan is DC, - * we want it to keep one row ahead so that next block row's DC - * values are up to date. - */ - JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0; - if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta) - break; - } - if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) - return JPEG_SUSPENDED; - } - - /* OK, output from the virtual arrays. */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Don't bother to IDCT an uninteresting component. */ - if (! compptr->component_needed) - continue; - /* Count non-dummy DCT block rows in this iMCU row. */ - if (cinfo->output_iMCU_row < last_iMCU_row) { - block_rows = compptr->v_samp_factor; - access_rows = block_rows * 2; /* this and next iMCU row */ - last_row = FALSE; - } else { - /* NB: can't use last_row_height here; it is input-side-dependent! */ - block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (block_rows == 0) block_rows = compptr->v_samp_factor; - access_rows = block_rows; /* this iMCU row only */ - last_row = TRUE; - } - /* Align the virtual buffer for this component. */ - if (cinfo->output_iMCU_row > 0) { - access_rows += compptr->v_samp_factor; /* prior iMCU row too */ - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[ci], - (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor, - (JDIMENSION) access_rows, FALSE); - buffer += compptr->v_samp_factor; /* point to current iMCU row */ - first_row = FALSE; - } else { - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[ci], - (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE); - first_row = TRUE; - } - /* Fetch component-dependent info */ - coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); - quanttbl = compptr->quant_table; - Q00 = quanttbl->quantval[0]; - Q01 = quanttbl->quantval[Q01_POS]; - Q10 = quanttbl->quantval[Q10_POS]; - Q20 = quanttbl->quantval[Q20_POS]; - Q11 = quanttbl->quantval[Q11_POS]; - Q02 = quanttbl->quantval[Q02_POS]; - inverse_DCT = cinfo->idct->inverse_DCT[ci]; - output_ptr = output_buf[ci]; - /* Loop over all DCT blocks to be processed. */ - for (block_row = 0; block_row < block_rows; block_row++) { - buffer_ptr = buffer[block_row]; - if (first_row && block_row == 0) - prev_block_row = buffer_ptr; - else - prev_block_row = buffer[block_row-1]; - if (last_row && block_row == block_rows-1) - next_block_row = buffer_ptr; - else - next_block_row = buffer[block_row+1]; - /* We fetch the surrounding DC values using a sliding-register approach. - * Initialize all nine here so as to do the right thing on narrow pics. - */ - DC1 = DC2 = DC3 = (int) prev_block_row[0][0]; - DC4 = DC5 = DC6 = (int) buffer_ptr[0][0]; - DC7 = DC8 = DC9 = (int) next_block_row[0][0]; - output_col = 0; - last_block_column = compptr->width_in_blocks - 1; - for (block_num = 0; block_num <= last_block_column; block_num++) { - /* Fetch current DCT block into workspace so we can modify it. */ - jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1); - /* Update DC values */ - if (block_num < last_block_column) { - DC3 = (int) prev_block_row[1][0]; - DC6 = (int) buffer_ptr[1][0]; - DC9 = (int) next_block_row[1][0]; - } - /* Compute coefficient estimates per K.8. - * An estimate is applied only if coefficient is still zero, - * and is not known to be fully accurate. - */ - /* AC01 */ - if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) { - num = 36 * Q00 * (DC4 - DC6); - if (num >= 0) { - pred = (int) (((Q01<<7) + num) / (Q01<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { - pred = (int) (((Q10<<7) + num) / (Q10<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { - pred = (int) (((Q20<<7) + num) / (Q20<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { - pred = (int) (((Q11<<7) + num) / (Q11<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { - pred = (int) (((Q02<<7) + num) / (Q02<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<DCT_scaled_size; - } - output_ptr += compptr->DCT_scaled_size; - } - } - - if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) - return JPEG_ROW_COMPLETED; - return JPEG_SCAN_COMPLETED; -} - -#endif /* BLOCK_SMOOTHING_SUPPORTED */ - - -/* - * Initialize coefficient buffer controller. - */ - -GLOBAL(void) -jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) -{ - my_coef_ptr coef; - - coef = (my_coef_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_coef_controller)); - cinfo->coef = (struct jpeg_d_coef_controller *) coef; - coef->pub.start_input_pass = start_input_pass; - coef->pub.start_output_pass = start_output_pass; -#ifdef BLOCK_SMOOTHING_SUPPORTED - coef->coef_bits_latch = NULL; -#endif - - /* Create the coefficient buffer. */ - if (need_full_buffer) { -#ifdef D_MULTISCAN_FILES_SUPPORTED - /* Allocate a full-image virtual array for each component, */ - /* padded to a multiple of samp_factor DCT blocks in each direction. */ - /* Note we ask for a pre-zeroed array. */ - int ci, access_rows; - jpeg_component_info *compptr; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - access_rows = compptr->v_samp_factor; -#ifdef BLOCK_SMOOTHING_SUPPORTED - /* If block smoothing could be used, need a bigger window */ - if (cinfo->progressive_mode) - access_rows *= 3; -#endif - coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE, - (JDIMENSION) jround_up((long) compptr->width_in_blocks, - (long) compptr->h_samp_factor), - (JDIMENSION) jround_up((long) compptr->height_in_blocks, - (long) compptr->v_samp_factor), - (JDIMENSION) access_rows); - } - coef->pub.consume_data = consume_data; - coef->pub.decompress_data = decompress_data; - coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */ -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - /* We only need a single-MCU buffer. */ - JBLOCKROW buffer; - int i; - - buffer = (JBLOCKROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { - coef->MCU_buffer[i] = buffer + i; - } - coef->pub.consume_data = dummy_consume_data; - coef->pub.decompress_data = decompress_onepass; - coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ - } -} diff --git a/src/SFML/Graphics/libjpeg/jdcolor.c b/src/SFML/Graphics/libjpeg/jdcolor.c deleted file mode 100644 index fd7b1388..00000000 --- a/src/SFML/Graphics/libjpeg/jdcolor.c +++ /dev/null @@ -1,396 +0,0 @@ -/* - * jdcolor.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains output colorspace conversion routines. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private subobject */ - -typedef struct { - struct jpeg_color_deconverter pub; /* public fields */ - - /* Private state for YCC->RGB conversion */ - int * Cr_r_tab; /* => table for Cr to R conversion */ - int * Cb_b_tab; /* => table for Cb to B conversion */ - INT32 * Cr_g_tab; /* => table for Cr to G conversion */ - INT32 * Cb_g_tab; /* => table for Cb to G conversion */ -} my_color_deconverter; - -typedef my_color_deconverter * my_cconvert_ptr; - - -/**************** YCbCr -> RGB conversion: most common case **************/ - -/* - * YCbCr is defined per CCIR 601-1, except that Cb and Cr are - * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. - * The conversion equations to be implemented are therefore - * R = Y + 1.40200 * Cr - * G = Y - 0.34414 * Cb - 0.71414 * Cr - * B = Y + 1.77200 * Cb - * where Cb and Cr represent the incoming values less CENTERJSAMPLE. - * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) - * - * To avoid floating-point arithmetic, we represent the fractional constants - * as integers scaled up by 2^16 (about 4 digits precision); we have to divide - * the products by 2^16, with appropriate rounding, to get the correct answer. - * Notice that Y, being an integral input, does not contribute any fraction - * so it need not participate in the rounding. - * - * For even more speed, we avoid doing any multiplications in the inner loop - * by precalculating the constants times Cb and Cr for all possible values. - * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); - * for 12-bit samples it is still acceptable. It's not very reasonable for - * 16-bit samples, but if you want lossless storage you shouldn't be changing - * colorspace anyway. - * The Cr=>R and Cb=>B values can be rounded to integers in advance; the - * values for the G calculation are left scaled up, since we must add them - * together before rounding. - */ - -#define SCALEBITS 16 /* speediest right-shift on some machines */ -#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) -#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. - */ - -LOCAL(void) -build_ycc_rgb_table (j_decompress_ptr cinfo) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - int i; - INT32 x; - SHIFT_TEMPS - - cconvert->Cr_r_tab = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(int)); - cconvert->Cb_b_tab = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(int)); - cconvert->Cr_g_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(INT32)); - cconvert->Cb_g_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(INT32)); - - for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { - /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ - /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ - /* Cr=>R value is nearest int to 1.40200 * x */ - cconvert->Cr_r_tab[i] = (int) - RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); - /* Cb=>B value is nearest int to 1.77200 * x */ - cconvert->Cb_b_tab[i] = (int) - RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); - /* Cr=>G value is scaled-up -0.71414 * x */ - cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x; - /* Cb=>G value is scaled-up -0.34414 * x */ - /* We also add in ONE_HALF so that need not do it in inner loop */ - cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; - } -} - - -/* - * Convert some rows of samples to the output colorspace. - * - * Note that we change from noninterleaved, one-plane-per-component format - * to interleaved-pixel format. The output buffer is therefore three times - * as wide as the input buffer. - * A starting row offset is provided only for the input buffer. The caller - * can easily adjust the passed output_buf value to accommodate any row - * offset required on that side. - */ - -METHODDEF(void) -ycc_rgb_convert (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - register int y, cb, cr; - register JSAMPROW outptr; - register JSAMPROW inptr0, inptr1, inptr2; - register JDIMENSION col; - JDIMENSION num_cols = cinfo->output_width; - /* copy these pointers into registers if possible */ - register JSAMPLE * range_limit = cinfo->sample_range_limit; - register int * Crrtab = cconvert->Cr_r_tab; - register int * Cbbtab = cconvert->Cb_b_tab; - register INT32 * Crgtab = cconvert->Cr_g_tab; - register INT32 * Cbgtab = cconvert->Cb_g_tab; - SHIFT_TEMPS - - while (--num_rows >= 0) { - inptr0 = input_buf[0][input_row]; - inptr1 = input_buf[1][input_row]; - inptr2 = input_buf[2][input_row]; - input_row++; - outptr = *output_buf++; - for (col = 0; col < num_cols; col++) { - y = GETJSAMPLE(inptr0[col]); - cb = GETJSAMPLE(inptr1[col]); - cr = GETJSAMPLE(inptr2[col]); - /* Range-limiting is essential due to noise introduced by DCT losses. */ - outptr[RGB_RED] = range_limit[y + Crrtab[cr]]; - outptr[RGB_GREEN] = range_limit[y + - ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], - SCALEBITS))]; - outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]]; - outptr += RGB_PIXELSIZE; - } - } -} - - -/**************** Cases other than YCbCr -> RGB **************/ - - -/* - * Color conversion for no colorspace change: just copy the data, - * converting from separate-planes to interleaved representation. - */ - -METHODDEF(void) -null_convert (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - register JSAMPROW inptr, outptr; - register JDIMENSION count; - register int num_components = cinfo->num_components; - JDIMENSION num_cols = cinfo->output_width; - int ci; - - while (--num_rows >= 0) { - for (ci = 0; ci < num_components; ci++) { - inptr = input_buf[ci][input_row]; - outptr = output_buf[0] + ci; - for (count = num_cols; count > 0; count--) { - *outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */ - outptr += num_components; - } - } - input_row++; - output_buf++; - } -} - - -/* - * Color conversion for grayscale: just copy the data. - * This also works for YCbCr -> grayscale conversion, in which - * we just copy the Y (luminance) component and ignore chrominance. - */ - -METHODDEF(void) -grayscale_convert (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0, - num_rows, cinfo->output_width); -} - - -/* - * Convert grayscale to RGB: just duplicate the graylevel three times. - * This is provided to support applications that don't want to cope - * with grayscale as a separate case. - */ - -METHODDEF(void) -gray_rgb_convert (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - register JSAMPROW inptr, outptr; - register JDIMENSION col; - JDIMENSION num_cols = cinfo->output_width; - - while (--num_rows >= 0) { - inptr = input_buf[0][input_row++]; - outptr = *output_buf++; - for (col = 0; col < num_cols; col++) { - /* We can dispense with GETJSAMPLE() here */ - outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col]; - outptr += RGB_PIXELSIZE; - } - } -} - - -/* - * Adobe-style YCCK->CMYK conversion. - * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same - * conversion as above, while passing K (black) unchanged. - * We assume build_ycc_rgb_table has been called. - */ - -METHODDEF(void) -ycck_cmyk_convert (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - register int y, cb, cr; - register JSAMPROW outptr; - register JSAMPROW inptr0, inptr1, inptr2, inptr3; - register JDIMENSION col; - JDIMENSION num_cols = cinfo->output_width; - /* copy these pointers into registers if possible */ - register JSAMPLE * range_limit = cinfo->sample_range_limit; - register int * Crrtab = cconvert->Cr_r_tab; - register int * Cbbtab = cconvert->Cb_b_tab; - register INT32 * Crgtab = cconvert->Cr_g_tab; - register INT32 * Cbgtab = cconvert->Cb_g_tab; - SHIFT_TEMPS - - while (--num_rows >= 0) { - inptr0 = input_buf[0][input_row]; - inptr1 = input_buf[1][input_row]; - inptr2 = input_buf[2][input_row]; - inptr3 = input_buf[3][input_row]; - input_row++; - outptr = *output_buf++; - for (col = 0; col < num_cols; col++) { - y = GETJSAMPLE(inptr0[col]); - cb = GETJSAMPLE(inptr1[col]); - cr = GETJSAMPLE(inptr2[col]); - /* Range-limiting is essential due to noise introduced by DCT losses. */ - outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */ - outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */ - ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], - SCALEBITS)))]; - outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */ - /* K passes through unchanged */ - outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */ - outptr += 4; - } - } -} - - -/* - * Empty method for start_pass. - */ - -METHODDEF(void) -start_pass_dcolor (j_decompress_ptr cinfo) -{ - /* no work needed */ -} - - -/* - * Module initialization routine for output colorspace conversion. - */ - -GLOBAL(void) -jinit_color_deconverter (j_decompress_ptr cinfo) -{ - my_cconvert_ptr cconvert; - int ci; - - cconvert = (my_cconvert_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_color_deconverter)); - cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert; - cconvert->pub.start_pass = start_pass_dcolor; - - /* Make sure num_components agrees with jpeg_color_space */ - switch (cinfo->jpeg_color_space) { - case JCS_GRAYSCALE: - if (cinfo->num_components != 1) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - break; - - case JCS_RGB: - case JCS_YCbCr: - if (cinfo->num_components != 3) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - break; - - case JCS_CMYK: - case JCS_YCCK: - if (cinfo->num_components != 4) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - break; - - default: /* JCS_UNKNOWN can be anything */ - if (cinfo->num_components < 1) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - break; - } - - /* Set out_color_components and conversion method based on requested space. - * Also clear the component_needed flags for any unused components, - * so that earlier pipeline stages can avoid useless computation. - */ - - switch (cinfo->out_color_space) { - case JCS_GRAYSCALE: - cinfo->out_color_components = 1; - if (cinfo->jpeg_color_space == JCS_GRAYSCALE || - cinfo->jpeg_color_space == JCS_YCbCr) { - cconvert->pub.color_convert = grayscale_convert; - /* For color->grayscale conversion, only the Y (0) component is needed */ - for (ci = 1; ci < cinfo->num_components; ci++) - cinfo->comp_info[ci].component_needed = FALSE; - } else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_RGB: - cinfo->out_color_components = RGB_PIXELSIZE; - if (cinfo->jpeg_color_space == JCS_YCbCr) { - cconvert->pub.color_convert = ycc_rgb_convert; - build_ycc_rgb_table(cinfo); - } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { - cconvert->pub.color_convert = gray_rgb_convert; - } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) { - cconvert->pub.color_convert = null_convert; - } else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_CMYK: - cinfo->out_color_components = 4; - if (cinfo->jpeg_color_space == JCS_YCCK) { - cconvert->pub.color_convert = ycck_cmyk_convert; - build_ycc_rgb_table(cinfo); - } else if (cinfo->jpeg_color_space == JCS_CMYK) { - cconvert->pub.color_convert = null_convert; - } else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - default: - /* Permit null conversion to same output space */ - if (cinfo->out_color_space == cinfo->jpeg_color_space) { - cinfo->out_color_components = cinfo->num_components; - cconvert->pub.color_convert = null_convert; - } else /* unsupported non-null conversion */ - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - } - - if (cinfo->quantize_colors) - cinfo->output_components = 1; /* single colormapped output component */ - else - cinfo->output_components = cinfo->out_color_components; -} diff --git a/src/SFML/Graphics/libjpeg/jdct.h b/src/SFML/Graphics/libjpeg/jdct.h deleted file mode 100644 index b664cab0..00000000 --- a/src/SFML/Graphics/libjpeg/jdct.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * jdct.h - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This include file contains common declarations for the forward and - * inverse DCT modules. These declarations are private to the DCT managers - * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms. - * The individual DCT algorithms are kept in separate files to ease - * machine-dependent tuning (e.g., assembly coding). - */ - - -/* - * A forward DCT routine is given a pointer to a work area of type DCTELEM[]; - * the DCT is to be performed in-place in that buffer. Type DCTELEM is int - * for 8-bit samples, INT32 for 12-bit samples. (NOTE: Floating-point DCT - * implementations use an array of type FAST_FLOAT, instead.) - * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE). - * The DCT outputs are returned scaled up by a factor of 8; they therefore - * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This - * convention improves accuracy in integer implementations and saves some - * work in floating-point ones. - * Quantization of the output coefficients is done by jcdctmgr.c. - */ - -#if BITS_IN_JSAMPLE == 8 -typedef int DCTELEM; /* 16 or 32 bits is fine */ -#else -typedef INT32 DCTELEM; /* must have 32 bits */ -#endif - -typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data)); -typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data)); - - -/* - * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer - * to an output sample array. The routine must dequantize the input data as - * well as perform the IDCT; for dequantization, it uses the multiplier table - * pointed to by compptr->dct_table. The output data is to be placed into the - * sample array starting at a specified column. (Any row offset needed will - * be applied to the array pointer before it is passed to the IDCT code.) - * Note that the number of samples emitted by the IDCT routine is - * DCT_scaled_size * DCT_scaled_size. - */ - -/* typedef inverse_DCT_method_ptr is declared in jpegint.h */ - -/* - * Each IDCT routine has its own ideas about the best dct_table element type. - */ - -typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */ -#if BITS_IN_JSAMPLE == 8 -typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */ -#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */ -#else -typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */ -#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */ -#endif -typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */ - - -/* - * Each IDCT routine is responsible for range-limiting its results and - * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could - * be quite far out of range if the input data is corrupt, so a bulletproof - * range-limiting step is required. We use a mask-and-table-lookup method - * to do the combined operations quickly. See the comments with - * prepare_range_limit_table (in jdmaster.c) for more info. - */ - -#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE) - -#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */ - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_fdct_islow jFDislow -#define jpeg_fdct_ifast jFDifast -#define jpeg_fdct_float jFDfloat -#define jpeg_idct_islow jRDislow -#define jpeg_idct_ifast jRDifast -#define jpeg_idct_float jRDfloat -#define jpeg_idct_4x4 jRD4x4 -#define jpeg_idct_2x2 jRD2x2 -#define jpeg_idct_1x1 jRD1x1 -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - -/* Extern declarations for the forward and inverse DCT routines. */ - -EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data)); -EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data)); -EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data)); - -EXTERN(void) jpeg_idct_islow - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_ifast - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_float - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_4x4 - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_2x2 - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_1x1 - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); - - -/* - * Macros for handling fixed-point arithmetic; these are used by many - * but not all of the DCT/IDCT modules. - * - * All values are expected to be of type INT32. - * Fractional constants are scaled left by CONST_BITS bits. - * CONST_BITS is defined within each module using these macros, - * and may differ from one module to the next. - */ - -#define ONE ((INT32) 1) -#define CONST_SCALE (ONE << CONST_BITS) - -/* Convert a positive real constant to an integer scaled by CONST_SCALE. - * Caution: some C compilers fail to reduce "FIX(constant)" at compile time, - * thus causing a lot of useless floating-point operations at run time. - */ - -#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) - -/* Descale and correctly round an INT32 value that's scaled by N bits. - * We assume RIGHT_SHIFT rounds towards minus infinity, so adding - * the fudge factor is correct for either sign of X. - */ - -#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * This macro is used only when the two inputs will actually be no more than - * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a - * full 32x32 multiply. This provides a useful speedup on many machines. - * Unfortunately there is no way to specify a 16x16->32 multiply portably - * in C, but some C compilers will do the right thing if you provide the - * correct combination of casts. - */ - -#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ -#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const))) -#endif -#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ -#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const))) -#endif - -#ifndef MULTIPLY16C16 /* default definition */ -#define MULTIPLY16C16(var,const) ((var) * (const)) -#endif - -/* Same except both inputs are variables. */ - -#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ -#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2))) -#endif - -#ifndef MULTIPLY16V16 /* default definition */ -#define MULTIPLY16V16(var1,var2) ((var1) * (var2)) -#endif diff --git a/src/SFML/Graphics/libjpeg/jddctmgr.c b/src/SFML/Graphics/libjpeg/jddctmgr.c deleted file mode 100644 index 0e44eb14..00000000 --- a/src/SFML/Graphics/libjpeg/jddctmgr.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * jddctmgr.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the inverse-DCT management logic. - * This code selects a particular IDCT implementation to be used, - * and it performs related housekeeping chores. No code in this file - * is executed per IDCT step, only during output pass setup. - * - * Note that the IDCT routines are responsible for performing coefficient - * dequantization as well as the IDCT proper. This module sets up the - * dequantization multiplier table needed by the IDCT routine. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - - -/* - * The decompressor input side (jdinput.c) saves away the appropriate - * quantization table for each component at the start of the first scan - * involving that component. (This is necessary in order to correctly - * decode files that reuse Q-table slots.) - * When we are ready to make an output pass, the saved Q-table is converted - * to a multiplier table that will actually be used by the IDCT routine. - * The multiplier table contents are IDCT-method-dependent. To support - * application changes in IDCT method between scans, we can remake the - * multiplier tables if necessary. - * In buffered-image mode, the first output pass may occur before any data - * has been seen for some components, and thus before their Q-tables have - * been saved away. To handle this case, multiplier tables are preset - * to zeroes; the result of the IDCT will be a neutral gray level. - */ - - -/* Private subobject for this module */ - -typedef struct { - struct jpeg_inverse_dct pub; /* public fields */ - - /* This array contains the IDCT method code that each multiplier table - * is currently set up for, or -1 if it's not yet set up. - * The actual multiplier tables are pointed to by dct_table in the - * per-component comp_info structures. - */ - int cur_method[MAX_COMPONENTS]; -} my_idct_controller; - -typedef my_idct_controller * my_idct_ptr; - - -/* Allocated multiplier tables: big enough for any supported variant */ - -typedef union { - ISLOW_MULT_TYPE islow_array[DCTSIZE2]; -#ifdef DCT_IFAST_SUPPORTED - IFAST_MULT_TYPE ifast_array[DCTSIZE2]; -#endif -#ifdef DCT_FLOAT_SUPPORTED - FLOAT_MULT_TYPE float_array[DCTSIZE2]; -#endif -} multiplier_table; - - -/* The current scaled-IDCT routines require ISLOW-style multiplier tables, - * so be sure to compile that code if either ISLOW or SCALING is requested. - */ -#ifdef DCT_ISLOW_SUPPORTED -#define PROVIDE_ISLOW_TABLES -#else -#ifdef IDCT_SCALING_SUPPORTED -#define PROVIDE_ISLOW_TABLES -#endif -#endif - - -/* - * Prepare for an output pass. - * Here we select the proper IDCT routine for each component and build - * a matching multiplier table. - */ - -METHODDEF(void) -start_pass (j_decompress_ptr cinfo) -{ - my_idct_ptr idct = (my_idct_ptr) cinfo->idct; - int ci, i; - jpeg_component_info *compptr; - int method = 0; - inverse_DCT_method_ptr method_ptr = NULL; - JQUANT_TBL * qtbl; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Select the proper IDCT routine for this component's scaling */ - switch (compptr->DCT_scaled_size) { -#ifdef IDCT_SCALING_SUPPORTED - case 1: - method_ptr = jpeg_idct_1x1; - method = JDCT_ISLOW; /* jidctred uses islow-style table */ - break; - case 2: - method_ptr = jpeg_idct_2x2; - method = JDCT_ISLOW; /* jidctred uses islow-style table */ - break; - case 4: - method_ptr = jpeg_idct_4x4; - method = JDCT_ISLOW; /* jidctred uses islow-style table */ - break; -#endif - case DCTSIZE: - switch (cinfo->dct_method) { -#ifdef DCT_ISLOW_SUPPORTED - case JDCT_ISLOW: - method_ptr = jpeg_idct_islow; - method = JDCT_ISLOW; - break; -#endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - method_ptr = jpeg_idct_ifast; - method = JDCT_IFAST; - break; -#endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - method_ptr = jpeg_idct_float; - method = JDCT_FLOAT; - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - break; - default: - ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size); - break; - } - idct->pub.inverse_DCT[ci] = method_ptr; - /* Create multiplier table from quant table. - * However, we can skip this if the component is uninteresting - * or if we already built the table. Also, if no quant table - * has yet been saved for the component, we leave the - * multiplier table all-zero; we'll be reading zeroes from the - * coefficient controller's buffer anyway. - */ - if (! compptr->component_needed || idct->cur_method[ci] == method) - continue; - qtbl = compptr->quant_table; - if (qtbl == NULL) /* happens if no data yet for component */ - continue; - idct->cur_method[ci] = method; - switch (method) { -#ifdef PROVIDE_ISLOW_TABLES - case JDCT_ISLOW: - { - /* For LL&M IDCT method, multipliers are equal to raw quantization - * coefficients, but are stored as ints to ensure access efficiency. - */ - ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table; - for (i = 0; i < DCTSIZE2; i++) { - ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i]; - } - } - break; -#endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - { - /* For AA&N IDCT method, multipliers are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * For integer operation, the multiplier table is to be scaled by - * IFAST_SCALE_BITS. - */ - IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table; -#define CONST_BITS 14 - static const INT16 aanscales[DCTSIZE2] = { - /* precomputed values scaled up by 14 bits */ - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, - 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, - 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, - 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, - 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 - }; - SHIFT_TEMPS - - for (i = 0; i < DCTSIZE2; i++) { - ifmtbl[i] = (IFAST_MULT_TYPE) - DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], - (INT32) aanscales[i]), - CONST_BITS-IFAST_SCALE_BITS); - } - } - break; -#endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - { - /* For float AA&N IDCT method, multipliers are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - */ - FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table; - int row, col; - static const double aanscalefactor[DCTSIZE] = { - 1.0, 1.387039845, 1.306562965, 1.175875602, - 1.0, 0.785694958, 0.541196100, 0.275899379 - }; - - i = 0; - for (row = 0; row < DCTSIZE; row++) { - for (col = 0; col < DCTSIZE; col++) { - fmtbl[i] = (FLOAT_MULT_TYPE) - ((double) qtbl->quantval[i] * - aanscalefactor[row] * aanscalefactor[col]); - i++; - } - } - } - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - } -} - - -/* - * Initialize IDCT manager. - */ - -GLOBAL(void) -jinit_inverse_dct (j_decompress_ptr cinfo) -{ - my_idct_ptr idct; - int ci; - jpeg_component_info *compptr; - - idct = (my_idct_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_idct_controller)); - cinfo->idct = (struct jpeg_inverse_dct *) idct; - idct->pub.start_pass = start_pass; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Allocate and pre-zero a multiplier table for each component */ - compptr->dct_table = - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(multiplier_table)); - MEMZERO(compptr->dct_table, SIZEOF(multiplier_table)); - /* Mark multiplier table not yet set up for any method */ - idct->cur_method[ci] = -1; - } -} diff --git a/src/SFML/Graphics/libjpeg/jdhuff.c b/src/SFML/Graphics/libjpeg/jdhuff.c deleted file mode 100644 index b2ad66d4..00000000 --- a/src/SFML/Graphics/libjpeg/jdhuff.c +++ /dev/null @@ -1,651 +0,0 @@ -/* - * jdhuff.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy decoding routines. - * - * Much of the complexity here has to do with supporting input suspension. - * If the data source module demands suspension, we want to be able to back - * up to the start of the current MCU. To do this, we copy state variables - * into local working storage, and update them back to the permanent - * storage only upon successful completion of an MCU. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdhuff.h" /* Declarations shared with jdphuff.c */ - - -/* - * Expanded entropy decoder object for Huffman decoding. - * - * The savable_state subrecord contains fields that change within an MCU, - * but must not be updated permanently until we complete the MCU. - */ - -typedef struct { - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ -} savable_state; - -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest,src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest,src) \ - ((dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - -typedef struct { - struct jpeg_entropy_decoder pub; /* public fields */ - - /* These fields are loaded into local variables at start of each MCU. - * In case of suspension, we exit WITHOUT updating them. - */ - bitread_perm_state bitstate; /* Bit buffer at start of MCU */ - savable_state saved; /* Other state at start of MCU */ - - /* These fields are NOT loaded into local working state. */ - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - - /* Pointers to derived tables (these workspaces have image lifespan) */ - d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; - d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; - - /* Precalculated info set up by start_pass for use in decode_mcu: */ - - /* Pointers to derived tables to be used for each block within an MCU */ - d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU]; - d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU]; - /* Whether we care about the DC and AC coefficient values for each block */ - boolean dc_needed[D_MAX_BLOCKS_IN_MCU]; - boolean ac_needed[D_MAX_BLOCKS_IN_MCU]; -} huff_entropy_decoder; - -typedef huff_entropy_decoder * huff_entropy_ptr; - - -/* - * Initialize for a Huffman-compressed scan. - */ - -METHODDEF(void) -start_pass_huff_decoder (j_decompress_ptr cinfo) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int ci, blkn, dctbl, actbl; - jpeg_component_info * compptr; - - /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. - * This ought to be an error condition, but we make it a warning because - * there are some baseline files out there with all zeroes in these bytes. - */ - if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 || - cinfo->Ah != 0 || cinfo->Al != 0) - WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - dctbl = compptr->dc_tbl_no; - actbl = compptr->ac_tbl_no; - /* Compute derived values for Huffman tables */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl, - & entropy->dc_derived_tbls[dctbl]); - jpeg_make_d_derived_tbl(cinfo, FALSE, actbl, - & entropy->ac_derived_tbls[actbl]); - /* Initialize DC predictions to 0 */ - entropy->saved.last_dc_val[ci] = 0; - } - - /* Precalculate decoding info for each block in an MCU of this scan */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - /* Precalculate which table to use for each block */ - entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no]; - entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no]; - /* Decide whether we really care about the coefficient values */ - if (compptr->component_needed) { - entropy->dc_needed[blkn] = TRUE; - /* we don't need the ACs if producing a 1/8th-size image */ - entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1); - } else { - entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE; - } - } - - /* Initialize bitread state variables */ - entropy->bitstate.bits_left = 0; - entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ - entropy->pub.insufficient_data = FALSE; - - /* Initialize restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; -} - - -/* - * Compute the derived values for a Huffman table. - * This routine also performs some validation checks on the table. - * - * Note this is also used by jdphuff.c. - */ - -GLOBAL(void) -jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno, - d_derived_tbl ** pdtbl) -{ - JHUFF_TBL *htbl; - d_derived_tbl *dtbl; - int p, i, l, si, numsymbols; - int lookbits, ctr; - char huffsize[257]; - unsigned int huffcode[257]; - unsigned int code; - - /* Note that huffsize[] and huffcode[] are filled in code-length order, - * paralleling the order of the symbols themselves in htbl->huffval[]. - */ - - /* Find the input Huffman table */ - if (tblno < 0 || tblno >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); - htbl = - isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; - if (htbl == NULL) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); - - /* Allocate a workspace if we haven't already done so. */ - if (*pdtbl == NULL) - *pdtbl = (d_derived_tbl *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(d_derived_tbl)); - dtbl = *pdtbl; - dtbl->pub = htbl; /* fill in back link */ - - /* Figure C.1: make table of Huffman code length for each symbol */ - - p = 0; - for (l = 1; l <= 16; l++) { - i = (int) htbl->bits[l]; - if (i < 0 || p + i > 256) /* protect against table overrun */ - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - while (i--) - huffsize[p++] = (char) l; - } - huffsize[p] = 0; - numsymbols = p; - - /* Figure C.2: generate the codes themselves */ - /* We also validate that the counts represent a legal Huffman code tree. */ - - code = 0; - si = huffsize[0]; - p = 0; - while (huffsize[p]) { - while (((int) huffsize[p]) == si) { - huffcode[p++] = code; - code++; - } - /* code is now 1 more than the last code used for codelength si; but - * it must still fit in si bits, since no code is allowed to be all ones. - */ - if (((INT32) code) >= (((INT32) 1) << si)) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - code <<= 1; - si++; - } - - /* Figure F.15: generate decoding tables for bit-sequential decoding */ - - p = 0; - for (l = 1; l <= 16; l++) { - if (htbl->bits[l]) { - /* valoffset[l] = huffval[] index of 1st symbol of code length l, - * minus the minimum code of length l - */ - dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p]; - p += htbl->bits[l]; - dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */ - } else { - dtbl->maxcode[l] = -1; /* -1 if no codes of this length */ - } - } - dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */ - - /* Compute lookahead tables to speed up decoding. - * First we set all the table entries to 0, indicating "too long"; - * then we iterate through the Huffman codes that are short enough and - * fill in all the entries that correspond to bit sequences starting - * with that code. - */ - - MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits)); - - p = 0; - for (l = 1; l <= HUFF_LOOKAHEAD; l++) { - for (i = 1; i <= (int) htbl->bits[l]; i++, p++) { - /* l = current code's length, p = its index in huffcode[] & huffval[]. */ - /* Generate left-justified code followed by all possible bit sequences */ - lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l); - for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) { - dtbl->look_nbits[lookbits] = l; - dtbl->look_sym[lookbits] = htbl->huffval[p]; - lookbits++; - } - } - } - - /* Validate symbols as being reasonable. - * For AC tables, we make no check, but accept all byte values 0..255. - * For DC tables, we require the symbols to be in range 0..15. - * (Tighter bounds could be applied depending on the data depth and mode, - * but this is sufficient to ensure safe decoding.) - */ - if (isDC) { - for (i = 0; i < numsymbols; i++) { - int sym = htbl->huffval[i]; - if (sym < 0 || sym > 15) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - } - } -} - - -/* - * Out-of-line code for bit fetching (shared with jdphuff.c). - * See jdhuff.h for info about usage. - * Note: current values of get_buffer and bits_left are passed as parameters, - * but are returned in the corresponding fields of the state struct. - * - * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width - * of get_buffer to be used. (On machines with wider words, an even larger - * buffer could be used.) However, on some machines 32-bit shifts are - * quite slow and take time proportional to the number of places shifted. - * (This is true with most PC compilers, for instance.) In this case it may - * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the - * average shift distance at the cost of more calls to jpeg_fill_bit_buffer. - */ - -#ifdef SLOW_SHIFT_32 -#define MIN_GET_BITS 15 /* minimum allowable value */ -#else -#define MIN_GET_BITS (BIT_BUF_SIZE-7) -#endif - - -GLOBAL(boolean) -jpeg_fill_bit_buffer (bitread_working_state * state, - register bit_buf_type get_buffer, register int bits_left, - int nbits) -/* Load up the bit buffer to a depth of at least nbits */ -{ - /* Copy heavily used state fields into locals (hopefully registers) */ - register const JOCTET * next_input_byte = state->next_input_byte; - register size_t bytes_in_buffer = state->bytes_in_buffer; - j_decompress_ptr cinfo = state->cinfo; - - /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */ - /* (It is assumed that no request will be for more than that many bits.) */ - /* We fail to do so only if we hit a marker or are forced to suspend. */ - - if (cinfo->unread_marker == 0) { /* cannot advance past a marker */ - while (bits_left < MIN_GET_BITS) { - register int c; - - /* Attempt to read a byte */ - if (bytes_in_buffer == 0) { - if (! (*cinfo->src->fill_input_buffer) (cinfo)) - return FALSE; - next_input_byte = cinfo->src->next_input_byte; - bytes_in_buffer = cinfo->src->bytes_in_buffer; - } - bytes_in_buffer--; - c = GETJOCTET(*next_input_byte++); - - /* If it's 0xFF, check and discard stuffed zero byte */ - if (c == 0xFF) { - /* Loop here to discard any padding FF's on terminating marker, - * so that we can save a valid unread_marker value. NOTE: we will - * accept multiple FF's followed by a 0 as meaning a single FF data - * byte. This data pattern is not valid according to the standard. - */ - do { - if (bytes_in_buffer == 0) { - if (! (*cinfo->src->fill_input_buffer) (cinfo)) - return FALSE; - next_input_byte = cinfo->src->next_input_byte; - bytes_in_buffer = cinfo->src->bytes_in_buffer; - } - bytes_in_buffer--; - c = GETJOCTET(*next_input_byte++); - } while (c == 0xFF); - - if (c == 0) { - /* Found FF/00, which represents an FF data byte */ - c = 0xFF; - } else { - /* Oops, it's actually a marker indicating end of compressed data. - * Save the marker code for later use. - * Fine point: it might appear that we should save the marker into - * bitread working state, not straight into permanent state. But - * once we have hit a marker, we cannot need to suspend within the - * current MCU, because we will read no more bytes from the data - * source. So it is OK to update permanent state right away. - */ - cinfo->unread_marker = c; - /* See if we need to insert some fake zero bits. */ - goto no_more_bytes; - } - } - - /* OK, load c into get_buffer */ - get_buffer = (get_buffer << 8) | c; - bits_left += 8; - } /* end while */ - } else { - no_more_bytes: - /* We get here if we've read the marker that terminates the compressed - * data segment. There should be enough bits in the buffer register - * to satisfy the request; if so, no problem. - */ - if (nbits > bits_left) { - /* Uh-oh. Report corrupted data to user and stuff zeroes into - * the data stream, so that we can produce some kind of image. - * We use a nonvolatile flag to ensure that only one warning message - * appears per data segment. - */ - if (! cinfo->entropy->insufficient_data) { - WARNMS(cinfo, JWRN_HIT_MARKER); - cinfo->entropy->insufficient_data = TRUE; - } - /* Fill the buffer with zero bits */ - get_buffer <<= MIN_GET_BITS - bits_left; - bits_left = MIN_GET_BITS; - } - } - - /* Unload the local registers */ - state->next_input_byte = next_input_byte; - state->bytes_in_buffer = bytes_in_buffer; - state->get_buffer = get_buffer; - state->bits_left = bits_left; - - return TRUE; -} - - -/* - * Out-of-line code for Huffman code decoding. - * See jdhuff.h for info about usage. - */ - -GLOBAL(int) -jpeg_huff_decode (bitread_working_state * state, - register bit_buf_type get_buffer, register int bits_left, - d_derived_tbl * htbl, int min_bits) -{ - register int l = min_bits; - register INT32 code; - - /* HUFF_DECODE has determined that the code is at least min_bits */ - /* bits long, so fetch that many bits in one swoop. */ - - CHECK_BIT_BUFFER(*state, l, return -1); - code = GET_BITS(l); - - /* Collect the rest of the Huffman code one bit at a time. */ - /* This is per Figure F.16 in the JPEG spec. */ - - while (code > htbl->maxcode[l]) { - code <<= 1; - CHECK_BIT_BUFFER(*state, 1, return -1); - code |= GET_BITS(1); - l++; - } - - /* Unload the local registers */ - state->get_buffer = get_buffer; - state->bits_left = bits_left; - - /* With garbage input we may reach the sentinel value l = 17. */ - - if (l > 16) { - WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE); - return 0; /* fake a zero as the safest result */ - } - - return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ]; -} - - -/* - * Figure F.12: extend sign bit. - * On some machines, a shift and add will be faster than a table lookup. - */ - -#ifdef AVOID_TABLES - -#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) - -#else - -#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) - -static const int extend_test[16] = /* entry n is 2**(n-1) */ - { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; - -static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ - { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, - ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, - ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, - ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; - -#endif /* AVOID_TABLES */ - - -/* - * Check for a restart marker & resynchronize decoder. - * Returns FALSE if must suspend. - */ - -LOCAL(boolean) -process_restart (j_decompress_ptr cinfo) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int ci; - - /* Throw away any unused bits remaining in bit buffer; */ - /* include any full bytes in next_marker's count of discarded bytes */ - cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; - entropy->bitstate.bits_left = 0; - - /* Advance past the RSTn marker */ - if (! (*cinfo->marker->read_restart_marker) (cinfo)) - return FALSE; - - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) - entropy->saved.last_dc_val[ci] = 0; - - /* Reset restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; - - /* Reset out-of-data flag, unless read_restart_marker left us smack up - * against a marker. In that case we will end up treating the next data - * segment as empty, and we can avoid producing bogus output pixels by - * leaving the flag set. - */ - if (cinfo->unread_marker == 0) - entropy->pub.insufficient_data = FALSE; - - return TRUE; -} - - -/* - * Decode and return one MCU's worth of Huffman-compressed coefficients. - * The coefficients are reordered from zigzag order into natural array order, - * but are not dequantized. - * - * The i'th block of the MCU is stored into the block pointed to by - * MCU_data[i]. WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER. - * (Wholesale zeroing is usually a little faster than retail...) - * - * Returns FALSE if data source requested suspension. In that case no - * changes have been made to permanent state. (Exception: some output - * coefficients may already have been assigned. This is harmless for - * this module, since we'll just re-assign them on the next call.) - */ - -METHODDEF(boolean) -decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int blkn; - BITREAD_STATE_VARS; - savable_state state; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(state, entropy->saved); - - /* Outer loop handles each block in the MCU */ - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - JBLOCKROW block = MCU_data[blkn]; - d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn]; - d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn]; - register int s, k, r; - - /* Decode a single block's worth of coefficients */ - - /* Section F.2.2.1: decode the DC coefficient difference */ - HUFF_DECODE(s, br_state, dctbl, return FALSE, label1); - if (s) { - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - } - - if (entropy->dc_needed[blkn]) { - /* Convert DC difference to actual value, update last_dc_val */ - int ci = cinfo->MCU_membership[blkn]; - s += state.last_dc_val[ci]; - state.last_dc_val[ci] = s; - /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */ - (*block)[0] = (JCOEF) s; - } - - if (entropy->ac_needed[blkn]) { - - /* Section F.2.2.2: decode the AC coefficients */ - /* Since zeroes are skipped, output area must be cleared beforehand */ - for (k = 1; k < DCTSIZE2; k++) { - HUFF_DECODE(s, br_state, actbl, return FALSE, label2); - - r = s >> 4; - s &= 15; - - if (s) { - k += r; - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - /* Output coefficient in natural (dezigzagged) order. - * Note: the extra entries in jpeg_natural_order[] will save us - * if k >= DCTSIZE2, which could happen if the data is corrupted. - */ - (*block)[jpeg_natural_order[k]] = (JCOEF) s; - } else { - if (r != 15) - break; - k += 15; - } - } - - } else { - - /* Section F.2.2.2: decode the AC coefficients */ - /* In this path we just discard the values */ - for (k = 1; k < DCTSIZE2; k++) { - HUFF_DECODE(s, br_state, actbl, return FALSE, label3); - - r = s >> 4; - s &= 15; - - if (s) { - k += r; - CHECK_BIT_BUFFER(br_state, s, return FALSE); - DROP_BITS(s); - } else { - if (r != 15) - break; - k += 15; - } - } - - } - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(entropy->saved, state); - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * Module initialization routine for Huffman entropy decoding. - */ - -GLOBAL(void) -jinit_huff_decoder (j_decompress_ptr cinfo) -{ - huff_entropy_ptr entropy; - int i; - - entropy = (huff_entropy_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(huff_entropy_decoder)); - cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; - entropy->pub.start_pass = start_pass_huff_decoder; - entropy->pub.decode_mcu = decode_mcu; - - /* Mark tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; - } -} diff --git a/src/SFML/Graphics/libjpeg/jdhuff.h b/src/SFML/Graphics/libjpeg/jdhuff.h deleted file mode 100644 index 12c07477..00000000 --- a/src/SFML/Graphics/libjpeg/jdhuff.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - * jdhuff.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for Huffman entropy decoding routines - * that are shared between the sequential decoder (jdhuff.c) and the - * progressive decoder (jdphuff.c). No other modules need to see these. - */ - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_make_d_derived_tbl jMkDDerived -#define jpeg_fill_bit_buffer jFilBitBuf -#define jpeg_huff_decode jHufDecode -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Derived data constructed for each Huffman table */ - -#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */ - -typedef struct { - /* Basic tables: (element [0] of each array is unused) */ - INT32 maxcode[18]; /* largest code of length k (-1 if none) */ - /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */ - INT32 valoffset[17]; /* huffval[] offset for codes of length k */ - /* valoffset[k] = huffval[] index of 1st symbol of code length k, less - * the smallest code of length k; so given a code of length k, the - * corresponding symbol is huffval[code + valoffset[k]] - */ - - /* Link to public Huffman table (needed only in jpeg_huff_decode) */ - JHUFF_TBL *pub; - - /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of - * the input data stream. If the next Huffman code is no more - * than HUFF_LOOKAHEAD bits long, we can obtain its length and - * the corresponding symbol directly from these tables. - */ - int look_nbits[1< 32 bits on your machine, and shifting/masking longs is - * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE - * appropriately should be a win. Unfortunately we can't define the size - * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8) - * because not all machines measure sizeof in 8-bit bytes. - */ - -typedef struct { /* Bitreading state saved across MCUs */ - bit_buf_type get_buffer; /* current bit-extraction buffer */ - int bits_left; /* # of unused bits in it */ -} bitread_perm_state; - -typedef struct { /* Bitreading working state within an MCU */ - /* Current data source location */ - /* We need a copy, rather than munging the original, in case of suspension */ - const JOCTET * next_input_byte; /* => next byte to read from source */ - size_t bytes_in_buffer; /* # of bytes remaining in source buffer */ - /* Bit input buffer --- note these values are kept in register variables, - * not in this struct, inside the inner loops. - */ - bit_buf_type get_buffer; /* current bit-extraction buffer */ - int bits_left; /* # of unused bits in it */ - /* Pointer needed by jpeg_fill_bit_buffer. */ - j_decompress_ptr cinfo; /* back link to decompress master record */ -} bitread_working_state; - -/* Macros to declare and load/save bitread local variables. */ -#define BITREAD_STATE_VARS \ - register bit_buf_type get_buffer; \ - register int bits_left; \ - bitread_working_state br_state - -#define BITREAD_LOAD_STATE(cinfop,permstate) \ - br_state.cinfo = cinfop; \ - br_state.next_input_byte = cinfop->src->next_input_byte; \ - br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \ - get_buffer = permstate.get_buffer; \ - bits_left = permstate.bits_left; - -#define BITREAD_SAVE_STATE(cinfop,permstate) \ - cinfop->src->next_input_byte = br_state.next_input_byte; \ - cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \ - permstate.get_buffer = get_buffer; \ - permstate.bits_left = bits_left - -/* - * These macros provide the in-line portion of bit fetching. - * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer - * before using GET_BITS, PEEK_BITS, or DROP_BITS. - * The variables get_buffer and bits_left are assumed to be locals, - * but the state struct might not be (jpeg_huff_decode needs this). - * CHECK_BIT_BUFFER(state,n,action); - * Ensure there are N bits in get_buffer; if suspend, take action. - * val = GET_BITS(n); - * Fetch next N bits. - * val = PEEK_BITS(n); - * Fetch next N bits without removing them from the buffer. - * DROP_BITS(n); - * Discard next N bits. - * The value N should be a simple variable, not an expression, because it - * is evaluated multiple times. - */ - -#define CHECK_BIT_BUFFER(state,nbits,action) \ - { if (bits_left < (nbits)) { \ - if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \ - { action; } \ - get_buffer = (state).get_buffer; bits_left = (state).bits_left; } } - -#define GET_BITS(nbits) \ - (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1)) - -#define PEEK_BITS(nbits) \ - (((int) (get_buffer >> (bits_left - (nbits)))) & ((1<<(nbits))-1)) - -#define DROP_BITS(nbits) \ - (bits_left -= (nbits)) - -/* Load up the bit buffer to a depth of at least nbits */ -EXTERN(boolean) jpeg_fill_bit_buffer - JPP((bitread_working_state * state, register bit_buf_type get_buffer, - register int bits_left, int nbits)); - - -/* - * Code for extracting next Huffman-coded symbol from input bit stream. - * Again, this is time-critical and we make the main paths be macros. - * - * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits - * without looping. Usually, more than 95% of the Huffman codes will be 8 - * or fewer bits long. The few overlength codes are handled with a loop, - * which need not be inline code. - * - * Notes about the HUFF_DECODE macro: - * 1. Near the end of the data segment, we may fail to get enough bits - * for a lookahead. In that case, we do it the hard way. - * 2. If the lookahead table contains no entry, the next code must be - * more than HUFF_LOOKAHEAD bits long. - * 3. jpeg_huff_decode returns -1 if forced to suspend. - */ - -#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \ -{ register int nb, look; \ - if (bits_left < HUFF_LOOKAHEAD) { \ - if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \ - get_buffer = state.get_buffer; bits_left = state.bits_left; \ - if (bits_left < HUFF_LOOKAHEAD) { \ - nb = 1; goto slowlabel; \ - } \ - } \ - look = PEEK_BITS(HUFF_LOOKAHEAD); \ - if ((nb = htbl->look_nbits[look]) != 0) { \ - DROP_BITS(nb); \ - result = htbl->look_sym[look]; \ - } else { \ - nb = HUFF_LOOKAHEAD+1; \ -slowlabel: \ - if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \ - { failaction; } \ - get_buffer = state.get_buffer; bits_left = state.bits_left; \ - } \ -} - -/* Out-of-line case for Huffman code fetching */ -EXTERN(int) jpeg_huff_decode - JPP((bitread_working_state * state, register bit_buf_type get_buffer, - register int bits_left, d_derived_tbl * htbl, int min_bits)); diff --git a/src/SFML/Graphics/libjpeg/jdinput.c b/src/SFML/Graphics/libjpeg/jdinput.c deleted file mode 100644 index 2d5c7470..00000000 --- a/src/SFML/Graphics/libjpeg/jdinput.c +++ /dev/null @@ -1,381 +0,0 @@ -/* - * jdinput.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains input control logic for the JPEG decompressor. - * These routines are concerned with controlling the decompressor's input - * processing (marker reading and coefficient decoding). The actual input - * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private state */ - -typedef struct { - struct jpeg_input_controller pub; /* public fields */ - - boolean inheaders; /* TRUE until first SOS is reached */ -} my_input_controller; - -typedef my_input_controller * my_inputctl_ptr; - - -/* Forward declarations */ -METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo)); - - -/* - * Routines to calculate various quantities related to the size of the image. - */ - -LOCAL(void) -initial_setup (j_decompress_ptr cinfo) -/* Called once, when first SOS marker is reached */ -{ - int ci; - jpeg_component_info *compptr; - - /* Make sure image isn't bigger than I can handle */ - if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || - (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) - ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); - - /* For now, precision must match compiled-in value... */ - if (cinfo->data_precision != BITS_IN_JSAMPLE) - ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); - - /* Check that number of components won't exceed internal array sizes */ - if (cinfo->num_components > MAX_COMPONENTS) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, - MAX_COMPONENTS); - - /* Compute maximum sampling factors; check factor validity */ - cinfo->max_h_samp_factor = 1; - cinfo->max_v_samp_factor = 1; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || - compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) - ERREXIT(cinfo, JERR_BAD_SAMPLING); - cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, - compptr->h_samp_factor); - cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, - compptr->v_samp_factor); - } - - /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE. - * In the full decompressor, this will be overridden by jdmaster.c; - * but in the transcoder, jdmaster.c is not used, so we must do it here. - */ - cinfo->min_DCT_scaled_size = DCTSIZE; - - /* Compute dimensions of components */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - compptr->DCT_scaled_size = DCTSIZE; - /* Size in DCT blocks */ - compptr->width_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) (cinfo->max_h_samp_factor * DCTSIZE)); - compptr->height_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) (cinfo->max_v_samp_factor * DCTSIZE)); - /* downsampled_width and downsampled_height will also be overridden by - * jdmaster.c if we are doing full decompression. The transcoder library - * doesn't use these values, but the calling application might. - */ - /* Size in samples */ - compptr->downsampled_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) cinfo->max_h_samp_factor); - compptr->downsampled_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) cinfo->max_v_samp_factor); - /* Mark component needed, until color conversion says otherwise */ - compptr->component_needed = TRUE; - /* Mark no quantization table yet saved for component */ - compptr->quant_table = NULL; - } - - /* Compute number of fully interleaved MCU rows. */ - cinfo->total_iMCU_rows = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); - - /* Decide whether file contains multiple scans */ - if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode) - cinfo->inputctl->has_multiple_scans = TRUE; - else - cinfo->inputctl->has_multiple_scans = FALSE; -} - - -LOCAL(void) -per_scan_setup (j_decompress_ptr cinfo) -/* Do computations that are needed before processing a JPEG scan */ -/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */ -{ - int ci, mcublks, tmp; - jpeg_component_info *compptr; - - if (cinfo->comps_in_scan == 1) { - - /* Noninterleaved (single-component) scan */ - compptr = cinfo->cur_comp_info[0]; - - /* Overall image size in MCUs */ - cinfo->MCUs_per_row = compptr->width_in_blocks; - cinfo->MCU_rows_in_scan = compptr->height_in_blocks; - - /* For noninterleaved scan, always one block per MCU */ - compptr->MCU_width = 1; - compptr->MCU_height = 1; - compptr->MCU_blocks = 1; - compptr->MCU_sample_width = compptr->DCT_scaled_size; - compptr->last_col_width = 1; - /* For noninterleaved scans, it is convenient to define last_row_height - * as the number of block rows present in the last iMCU row. - */ - tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (tmp == 0) tmp = compptr->v_samp_factor; - compptr->last_row_height = tmp; - - /* Prepare array describing MCU composition */ - cinfo->blocks_in_MCU = 1; - cinfo->MCU_membership[0] = 0; - - } else { - - /* Interleaved (multi-component) scan */ - if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, - MAX_COMPS_IN_SCAN); - - /* Overall image size in MCUs */ - cinfo->MCUs_per_row = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, - (long) (cinfo->max_h_samp_factor*DCTSIZE)); - cinfo->MCU_rows_in_scan = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); - - cinfo->blocks_in_MCU = 0; - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Sampling factors give # of blocks of component in each MCU */ - compptr->MCU_width = compptr->h_samp_factor; - compptr->MCU_height = compptr->v_samp_factor; - compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; - compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size; - /* Figure number of non-dummy blocks in last MCU column & row */ - tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); - if (tmp == 0) tmp = compptr->MCU_width; - compptr->last_col_width = tmp; - tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); - if (tmp == 0) tmp = compptr->MCU_height; - compptr->last_row_height = tmp; - /* Prepare array describing MCU composition */ - mcublks = compptr->MCU_blocks; - if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU) - ERREXIT(cinfo, JERR_BAD_MCU_SIZE); - while (mcublks-- > 0) { - cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; - } - } - - } -} - - -/* - * Save away a copy of the Q-table referenced by each component present - * in the current scan, unless already saved during a prior scan. - * - * In a multiple-scan JPEG file, the encoder could assign different components - * the same Q-table slot number, but change table definitions between scans - * so that each component uses a different Q-table. (The IJG encoder is not - * currently capable of doing this, but other encoders might.) Since we want - * to be able to dequantize all the components at the end of the file, this - * means that we have to save away the table actually used for each component. - * We do this by copying the table at the start of the first scan containing - * the component. - * The JPEG spec prohibits the encoder from changing the contents of a Q-table - * slot between scans of a component using that slot. If the encoder does so - * anyway, this decoder will simply use the Q-table values that were current - * at the start of the first scan for the component. - * - * The decompressor output side looks only at the saved quant tables, - * not at the current Q-table slots. - */ - -LOCAL(void) -latch_quant_tables (j_decompress_ptr cinfo) -{ - int ci, qtblno; - jpeg_component_info *compptr; - JQUANT_TBL * qtbl; - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* No work if we already saved Q-table for this component */ - if (compptr->quant_table != NULL) - continue; - /* Make sure specified quantization table is present */ - qtblno = compptr->quant_tbl_no; - if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || - cinfo->quant_tbl_ptrs[qtblno] == NULL) - ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); - /* OK, save away the quantization table */ - qtbl = (JQUANT_TBL *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(JQUANT_TBL)); - MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL)); - compptr->quant_table = qtbl; - } -} - - -/* - * Initialize the input modules to read a scan of compressed data. - * The first call to this is done by jdmaster.c after initializing - * the entire decompressor (during jpeg_start_decompress). - * Subsequent calls come from consume_markers, below. - */ - -METHODDEF(void) -start_input_pass (j_decompress_ptr cinfo) -{ - per_scan_setup(cinfo); - latch_quant_tables(cinfo); - (*cinfo->entropy->start_pass) (cinfo); - (*cinfo->coef->start_input_pass) (cinfo); - cinfo->inputctl->consume_input = cinfo->coef->consume_data; -} - - -/* - * Finish up after inputting a compressed-data scan. - * This is called by the coefficient controller after it's read all - * the expected data of the scan. - */ - -METHODDEF(void) -finish_input_pass (j_decompress_ptr cinfo) -{ - cinfo->inputctl->consume_input = consume_markers; -} - - -/* - * Read JPEG markers before, between, or after compressed-data scans. - * Change state as necessary when a new scan is reached. - * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. - * - * The consume_input method pointer points either here or to the - * coefficient controller's consume_data routine, depending on whether - * we are reading a compressed data segment or inter-segment markers. - */ - -METHODDEF(int) -consume_markers (j_decompress_ptr cinfo) -{ - my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; - int val; - - if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */ - return JPEG_REACHED_EOI; - - val = (*cinfo->marker->read_markers) (cinfo); - - switch (val) { - case JPEG_REACHED_SOS: /* Found SOS */ - if (inputctl->inheaders) { /* 1st SOS */ - initial_setup(cinfo); - inputctl->inheaders = FALSE; - /* Note: start_input_pass must be called by jdmaster.c - * before any more input can be consumed. jdapimin.c is - * responsible for enforcing this sequencing. - */ - } else { /* 2nd or later SOS marker */ - if (! inputctl->pub.has_multiple_scans) - ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ - start_input_pass(cinfo); - } - break; - case JPEG_REACHED_EOI: /* Found EOI */ - inputctl->pub.eoi_reached = TRUE; - if (inputctl->inheaders) { /* Tables-only datastream, apparently */ - if (cinfo->marker->saw_SOF) - ERREXIT(cinfo, JERR_SOF_NO_SOS); - } else { - /* Prevent infinite loop in coef ctlr's decompress_data routine - * if user set output_scan_number larger than number of scans. - */ - if (cinfo->output_scan_number > cinfo->input_scan_number) - cinfo->output_scan_number = cinfo->input_scan_number; - } - break; - case JPEG_SUSPENDED: - break; - } - - return val; -} - - -/* - * Reset state to begin a fresh datastream. - */ - -METHODDEF(void) -reset_input_controller (j_decompress_ptr cinfo) -{ - my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; - - inputctl->pub.consume_input = consume_markers; - inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ - inputctl->pub.eoi_reached = FALSE; - inputctl->inheaders = TRUE; - /* Reset other modules */ - (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); - (*cinfo->marker->reset_marker_reader) (cinfo); - /* Reset progression state -- would be cleaner if entropy decoder did this */ - cinfo->coef_bits = NULL; -} - - -/* - * Initialize the input controller module. - * This is called only once, when the decompression object is created. - */ - -GLOBAL(void) -jinit_input_controller (j_decompress_ptr cinfo) -{ - my_inputctl_ptr inputctl; - - /* Create subobject in permanent pool */ - inputctl = (my_inputctl_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - SIZEOF(my_input_controller)); - cinfo->inputctl = (struct jpeg_input_controller *) inputctl; - /* Initialize method pointers */ - inputctl->pub.consume_input = consume_markers; - inputctl->pub.reset_input_controller = reset_input_controller; - inputctl->pub.start_input_pass = start_input_pass; - inputctl->pub.finish_input_pass = finish_input_pass; - /* Initialize state: can't use reset_input_controller since we don't - * want to try to reset other modules yet. - */ - inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ - inputctl->pub.eoi_reached = FALSE; - inputctl->inheaders = TRUE; -} diff --git a/src/SFML/Graphics/libjpeg/jdmainct.c b/src/SFML/Graphics/libjpeg/jdmainct.c deleted file mode 100644 index 6b0f06f5..00000000 --- a/src/SFML/Graphics/libjpeg/jdmainct.c +++ /dev/null @@ -1,512 +0,0 @@ -/* - * jdmainct.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the main buffer controller for decompression. - * The main buffer lies between the JPEG decompressor proper and the - * post-processor; it holds downsampled data in the JPEG colorspace. - * - * Note that this code is bypassed in raw-data mode, since the application - * supplies the equivalent of the main buffer in that case. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * In the current system design, the main buffer need never be a full-image - * buffer; any full-height buffers will be found inside the coefficient or - * postprocessing controllers. Nonetheless, the main controller is not - * trivial. Its responsibility is to provide context rows for upsampling/ - * rescaling, and doing this in an efficient fashion is a bit tricky. - * - * Postprocessor input data is counted in "row groups". A row group - * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) - * sample rows of each component. (We require DCT_scaled_size values to be - * chosen such that these numbers are integers. In practice DCT_scaled_size - * values will likely be powers of two, so we actually have the stronger - * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.) - * Upsampling will typically produce max_v_samp_factor pixel rows from each - * row group (times any additional scale factor that the upsampler is - * applying). - * - * The coefficient controller will deliver data to us one iMCU row at a time; - * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or - * exactly min_DCT_scaled_size row groups. (This amount of data corresponds - * to one row of MCUs when the image is fully interleaved.) Note that the - * number of sample rows varies across components, but the number of row - * groups does not. Some garbage sample rows may be included in the last iMCU - * row at the bottom of the image. - * - * Depending on the vertical scaling algorithm used, the upsampler may need - * access to the sample row(s) above and below its current input row group. - * The upsampler is required to set need_context_rows TRUE at global selection - * time if so. When need_context_rows is FALSE, this controller can simply - * obtain one iMCU row at a time from the coefficient controller and dole it - * out as row groups to the postprocessor. - * - * When need_context_rows is TRUE, this controller guarantees that the buffer - * passed to postprocessing contains at least one row group's worth of samples - * above and below the row group(s) being processed. Note that the context - * rows "above" the first passed row group appear at negative row offsets in - * the passed buffer. At the top and bottom of the image, the required - * context rows are manufactured by duplicating the first or last real sample - * row; this avoids having special cases in the upsampling inner loops. - * - * The amount of context is fixed at one row group just because that's a - * convenient number for this controller to work with. The existing - * upsamplers really only need one sample row of context. An upsampler - * supporting arbitrary output rescaling might wish for more than one row - * group of context when shrinking the image; tough, we don't handle that. - * (This is justified by the assumption that downsizing will be handled mostly - * by adjusting the DCT_scaled_size values, so that the actual scale factor at - * the upsample step needn't be much less than one.) - * - * To provide the desired context, we have to retain the last two row groups - * of one iMCU row while reading in the next iMCU row. (The last row group - * can't be processed until we have another row group for its below-context, - * and so we have to save the next-to-last group too for its above-context.) - * We could do this most simply by copying data around in our buffer, but - * that'd be very slow. We can avoid copying any data by creating a rather - * strange pointer structure. Here's how it works. We allocate a workspace - * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number - * of row groups per iMCU row). We create two sets of redundant pointers to - * the workspace. Labeling the physical row groups 0 to M+1, the synthesized - * pointer lists look like this: - * M+1 M-1 - * master pointer --> 0 master pointer --> 0 - * 1 1 - * ... ... - * M-3 M-3 - * M-2 M - * M-1 M+1 - * M M-2 - * M+1 M-1 - * 0 0 - * We read alternate iMCU rows using each master pointer; thus the last two - * row groups of the previous iMCU row remain un-overwritten in the workspace. - * The pointer lists are set up so that the required context rows appear to - * be adjacent to the proper places when we pass the pointer lists to the - * upsampler. - * - * The above pictures describe the normal state of the pointer lists. - * At top and bottom of the image, we diddle the pointer lists to duplicate - * the first or last sample row as necessary (this is cheaper than copying - * sample rows around). - * - * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that - * situation each iMCU row provides only one row group so the buffering logic - * must be different (eg, we must read two iMCU rows before we can emit the - * first row group). For now, we simply do not support providing context - * rows when min_DCT_scaled_size is 1. That combination seems unlikely to - * be worth providing --- if someone wants a 1/8th-size preview, they probably - * want it quick and dirty, so a context-free upsampler is sufficient. - */ - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_d_main_controller pub; /* public fields */ - - /* Pointer to allocated workspace (M or M+2 row groups). */ - JSAMPARRAY buffer[MAX_COMPONENTS]; - - boolean buffer_full; /* Have we gotten an iMCU row from decoder? */ - JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */ - - /* Remaining fields are only used in the context case. */ - - /* These are the master pointers to the funny-order pointer lists. */ - JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */ - - int whichptr; /* indicates which pointer set is now in use */ - int context_state; /* process_data state machine status */ - JDIMENSION rowgroups_avail; /* row groups available to postprocessor */ - JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */ -} my_main_controller; - -typedef my_main_controller * my_main_ptr; - -/* context_state values: */ -#define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */ -#define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */ -#define CTX_POSTPONED_ROW 2 /* feeding postponed row group */ - - -/* Forward declarations */ -METHODDEF(void) process_data_simple_main - JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); -METHODDEF(void) process_data_context_main - JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); -#ifdef QUANT_2PASS_SUPPORTED -METHODDEF(void) process_data_crank_post - JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); -#endif - - -LOCAL(void) -alloc_funny_pointers (j_decompress_ptr cinfo) -/* Allocate space for the funny pointer lists. - * This is done only once, not once per pass. - */ -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - int ci, rgroup; - int M = cinfo->min_DCT_scaled_size; - jpeg_component_info *compptr; - JSAMPARRAY xbuf; - - /* Get top-level space for component array pointers. - * We alloc both arrays with one call to save a few cycles. - */ - main->xbuffer[0] = (JSAMPIMAGE) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components * 2 * SIZEOF(JSAMPARRAY)); - main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - /* Get space for pointer lists --- M+4 row groups in each list. - * We alloc both pointer lists with one call to save a few cycles. - */ - xbuf = (JSAMPARRAY) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW)); - xbuf += rgroup; /* want one row group at negative offsets */ - main->xbuffer[0][ci] = xbuf; - xbuf += rgroup * (M + 4); - main->xbuffer[1][ci] = xbuf; - } -} - - -LOCAL(void) -make_funny_pointers (j_decompress_ptr cinfo) -/* Create the funny pointer lists discussed in the comments above. - * The actual workspace is already allocated (in main->buffer), - * and the space for the pointer lists is allocated too. - * This routine just fills in the curiously ordered lists. - * This will be repeated at the beginning of each pass. - */ -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - int ci, i, rgroup; - int M = cinfo->min_DCT_scaled_size; - jpeg_component_info *compptr; - JSAMPARRAY buf, xbuf0, xbuf1; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - xbuf0 = main->xbuffer[0][ci]; - xbuf1 = main->xbuffer[1][ci]; - /* First copy the workspace pointers as-is */ - buf = main->buffer[ci]; - for (i = 0; i < rgroup * (M + 2); i++) { - xbuf0[i] = xbuf1[i] = buf[i]; - } - /* In the second list, put the last four row groups in swapped order */ - for (i = 0; i < rgroup * 2; i++) { - xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i]; - xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i]; - } - /* The wraparound pointers at top and bottom will be filled later - * (see set_wraparound_pointers, below). Initially we want the "above" - * pointers to duplicate the first actual data line. This only needs - * to happen in xbuffer[0]. - */ - for (i = 0; i < rgroup; i++) { - xbuf0[i - rgroup] = xbuf0[0]; - } - } -} - - -LOCAL(void) -set_wraparound_pointers (j_decompress_ptr cinfo) -/* Set up the "wraparound" pointers at top and bottom of the pointer lists. - * This changes the pointer list state from top-of-image to the normal state. - */ -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - int ci, i, rgroup; - int M = cinfo->min_DCT_scaled_size; - jpeg_component_info *compptr; - JSAMPARRAY xbuf0, xbuf1; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - xbuf0 = main->xbuffer[0][ci]; - xbuf1 = main->xbuffer[1][ci]; - for (i = 0; i < rgroup; i++) { - xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i]; - xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i]; - xbuf0[rgroup*(M+2) + i] = xbuf0[i]; - xbuf1[rgroup*(M+2) + i] = xbuf1[i]; - } - } -} - - -LOCAL(void) -set_bottom_pointers (j_decompress_ptr cinfo) -/* Change the pointer lists to duplicate the last sample row at the bottom - * of the image. whichptr indicates which xbuffer holds the final iMCU row. - * Also sets rowgroups_avail to indicate number of nondummy row groups in row. - */ -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - int ci, i, rgroup, iMCUheight, rows_left; - jpeg_component_info *compptr; - JSAMPARRAY xbuf; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Count sample rows in one iMCU row and in one row group */ - iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size; - rgroup = iMCUheight / cinfo->min_DCT_scaled_size; - /* Count nondummy sample rows remaining for this component */ - rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight); - if (rows_left == 0) rows_left = iMCUheight; - /* Count nondummy row groups. Should get same answer for each component, - * so we need only do it once. - */ - if (ci == 0) { - main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1); - } - /* Duplicate the last real sample row rgroup*2 times; this pads out the - * last partial rowgroup and ensures at least one full rowgroup of context. - */ - xbuf = main->xbuffer[main->whichptr][ci]; - for (i = 0; i < rgroup * 2; i++) { - xbuf[rows_left + i] = xbuf[rows_left-1]; - } - } -} - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - - switch (pass_mode) { - case JBUF_PASS_THRU: - if (cinfo->upsample->need_context_rows) { - main->pub.process_data = process_data_context_main; - make_funny_pointers(cinfo); /* Create the xbuffer[] lists */ - main->whichptr = 0; /* Read first iMCU row into xbuffer[0] */ - main->context_state = CTX_PREPARE_FOR_IMCU; - main->iMCU_row_ctr = 0; - } else { - /* Simple case with no context needed */ - main->pub.process_data = process_data_simple_main; - } - main->buffer_full = FALSE; /* Mark buffer empty */ - main->rowgroup_ctr = 0; - break; -#ifdef QUANT_2PASS_SUPPORTED - case JBUF_CRANK_DEST: - /* For last pass of 2-pass quantization, just crank the postprocessor */ - main->pub.process_data = process_data_crank_post; - break; -#endif - default: - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; - } -} - - -/* - * Process some data. - * This handles the simple case where no context is required. - */ - -METHODDEF(void) -process_data_simple_main (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - JDIMENSION rowgroups_avail; - - /* Read input data if we haven't filled the main buffer yet */ - if (! main->buffer_full) { - if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer)) - return; /* suspension forced, can do nothing more */ - main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ - } - - /* There are always min_DCT_scaled_size row groups in an iMCU row. */ - rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size; - /* Note: at the bottom of the image, we may pass extra garbage row groups - * to the postprocessor. The postprocessor has to check for bottom - * of image anyway (at row resolution), so no point in us doing it too. - */ - - /* Feed the postprocessor */ - (*cinfo->post->post_process_data) (cinfo, main->buffer, - &main->rowgroup_ctr, rowgroups_avail, - output_buf, out_row_ctr, out_rows_avail); - - /* Has postprocessor consumed all the data yet? If so, mark buffer empty */ - if (main->rowgroup_ctr >= rowgroups_avail) { - main->buffer_full = FALSE; - main->rowgroup_ctr = 0; - } -} - - -/* - * Process some data. - * This handles the case where context rows must be provided. - */ - -METHODDEF(void) -process_data_context_main (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - - /* Read input data if we haven't filled the main buffer yet */ - if (! main->buffer_full) { - if (! (*cinfo->coef->decompress_data) (cinfo, - main->xbuffer[main->whichptr])) - return; /* suspension forced, can do nothing more */ - main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ - main->iMCU_row_ctr++; /* count rows received */ - } - - /* Postprocessor typically will not swallow all the input data it is handed - * in one call (due to filling the output buffer first). Must be prepared - * to exit and restart. This switch lets us keep track of how far we got. - * Note that each case falls through to the next on successful completion. - */ - switch (main->context_state) { - case CTX_POSTPONED_ROW: - /* Call postprocessor using previously set pointers for postponed row */ - (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr], - &main->rowgroup_ctr, main->rowgroups_avail, - output_buf, out_row_ctr, out_rows_avail); - if (main->rowgroup_ctr < main->rowgroups_avail) - return; /* Need to suspend */ - main->context_state = CTX_PREPARE_FOR_IMCU; - if (*out_row_ctr >= out_rows_avail) - return; /* Postprocessor exactly filled output buf */ - /*FALLTHROUGH*/ - case CTX_PREPARE_FOR_IMCU: - /* Prepare to process first M-1 row groups of this iMCU row */ - main->rowgroup_ctr = 0; - main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1); - /* Check for bottom of image: if so, tweak pointers to "duplicate" - * the last sample row, and adjust rowgroups_avail to ignore padding rows. - */ - if (main->iMCU_row_ctr == cinfo->total_iMCU_rows) - set_bottom_pointers(cinfo); - main->context_state = CTX_PROCESS_IMCU; - /*FALLTHROUGH*/ - case CTX_PROCESS_IMCU: - /* Call postprocessor using previously set pointers */ - (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr], - &main->rowgroup_ctr, main->rowgroups_avail, - output_buf, out_row_ctr, out_rows_avail); - if (main->rowgroup_ctr < main->rowgroups_avail) - return; /* Need to suspend */ - /* After the first iMCU, change wraparound pointers to normal state */ - if (main->iMCU_row_ctr == 1) - set_wraparound_pointers(cinfo); - /* Prepare to load new iMCU row using other xbuffer list */ - main->whichptr ^= 1; /* 0=>1 or 1=>0 */ - main->buffer_full = FALSE; - /* Still need to process last row group of this iMCU row, */ - /* which is saved at index M+1 of the other xbuffer */ - main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1); - main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2); - main->context_state = CTX_POSTPONED_ROW; - } -} - - -/* - * Process some data. - * Final pass of two-pass quantization: just call the postprocessor. - * Source data will be the postprocessor controller's internal buffer. - */ - -#ifdef QUANT_2PASS_SUPPORTED - -METHODDEF(void) -process_data_crank_post (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL, - (JDIMENSION *) NULL, (JDIMENSION) 0, - output_buf, out_row_ctr, out_rows_avail); -} - -#endif /* QUANT_2PASS_SUPPORTED */ - - -/* - * Initialize main buffer controller. - */ - -GLOBAL(void) -jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) -{ - my_main_ptr main; - int ci, rgroup, ngroups; - jpeg_component_info *compptr; - - main = (my_main_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_main_controller)); - cinfo->main = (struct jpeg_d_main_controller *) main; - main->pub.start_pass = start_pass_main; - - if (need_full_buffer) /* shouldn't happen */ - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - - /* Allocate the workspace. - * ngroups is the number of row groups we need. - */ - if (cinfo->upsample->need_context_rows) { - if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */ - ERREXIT(cinfo, JERR_NOTIMPL); - alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */ - ngroups = cinfo->min_DCT_scaled_size + 2; - } else { - ngroups = cinfo->min_DCT_scaled_size; - } - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - main->buffer[ci] = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - compptr->width_in_blocks * compptr->DCT_scaled_size, - (JDIMENSION) (rgroup * ngroups)); - } -} diff --git a/src/SFML/Graphics/libjpeg/jdmarker.c b/src/SFML/Graphics/libjpeg/jdmarker.c deleted file mode 100644 index 9811761d..00000000 --- a/src/SFML/Graphics/libjpeg/jdmarker.c +++ /dev/null @@ -1,1360 +0,0 @@ -/* - * jdmarker.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to decode JPEG datastream markers. - * Most of the complexity arises from our desire to support input - * suspension: if not all of the data for a marker is available, - * we must exit back to the application. On resumption, we reprocess - * the marker. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -typedef enum { /* JPEG marker codes */ - M_SOF0 = 0xc0, - M_SOF1 = 0xc1, - M_SOF2 = 0xc2, - M_SOF3 = 0xc3, - - M_SOF5 = 0xc5, - M_SOF6 = 0xc6, - M_SOF7 = 0xc7, - - M_JPG = 0xc8, - M_SOF9 = 0xc9, - M_SOF10 = 0xca, - M_SOF11 = 0xcb, - - M_SOF13 = 0xcd, - M_SOF14 = 0xce, - M_SOF15 = 0xcf, - - M_DHT = 0xc4, - - M_DAC = 0xcc, - - M_RST0 = 0xd0, - M_RST1 = 0xd1, - M_RST2 = 0xd2, - M_RST3 = 0xd3, - M_RST4 = 0xd4, - M_RST5 = 0xd5, - M_RST6 = 0xd6, - M_RST7 = 0xd7, - - M_SOI = 0xd8, - M_EOI = 0xd9, - M_SOS = 0xda, - M_DQT = 0xdb, - M_DNL = 0xdc, - M_DRI = 0xdd, - M_DHP = 0xde, - M_EXP = 0xdf, - - M_APP0 = 0xe0, - M_APP1 = 0xe1, - M_APP2 = 0xe2, - M_APP3 = 0xe3, - M_APP4 = 0xe4, - M_APP5 = 0xe5, - M_APP6 = 0xe6, - M_APP7 = 0xe7, - M_APP8 = 0xe8, - M_APP9 = 0xe9, - M_APP10 = 0xea, - M_APP11 = 0xeb, - M_APP12 = 0xec, - M_APP13 = 0xed, - M_APP14 = 0xee, - M_APP15 = 0xef, - - M_JPG0 = 0xf0, - M_JPG13 = 0xfd, - M_COM = 0xfe, - - M_TEM = 0x01, - - M_ERROR = 0x100 -} JPEG_MARKER; - - -/* Private state */ - -typedef struct { - struct jpeg_marker_reader pub; /* public fields */ - - /* Application-overridable marker processing methods */ - jpeg_marker_parser_method process_COM; - jpeg_marker_parser_method process_APPn[16]; - - /* Limit on marker data length to save for each marker type */ - unsigned int length_limit_COM; - unsigned int length_limit_APPn[16]; - - /* Status of COM/APPn marker saving */ - jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */ - unsigned int bytes_read; /* data bytes read so far in marker */ - /* Note: cur_marker is not linked into marker_list until it's all read. */ -} my_marker_reader; - -typedef my_marker_reader * my_marker_ptr; - - -/* - * Macros for fetching data from the data source module. - * - * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect - * the current restart point; we update them only when we have reached a - * suitable place to restart if a suspension occurs. - */ - -/* Declare and initialize local copies of input pointer/count */ -#define INPUT_VARS(cinfo) \ - struct jpeg_source_mgr * datasrc = (cinfo)->src; \ - const JOCTET * next_input_byte = datasrc->next_input_byte; \ - size_t bytes_in_buffer = datasrc->bytes_in_buffer - -/* Unload the local copies --- do this only at a restart boundary */ -#define INPUT_SYNC(cinfo) \ - ( datasrc->next_input_byte = next_input_byte, \ - datasrc->bytes_in_buffer = bytes_in_buffer ) - -/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */ -#define INPUT_RELOAD(cinfo) \ - ( next_input_byte = datasrc->next_input_byte, \ - bytes_in_buffer = datasrc->bytes_in_buffer ) - -/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available. - * Note we do *not* do INPUT_SYNC before calling fill_input_buffer, - * but we must reload the local copies after a successful fill. - */ -#define MAKE_BYTE_AVAIL(cinfo,action) \ - if (bytes_in_buffer == 0) { \ - if (! (*datasrc->fill_input_buffer) (cinfo)) \ - { action; } \ - INPUT_RELOAD(cinfo); \ - } - -/* Read a byte into variable V. - * If must suspend, take the specified action (typically "return FALSE"). - */ -#define INPUT_BYTE(cinfo,V,action) \ - MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ - bytes_in_buffer--; \ - V = GETJOCTET(*next_input_byte++); ) - -/* As above, but read two bytes interpreted as an unsigned 16-bit integer. - * V should be declared unsigned int or perhaps INT32. - */ -#define INPUT_2BYTES(cinfo,V,action) \ - MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ - bytes_in_buffer--; \ - V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \ - MAKE_BYTE_AVAIL(cinfo,action); \ - bytes_in_buffer--; \ - V += GETJOCTET(*next_input_byte++); ) - - -/* - * Routines to process JPEG markers. - * - * Entry condition: JPEG marker itself has been read and its code saved - * in cinfo->unread_marker; input restart point is just after the marker. - * - * Exit: if return TRUE, have read and processed any parameters, and have - * updated the restart point to point after the parameters. - * If return FALSE, was forced to suspend before reaching end of - * marker parameters; restart point has not been moved. Same routine - * will be called again after application supplies more input data. - * - * This approach to suspension assumes that all of a marker's parameters - * can fit into a single input bufferload. This should hold for "normal" - * markers. Some COM/APPn markers might have large parameter segments - * that might not fit. If we are simply dropping such a marker, we use - * skip_input_data to get past it, and thereby put the problem on the - * source manager's shoulders. If we are saving the marker's contents - * into memory, we use a slightly different convention: when forced to - * suspend, the marker processor updates the restart point to the end of - * what it's consumed (ie, the end of the buffer) before returning FALSE. - * On resumption, cinfo->unread_marker still contains the marker code, - * but the data source will point to the next chunk of marker data. - * The marker processor must retain internal state to deal with this. - * - * Note that we don't bother to avoid duplicate trace messages if a - * suspension occurs within marker parameters. Other side effects - * require more care. - */ - - -LOCAL(boolean) -get_soi (j_decompress_ptr cinfo) -/* Process an SOI marker */ -{ - int i; - - TRACEMS(cinfo, 1, JTRC_SOI); - - if (cinfo->marker->saw_SOI) - ERREXIT(cinfo, JERR_SOI_DUPLICATE); - - /* Reset all parameters that are defined to be reset by SOI */ - - for (i = 0; i < NUM_ARITH_TBLS; i++) { - cinfo->arith_dc_L[i] = 0; - cinfo->arith_dc_U[i] = 1; - cinfo->arith_ac_K[i] = 5; - } - cinfo->restart_interval = 0; - - /* Set initial assumptions for colorspace etc */ - - cinfo->jpeg_color_space = JCS_UNKNOWN; - cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */ - - cinfo->saw_JFIF_marker = FALSE; - cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */ - cinfo->JFIF_minor_version = 1; - cinfo->density_unit = 0; - cinfo->X_density = 1; - cinfo->Y_density = 1; - cinfo->saw_Adobe_marker = FALSE; - cinfo->Adobe_transform = 0; - - cinfo->marker->saw_SOI = TRUE; - - return TRUE; -} - - -LOCAL(boolean) -get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith) -/* Process a SOFn marker */ -{ - INT32 length; - int c, ci; - jpeg_component_info * compptr; - INPUT_VARS(cinfo); - - cinfo->progressive_mode = is_prog; - cinfo->arith_code = is_arith; - - INPUT_2BYTES(cinfo, length, return FALSE); - - INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE); - INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE); - INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE); - INPUT_BYTE(cinfo, cinfo->num_components, return FALSE); - - length -= 8; - - TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker, - (int) cinfo->image_width, (int) cinfo->image_height, - cinfo->num_components); - - if (cinfo->marker->saw_SOF) - ERREXIT(cinfo, JERR_SOF_DUPLICATE); - - /* We don't support files in which the image height is initially specified */ - /* as 0 and is later redefined by DNL. As long as we have to check that, */ - /* might as well have a general sanity check. */ - if (cinfo->image_height <= 0 || cinfo->image_width <= 0 - || cinfo->num_components <= 0) - ERREXIT(cinfo, JERR_EMPTY_IMAGE); - - if (length != (cinfo->num_components * 3)) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - if (cinfo->comp_info == NULL) /* do only once, even if suspend */ - cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components * SIZEOF(jpeg_component_info)); - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - compptr->component_index = ci; - INPUT_BYTE(cinfo, compptr->component_id, return FALSE); - INPUT_BYTE(cinfo, c, return FALSE); - compptr->h_samp_factor = (c >> 4) & 15; - compptr->v_samp_factor = (c ) & 15; - INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE); - - TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT, - compptr->component_id, compptr->h_samp_factor, - compptr->v_samp_factor, compptr->quant_tbl_no); - } - - cinfo->marker->saw_SOF = TRUE; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -LOCAL(boolean) -get_sos (j_decompress_ptr cinfo) -/* Process a SOS marker */ -{ - INT32 length; - int i, ci, n, c, cc; - jpeg_component_info * compptr; - INPUT_VARS(cinfo); - - if (! cinfo->marker->saw_SOF) - ERREXIT(cinfo, JERR_SOS_NO_SOF); - - INPUT_2BYTES(cinfo, length, return FALSE); - - INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ - - TRACEMS1(cinfo, 1, JTRC_SOS, n); - - if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - cinfo->comps_in_scan = n; - - /* Collect the component-spec parameters */ - - for (i = 0; i < n; i++) { - INPUT_BYTE(cinfo, cc, return FALSE); - INPUT_BYTE(cinfo, c, return FALSE); - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (cc == compptr->component_id) - goto id_found; - } - - ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); - - id_found: - - cinfo->cur_comp_info[i] = compptr; - compptr->dc_tbl_no = (c >> 4) & 15; - compptr->ac_tbl_no = (c ) & 15; - - TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, - compptr->dc_tbl_no, compptr->ac_tbl_no); - } - - /* Collect the additional scan parameters Ss, Se, Ah/Al. */ - INPUT_BYTE(cinfo, c, return FALSE); - cinfo->Ss = c; - INPUT_BYTE(cinfo, c, return FALSE); - cinfo->Se = c; - INPUT_BYTE(cinfo, c, return FALSE); - cinfo->Ah = (c >> 4) & 15; - cinfo->Al = (c ) & 15; - - TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, - cinfo->Ah, cinfo->Al); - - /* Prepare to scan data & restart markers */ - cinfo->marker->next_restart_num = 0; - - /* Count another SOS marker */ - cinfo->input_scan_number++; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -#ifdef D_ARITH_CODING_SUPPORTED - -LOCAL(boolean) -get_dac (j_decompress_ptr cinfo) -/* Process a DAC marker */ -{ - INT32 length; - int index, val; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - while (length > 0) { - INPUT_BYTE(cinfo, index, return FALSE); - INPUT_BYTE(cinfo, val, return FALSE); - - length -= 2; - - TRACEMS2(cinfo, 1, JTRC_DAC, index, val); - - if (index < 0 || index >= (2*NUM_ARITH_TBLS)) - ERREXIT1(cinfo, JERR_DAC_INDEX, index); - - if (index >= NUM_ARITH_TBLS) { /* define AC table */ - cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val; - } else { /* define DC table */ - cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F); - cinfo->arith_dc_U[index] = (UINT8) (val >> 4); - if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) - ERREXIT1(cinfo, JERR_DAC_VALUE, val); - } - } - - if (length != 0) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - INPUT_SYNC(cinfo); - return TRUE; -} - -#else /* ! D_ARITH_CODING_SUPPORTED */ - -#define get_dac(cinfo) skip_variable(cinfo) - -#endif /* D_ARITH_CODING_SUPPORTED */ - - -LOCAL(boolean) -get_dht (j_decompress_ptr cinfo) -/* Process a DHT marker */ -{ - INT32 length; - UINT8 bits[17]; - UINT8 huffval[256]; - int i, index, count; - JHUFF_TBL **htblptr; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - while (length > 16) { - INPUT_BYTE(cinfo, index, return FALSE); - - TRACEMS1(cinfo, 1, JTRC_DHT, index); - - bits[0] = 0; - count = 0; - for (i = 1; i <= 16; i++) { - INPUT_BYTE(cinfo, bits[i], return FALSE); - count += bits[i]; - } - - length -= 1 + 16; - - TRACEMS8(cinfo, 2, JTRC_HUFFBITS, - bits[1], bits[2], bits[3], bits[4], - bits[5], bits[6], bits[7], bits[8]); - TRACEMS8(cinfo, 2, JTRC_HUFFBITS, - bits[9], bits[10], bits[11], bits[12], - bits[13], bits[14], bits[15], bits[16]); - - /* Here we just do minimal validation of the counts to avoid walking - * off the end of our table space. jdhuff.c will check more carefully. - */ - if (count > 256 || ((INT32) count) > length) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - - for (i = 0; i < count; i++) - INPUT_BYTE(cinfo, huffval[i], return FALSE); - - length -= count; - - if (index & 0x10) { /* AC table definition */ - index -= 0x10; - htblptr = &cinfo->ac_huff_tbl_ptrs[index]; - } else { /* DC table definition */ - htblptr = &cinfo->dc_huff_tbl_ptrs[index]; - } - - if (index < 0 || index >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_DHT_INDEX, index); - - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - - MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); - MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval)); - } - - if (length != 0) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - INPUT_SYNC(cinfo); - return TRUE; -} - - -LOCAL(boolean) -get_dqt (j_decompress_ptr cinfo) -/* Process a DQT marker */ -{ - INT32 length; - int n, i, prec; - unsigned int tmp; - JQUANT_TBL *quant_ptr; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - while (length > 0) { - INPUT_BYTE(cinfo, n, return FALSE); - prec = n >> 4; - n &= 0x0F; - - TRACEMS2(cinfo, 1, JTRC_DQT, n, prec); - - if (n >= NUM_QUANT_TBLS) - ERREXIT1(cinfo, JERR_DQT_INDEX, n); - - if (cinfo->quant_tbl_ptrs[n] == NULL) - cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); - quant_ptr = cinfo->quant_tbl_ptrs[n]; - - for (i = 0; i < DCTSIZE2; i++) { - if (prec) - INPUT_2BYTES(cinfo, tmp, return FALSE); - else - INPUT_BYTE(cinfo, tmp, return FALSE); - /* We convert the zigzag-order table to natural array order. */ - quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp; - } - - if (cinfo->err->trace_level >= 2) { - for (i = 0; i < DCTSIZE2; i += 8) { - TRACEMS8(cinfo, 2, JTRC_QUANTVALS, - quant_ptr->quantval[i], quant_ptr->quantval[i+1], - quant_ptr->quantval[i+2], quant_ptr->quantval[i+3], - quant_ptr->quantval[i+4], quant_ptr->quantval[i+5], - quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]); - } - } - - length -= DCTSIZE2+1; - if (prec) length -= DCTSIZE2; - } - - if (length != 0) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - INPUT_SYNC(cinfo); - return TRUE; -} - - -LOCAL(boolean) -get_dri (j_decompress_ptr cinfo) -/* Process a DRI marker */ -{ - INT32 length; - unsigned int tmp; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - - if (length != 4) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - INPUT_2BYTES(cinfo, tmp, return FALSE); - - TRACEMS1(cinfo, 1, JTRC_DRI, tmp); - - cinfo->restart_interval = tmp; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -/* - * Routines for processing APPn and COM markers. - * These are either saved in memory or discarded, per application request. - * APP0 and APP14 are specially checked to see if they are - * JFIF and Adobe markers, respectively. - */ - -#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */ -#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */ -#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */ - - -LOCAL(void) -examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data, - unsigned int datalen, INT32 remaining) -/* Examine first few bytes from an APP0. - * Take appropriate action if it is a JFIF marker. - * datalen is # of bytes at data[], remaining is length of rest of marker data. - */ -{ - INT32 totallen = (INT32) datalen + remaining; - - if (datalen >= APP0_DATA_LEN && - GETJOCTET(data[0]) == 0x4A && - GETJOCTET(data[1]) == 0x46 && - GETJOCTET(data[2]) == 0x49 && - GETJOCTET(data[3]) == 0x46 && - GETJOCTET(data[4]) == 0) { - /* Found JFIF APP0 marker: save info */ - cinfo->saw_JFIF_marker = TRUE; - cinfo->JFIF_major_version = GETJOCTET(data[5]); - cinfo->JFIF_minor_version = GETJOCTET(data[6]); - cinfo->density_unit = GETJOCTET(data[7]); - cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]); - cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]); - /* Check version. - * Major version must be 1, anything else signals an incompatible change. - * (We used to treat this as an error, but now it's a nonfatal warning, - * because some bozo at Hijaak couldn't read the spec.) - * Minor version should be 0..2, but process anyway if newer. - */ - if (cinfo->JFIF_major_version != 1) - WARNMS2(cinfo, JWRN_JFIF_MAJOR, - cinfo->JFIF_major_version, cinfo->JFIF_minor_version); - /* Generate trace messages */ - TRACEMS5(cinfo, 1, JTRC_JFIF, - cinfo->JFIF_major_version, cinfo->JFIF_minor_version, - cinfo->X_density, cinfo->Y_density, cinfo->density_unit); - /* Validate thumbnail dimensions and issue appropriate messages */ - if (GETJOCTET(data[12]) | GETJOCTET(data[13])) - TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, - GETJOCTET(data[12]), GETJOCTET(data[13])); - totallen -= APP0_DATA_LEN; - if (totallen != - ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3)) - TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen); - } else if (datalen >= 6 && - GETJOCTET(data[0]) == 0x4A && - GETJOCTET(data[1]) == 0x46 && - GETJOCTET(data[2]) == 0x58 && - GETJOCTET(data[3]) == 0x58 && - GETJOCTET(data[4]) == 0) { - /* Found JFIF "JFXX" extension APP0 marker */ - /* The library doesn't actually do anything with these, - * but we try to produce a helpful trace message. - */ - switch (GETJOCTET(data[5])) { - case 0x10: - TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen); - break; - case 0x11: - TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen); - break; - case 0x13: - TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen); - break; - default: - TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, - GETJOCTET(data[5]), (int) totallen); - break; - } - } else { - /* Start of APP0 does not match "JFIF" or "JFXX", or too short */ - TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen); - } -} - - -LOCAL(void) -examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data, - unsigned int datalen, INT32 remaining) -/* Examine first few bytes from an APP14. - * Take appropriate action if it is an Adobe marker. - * datalen is # of bytes at data[], remaining is length of rest of marker data. - */ -{ - unsigned int version, flags0, flags1, transform; - - if (datalen >= APP14_DATA_LEN && - GETJOCTET(data[0]) == 0x41 && - GETJOCTET(data[1]) == 0x64 && - GETJOCTET(data[2]) == 0x6F && - GETJOCTET(data[3]) == 0x62 && - GETJOCTET(data[4]) == 0x65) { - /* Found Adobe APP14 marker */ - version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]); - flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]); - flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]); - transform = GETJOCTET(data[11]); - TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform); - cinfo->saw_Adobe_marker = TRUE; - cinfo->Adobe_transform = (UINT8) transform; - } else { - /* Start of APP14 does not match "Adobe", or too short */ - TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining)); - } -} - - -METHODDEF(boolean) -get_interesting_appn (j_decompress_ptr cinfo) -/* Process an APP0 or APP14 marker without saving it */ -{ - INT32 length; - JOCTET b[APPN_DATA_LEN]; - unsigned int i, numtoread; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - /* get the interesting part of the marker data */ - if (length >= APPN_DATA_LEN) - numtoread = APPN_DATA_LEN; - else if (length > 0) - numtoread = (unsigned int) length; - else - numtoread = 0; - for (i = 0; i < numtoread; i++) - INPUT_BYTE(cinfo, b[i], return FALSE); - length -= numtoread; - - /* process it */ - switch (cinfo->unread_marker) { - case M_APP0: - examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length); - break; - case M_APP14: - examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length); - break; - default: - /* can't get here unless jpeg_save_markers chooses wrong processor */ - ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); - break; - } - - /* skip any remaining data -- could be lots */ - INPUT_SYNC(cinfo); - if (length > 0) - (*cinfo->src->skip_input_data) (cinfo, (long) length); - - return TRUE; -} - - -#ifdef SAVE_MARKERS_SUPPORTED - -METHODDEF(boolean) -save_marker (j_decompress_ptr cinfo) -/* Save an APPn or COM marker into the marker list */ -{ - my_marker_ptr marker = (my_marker_ptr) cinfo->marker; - jpeg_saved_marker_ptr cur_marker = marker->cur_marker; - unsigned int bytes_read, data_length; - JOCTET FAR * data; - INT32 length = 0; - INPUT_VARS(cinfo); - - if (cur_marker == NULL) { - /* begin reading a marker */ - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - if (length >= 0) { /* watch out for bogus length word */ - /* figure out how much we want to save */ - unsigned int limit; - if (cinfo->unread_marker == (int) M_COM) - limit = marker->length_limit_COM; - else - limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0]; - if ((unsigned int) length < limit) - limit = (unsigned int) length; - /* allocate and initialize the marker item */ - cur_marker = (jpeg_saved_marker_ptr) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(struct jpeg_marker_struct) + limit); - cur_marker->next = NULL; - cur_marker->marker = (UINT8) cinfo->unread_marker; - cur_marker->original_length = (unsigned int) length; - cur_marker->data_length = limit; - /* data area is just beyond the jpeg_marker_struct */ - data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1); - marker->cur_marker = cur_marker; - marker->bytes_read = 0; - bytes_read = 0; - data_length = limit; - } else { - /* deal with bogus length word */ - bytes_read = data_length = 0; - data = NULL; - } - } else { - /* resume reading a marker */ - bytes_read = marker->bytes_read; - data_length = cur_marker->data_length; - data = cur_marker->data + bytes_read; - } - - while (bytes_read < data_length) { - INPUT_SYNC(cinfo); /* move the restart point to here */ - marker->bytes_read = bytes_read; - /* If there's not at least one byte in buffer, suspend */ - MAKE_BYTE_AVAIL(cinfo, return FALSE); - /* Copy bytes with reasonable rapidity */ - while (bytes_read < data_length && bytes_in_buffer > 0) { - *data++ = *next_input_byte++; - bytes_in_buffer--; - bytes_read++; - } - } - - /* Done reading what we want to read */ - if (cur_marker != NULL) { /* will be NULL if bogus length word */ - /* Add new marker to end of list */ - if (cinfo->marker_list == NULL) { - cinfo->marker_list = cur_marker; - } else { - jpeg_saved_marker_ptr prev = cinfo->marker_list; - while (prev->next != NULL) - prev = prev->next; - prev->next = cur_marker; - } - /* Reset pointer & calc remaining data length */ - data = cur_marker->data; - length = cur_marker->original_length - data_length; - } - /* Reset to initial state for next marker */ - marker->cur_marker = NULL; - - /* Process the marker if interesting; else just make a generic trace msg */ - switch (cinfo->unread_marker) { - case M_APP0: - examine_app0(cinfo, data, data_length, length); - break; - case M_APP14: - examine_app14(cinfo, data, data_length, length); - break; - default: - TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, - (int) (data_length + length)); - break; - } - - /* skip any remaining data -- could be lots */ - INPUT_SYNC(cinfo); /* do before skip_input_data */ - if (length > 0) - (*cinfo->src->skip_input_data) (cinfo, (long) length); - - return TRUE; -} - -#endif /* SAVE_MARKERS_SUPPORTED */ - - -METHODDEF(boolean) -skip_variable (j_decompress_ptr cinfo) -/* Skip over an unknown or uninteresting variable-length marker */ -{ - INT32 length; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length); - - INPUT_SYNC(cinfo); /* do before skip_input_data */ - if (length > 0) - (*cinfo->src->skip_input_data) (cinfo, (long) length); - - return TRUE; -} - - -/* - * Find the next JPEG marker, save it in cinfo->unread_marker. - * Returns FALSE if had to suspend before reaching a marker; - * in that case cinfo->unread_marker is unchanged. - * - * Note that the result might not be a valid marker code, - * but it will never be 0 or FF. - */ - -LOCAL(boolean) -next_marker (j_decompress_ptr cinfo) -{ - int c; - INPUT_VARS(cinfo); - - for (;;) { - INPUT_BYTE(cinfo, c, return FALSE); - /* Skip any non-FF bytes. - * This may look a bit inefficient, but it will not occur in a valid file. - * We sync after each discarded byte so that a suspending data source - * can discard the byte from its buffer. - */ - while (c != 0xFF) { - cinfo->marker->discarded_bytes++; - INPUT_SYNC(cinfo); - INPUT_BYTE(cinfo, c, return FALSE); - } - /* This loop swallows any duplicate FF bytes. Extra FFs are legal as - * pad bytes, so don't count them in discarded_bytes. We assume there - * will not be so many consecutive FF bytes as to overflow a suspending - * data source's input buffer. - */ - do { - INPUT_BYTE(cinfo, c, return FALSE); - } while (c == 0xFF); - if (c != 0) - break; /* found a valid marker, exit loop */ - /* Reach here if we found a stuffed-zero data sequence (FF/00). - * Discard it and loop back to try again. - */ - cinfo->marker->discarded_bytes += 2; - INPUT_SYNC(cinfo); - } - - if (cinfo->marker->discarded_bytes != 0) { - WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c); - cinfo->marker->discarded_bytes = 0; - } - - cinfo->unread_marker = c; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -LOCAL(boolean) -first_marker (j_decompress_ptr cinfo) -/* Like next_marker, but used to obtain the initial SOI marker. */ -/* For this marker, we do not allow preceding garbage or fill; otherwise, - * we might well scan an entire input file before realizing it ain't JPEG. - * If an application wants to process non-JFIF files, it must seek to the - * SOI before calling the JPEG library. - */ -{ - int c, c2; - INPUT_VARS(cinfo); - - INPUT_BYTE(cinfo, c, return FALSE); - INPUT_BYTE(cinfo, c2, return FALSE); - if (c != 0xFF || c2 != (int) M_SOI) - ERREXIT2(cinfo, JERR_NO_SOI, c, c2); - - cinfo->unread_marker = c2; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -/* - * Read markers until SOS or EOI. - * - * Returns same codes as are defined for jpeg_consume_input: - * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. - */ - -METHODDEF(int) -read_markers (j_decompress_ptr cinfo) -{ - /* Outer loop repeats once for each marker. */ - for (;;) { - /* Collect the marker proper, unless we already did. */ - /* NB: first_marker() enforces the requirement that SOI appear first. */ - if (cinfo->unread_marker == 0) { - if (! cinfo->marker->saw_SOI) { - if (! first_marker(cinfo)) - return JPEG_SUSPENDED; - } else { - if (! next_marker(cinfo)) - return JPEG_SUSPENDED; - } - } - /* At this point cinfo->unread_marker contains the marker code and the - * input point is just past the marker proper, but before any parameters. - * A suspension will cause us to return with this state still true. - */ - switch (cinfo->unread_marker) { - case M_SOI: - if (! get_soi(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_SOF0: /* Baseline */ - case M_SOF1: /* Extended sequential, Huffman */ - if (! get_sof(cinfo, FALSE, FALSE)) - return JPEG_SUSPENDED; - break; - - case M_SOF2: /* Progressive, Huffman */ - if (! get_sof(cinfo, TRUE, FALSE)) - return JPEG_SUSPENDED; - break; - - case M_SOF9: /* Extended sequential, arithmetic */ - if (! get_sof(cinfo, FALSE, TRUE)) - return JPEG_SUSPENDED; - break; - - case M_SOF10: /* Progressive, arithmetic */ - if (! get_sof(cinfo, TRUE, TRUE)) - return JPEG_SUSPENDED; - break; - - /* Currently unsupported SOFn types */ - case M_SOF3: /* Lossless, Huffman */ - case M_SOF5: /* Differential sequential, Huffman */ - case M_SOF6: /* Differential progressive, Huffman */ - case M_SOF7: /* Differential lossless, Huffman */ - case M_JPG: /* Reserved for JPEG extensions */ - case M_SOF11: /* Lossless, arithmetic */ - case M_SOF13: /* Differential sequential, arithmetic */ - case M_SOF14: /* Differential progressive, arithmetic */ - case M_SOF15: /* Differential lossless, arithmetic */ - ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker); - break; - - case M_SOS: - if (! get_sos(cinfo)) - return JPEG_SUSPENDED; - cinfo->unread_marker = 0; /* processed the marker */ - return JPEG_REACHED_SOS; - - case M_EOI: - TRACEMS(cinfo, 1, JTRC_EOI); - cinfo->unread_marker = 0; /* processed the marker */ - return JPEG_REACHED_EOI; - - case M_DAC: - if (! get_dac(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_DHT: - if (! get_dht(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_DQT: - if (! get_dqt(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_DRI: - if (! get_dri(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_APP0: - case M_APP1: - case M_APP2: - case M_APP3: - case M_APP4: - case M_APP5: - case M_APP6: - case M_APP7: - case M_APP8: - case M_APP9: - case M_APP10: - case M_APP11: - case M_APP12: - case M_APP13: - case M_APP14: - case M_APP15: - if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[ - cinfo->unread_marker - (int) M_APP0]) (cinfo)) - return JPEG_SUSPENDED; - break; - - case M_COM: - if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo)) - return JPEG_SUSPENDED; - break; - - case M_RST0: /* these are all parameterless */ - case M_RST1: - case M_RST2: - case M_RST3: - case M_RST4: - case M_RST5: - case M_RST6: - case M_RST7: - case M_TEM: - TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker); - break; - - case M_DNL: /* Ignore DNL ... perhaps the wrong thing */ - if (! skip_variable(cinfo)) - return JPEG_SUSPENDED; - break; - - default: /* must be DHP, EXP, JPGn, or RESn */ - /* For now, we treat the reserved markers as fatal errors since they are - * likely to be used to signal incompatible JPEG Part 3 extensions. - * Once the JPEG 3 version-number marker is well defined, this code - * ought to change! - */ - ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); - break; - } - /* Successfully processed marker, so reset state variable */ - cinfo->unread_marker = 0; - } /* end loop */ -} - - -/* - * Read a restart marker, which is expected to appear next in the datastream; - * if the marker is not there, take appropriate recovery action. - * Returns FALSE if suspension is required. - * - * This is called by the entropy decoder after it has read an appropriate - * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder - * has already read a marker from the data source. Under normal conditions - * cinfo->unread_marker will be reset to 0 before returning; if not reset, - * it holds a marker which the decoder will be unable to read past. - */ - -METHODDEF(boolean) -read_restart_marker (j_decompress_ptr cinfo) -{ - /* Obtain a marker unless we already did. */ - /* Note that next_marker will complain if it skips any data. */ - if (cinfo->unread_marker == 0) { - if (! next_marker(cinfo)) - return FALSE; - } - - if (cinfo->unread_marker == - ((int) M_RST0 + cinfo->marker->next_restart_num)) { - /* Normal case --- swallow the marker and let entropy decoder continue */ - TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num); - cinfo->unread_marker = 0; - } else { - /* Uh-oh, the restart markers have been messed up. */ - /* Let the data source manager determine how to resync. */ - if (! (*cinfo->src->resync_to_restart) (cinfo, - cinfo->marker->next_restart_num)) - return FALSE; - } - - /* Update next-restart state */ - cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7; - - return TRUE; -} - - -/* - * This is the default resync_to_restart method for data source managers - * to use if they don't have any better approach. Some data source managers - * may be able to back up, or may have additional knowledge about the data - * which permits a more intelligent recovery strategy; such managers would - * presumably supply their own resync method. - * - * read_restart_marker calls resync_to_restart if it finds a marker other than - * the restart marker it was expecting. (This code is *not* used unless - * a nonzero restart interval has been declared.) cinfo->unread_marker is - * the marker code actually found (might be anything, except 0 or FF). - * The desired restart marker number (0..7) is passed as a parameter. - * This routine is supposed to apply whatever error recovery strategy seems - * appropriate in order to position the input stream to the next data segment. - * Note that cinfo->unread_marker is treated as a marker appearing before - * the current data-source input point; usually it should be reset to zero - * before returning. - * Returns FALSE if suspension is required. - * - * This implementation is substantially constrained by wanting to treat the - * input as a data stream; this means we can't back up. Therefore, we have - * only the following actions to work with: - * 1. Simply discard the marker and let the entropy decoder resume at next - * byte of file. - * 2. Read forward until we find another marker, discarding intervening - * data. (In theory we could look ahead within the current bufferload, - * without having to discard data if we don't find the desired marker. - * This idea is not implemented here, in part because it makes behavior - * dependent on buffer size and chance buffer-boundary positions.) - * 3. Leave the marker unread (by failing to zero cinfo->unread_marker). - * This will cause the entropy decoder to process an empty data segment, - * inserting dummy zeroes, and then we will reprocess the marker. - * - * #2 is appropriate if we think the desired marker lies ahead, while #3 is - * appropriate if the found marker is a future restart marker (indicating - * that we have missed the desired restart marker, probably because it got - * corrupted). - * We apply #2 or #3 if the found marker is a restart marker no more than - * two counts behind or ahead of the expected one. We also apply #2 if the - * found marker is not a legal JPEG marker code (it's certainly bogus data). - * If the found marker is a restart marker more than 2 counts away, we do #1 - * (too much risk that the marker is erroneous; with luck we will be able to - * resync at some future point). - * For any valid non-restart JPEG marker, we apply #3. This keeps us from - * overrunning the end of a scan. An implementation limited to single-scan - * files might find it better to apply #2 for markers other than EOI, since - * any other marker would have to be bogus data in that case. - */ - -GLOBAL(boolean) -jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired) -{ - int marker = cinfo->unread_marker; - int action = 1; - - /* Always put up a warning. */ - WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired); - - /* Outer loop handles repeated decision after scanning forward. */ - for (;;) { - if (marker < (int) M_SOF0) - action = 2; /* invalid marker */ - else if (marker < (int) M_RST0 || marker > (int) M_RST7) - action = 3; /* valid non-restart marker */ - else { - if (marker == ((int) M_RST0 + ((desired+1) & 7)) || - marker == ((int) M_RST0 + ((desired+2) & 7))) - action = 3; /* one of the next two expected restarts */ - else if (marker == ((int) M_RST0 + ((desired-1) & 7)) || - marker == ((int) M_RST0 + ((desired-2) & 7))) - action = 2; /* a prior restart, so advance */ - else - action = 1; /* desired restart or too far away */ - } - TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action); - switch (action) { - case 1: - /* Discard marker and let entropy decoder resume processing. */ - cinfo->unread_marker = 0; - return TRUE; - case 2: - /* Scan to the next marker, and repeat the decision loop. */ - if (! next_marker(cinfo)) - return FALSE; - marker = cinfo->unread_marker; - break; - case 3: - /* Return without advancing past this marker. */ - /* Entropy decoder will be forced to process an empty segment. */ - return TRUE; - } - } /* end loop */ -} - - -/* - * Reset marker processing state to begin a fresh datastream. - */ - -METHODDEF(void) -reset_marker_reader (j_decompress_ptr cinfo) -{ - my_marker_ptr marker = (my_marker_ptr) cinfo->marker; - - cinfo->comp_info = NULL; /* until allocated by get_sof */ - cinfo->input_scan_number = 0; /* no SOS seen yet */ - cinfo->unread_marker = 0; /* no pending marker */ - marker->pub.saw_SOI = FALSE; /* set internal state too */ - marker->pub.saw_SOF = FALSE; - marker->pub.discarded_bytes = 0; - marker->cur_marker = NULL; -} - - -/* - * Initialize the marker reader module. - * This is called only once, when the decompression object is created. - */ - -GLOBAL(void) -jinit_marker_reader (j_decompress_ptr cinfo) -{ - my_marker_ptr marker; - int i; - - /* Create subobject in permanent pool */ - marker = (my_marker_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - SIZEOF(my_marker_reader)); - cinfo->marker = (struct jpeg_marker_reader *) marker; - /* Initialize public method pointers */ - marker->pub.reset_marker_reader = reset_marker_reader; - marker->pub.read_markers = read_markers; - marker->pub.read_restart_marker = read_restart_marker; - /* Initialize COM/APPn processing. - * By default, we examine and then discard APP0 and APP14, - * but simply discard COM and all other APPn. - */ - marker->process_COM = skip_variable; - marker->length_limit_COM = 0; - for (i = 0; i < 16; i++) { - marker->process_APPn[i] = skip_variable; - marker->length_limit_APPn[i] = 0; - } - marker->process_APPn[0] = get_interesting_appn; - marker->process_APPn[14] = get_interesting_appn; - /* Reset marker processing state */ - reset_marker_reader(cinfo); -} - - -/* - * Control saving of COM and APPn markers into marker_list. - */ - -#ifdef SAVE_MARKERS_SUPPORTED - -GLOBAL(void) -jpeg_save_markers (j_decompress_ptr cinfo, int marker_code, - unsigned int length_limit) -{ - my_marker_ptr marker = (my_marker_ptr) cinfo->marker; - long maxlength; - jpeg_marker_parser_method processor; - - /* Length limit mustn't be larger than what we can allocate - * (should only be a concern in a 16-bit environment). - */ - maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct); - if (((long) length_limit) > maxlength) - length_limit = (unsigned int) maxlength; - - /* Choose processor routine to use. - * APP0/APP14 have special requirements. - */ - if (length_limit) { - processor = save_marker; - /* If saving APP0/APP14, save at least enough for our internal use. */ - if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN) - length_limit = APP0_DATA_LEN; - else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN) - length_limit = APP14_DATA_LEN; - } else { - processor = skip_variable; - /* If discarding APP0/APP14, use our regular on-the-fly processor. */ - if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14) - processor = get_interesting_appn; - } - - if (marker_code == (int) M_COM) { - marker->process_COM = processor; - marker->length_limit_COM = length_limit; - } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) { - marker->process_APPn[marker_code - (int) M_APP0] = processor; - marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit; - } else - ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); -} - -#endif /* SAVE_MARKERS_SUPPORTED */ - - -/* - * Install a special processing method for COM or APPn markers. - */ - -GLOBAL(void) -jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code, - jpeg_marker_parser_method routine) -{ - my_marker_ptr marker = (my_marker_ptr) cinfo->marker; - - if (marker_code == (int) M_COM) - marker->process_COM = routine; - else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) - marker->process_APPn[marker_code - (int) M_APP0] = routine; - else - ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); -} diff --git a/src/SFML/Graphics/libjpeg/jdmaster.c b/src/SFML/Graphics/libjpeg/jdmaster.c deleted file mode 100644 index eda4b3fa..00000000 --- a/src/SFML/Graphics/libjpeg/jdmaster.c +++ /dev/null @@ -1,557 +0,0 @@ -/* - * jdmaster.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains master control logic for the JPEG decompressor. - * These routines are concerned with selecting the modules to be executed - * and with determining the number of passes and the work to be done in each - * pass. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private state */ - -typedef struct { - struct jpeg_decomp_master pub; /* public fields */ - - int pass_number; /* # of passes completed */ - - boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */ - - /* Saved references to initialized quantizer modules, - * in case we need to switch modes. - */ - struct jpeg_color_quantizer * quantizer_1pass; - struct jpeg_color_quantizer * quantizer_2pass; -} my_decomp_master; - -typedef my_decomp_master * my_master_ptr; - - -/* - * Determine whether merged upsample/color conversion should be used. - * CRUCIAL: this must match the actual capabilities of jdmerge.c! - */ - -LOCAL(boolean) -use_merged_upsample (j_decompress_ptr cinfo) -{ -#ifdef UPSAMPLE_MERGING_SUPPORTED - /* Merging is the equivalent of plain box-filter upsampling */ - if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling) - return FALSE; - /* jdmerge.c only supports YCC=>RGB color conversion */ - if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 || - cinfo->out_color_space != JCS_RGB || - cinfo->out_color_components != RGB_PIXELSIZE) - return FALSE; - /* and it only handles 2h1v or 2h2v sampling ratios */ - if (cinfo->comp_info[0].h_samp_factor != 2 || - cinfo->comp_info[1].h_samp_factor != 1 || - cinfo->comp_info[2].h_samp_factor != 1 || - cinfo->comp_info[0].v_samp_factor > 2 || - cinfo->comp_info[1].v_samp_factor != 1 || - cinfo->comp_info[2].v_samp_factor != 1) - return FALSE; - /* furthermore, it doesn't work if we've scaled the IDCTs differently */ - if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size || - cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size || - cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size) - return FALSE; - /* ??? also need to test for upsample-time rescaling, when & if supported */ - return TRUE; /* by golly, it'll work... */ -#else - return FALSE; -#endif -} - - -/* - * Compute output image dimensions and related values. - * NOTE: this is exported for possible use by application. - * Hence it mustn't do anything that can't be done twice. - * Also note that it may be called before the master module is initialized! - */ - -GLOBAL(void) -jpeg_calc_output_dimensions (j_decompress_ptr cinfo) -/* Do computations that are needed before master selection phase */ -{ -#ifdef IDCT_SCALING_SUPPORTED - int ci; - jpeg_component_info *compptr; -#endif - - /* Prevent application from calling me at wrong times */ - if (cinfo->global_state != DSTATE_READY) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - -#ifdef IDCT_SCALING_SUPPORTED - - /* Compute actual output image dimensions and DCT scaling choices. */ - if (cinfo->scale_num * 8 <= cinfo->scale_denom) { - /* Provide 1/8 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 8L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 8L); - cinfo->min_DCT_scaled_size = 1; - } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) { - /* Provide 1/4 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 4L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 4L); - cinfo->min_DCT_scaled_size = 2; - } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) { - /* Provide 1/2 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 2L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 2L); - cinfo->min_DCT_scaled_size = 4; - } else { - /* Provide 1/1 scaling */ - cinfo->output_width = cinfo->image_width; - cinfo->output_height = cinfo->image_height; - cinfo->min_DCT_scaled_size = DCTSIZE; - } - /* In selecting the actual DCT scaling for each component, we try to - * scale up the chroma components via IDCT scaling rather than upsampling. - * This saves time if the upsampler gets to use 1:1 scaling. - * Note this code assumes that the supported DCT scalings are powers of 2. - */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - int ssize = cinfo->min_DCT_scaled_size; - while (ssize < DCTSIZE && - (compptr->h_samp_factor * ssize * 2 <= - cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) && - (compptr->v_samp_factor * ssize * 2 <= - cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) { - ssize = ssize * 2; - } - compptr->DCT_scaled_size = ssize; - } - - /* Recompute downsampled dimensions of components; - * application needs to know these if using raw downsampled data. - */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Size in samples, after IDCT scaling */ - compptr->downsampled_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * - (long) (compptr->h_samp_factor * compptr->DCT_scaled_size), - (long) (cinfo->max_h_samp_factor * DCTSIZE)); - compptr->downsampled_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * - (long) (compptr->v_samp_factor * compptr->DCT_scaled_size), - (long) (cinfo->max_v_samp_factor * DCTSIZE)); - } - -#else /* !IDCT_SCALING_SUPPORTED */ - - /* Hardwire it to "no scaling" */ - cinfo->output_width = cinfo->image_width; - cinfo->output_height = cinfo->image_height; - /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE, - * and has computed unscaled downsampled_width and downsampled_height. - */ - -#endif /* IDCT_SCALING_SUPPORTED */ - - /* Report number of components in selected colorspace. */ - /* Probably this should be in the color conversion module... */ - switch (cinfo->out_color_space) { - case JCS_GRAYSCALE: - cinfo->out_color_components = 1; - break; - case JCS_RGB: -#if RGB_PIXELSIZE != 3 - cinfo->out_color_components = RGB_PIXELSIZE; - break; -#endif /* else share code with YCbCr */ - case JCS_YCbCr: - cinfo->out_color_components = 3; - break; - case JCS_CMYK: - case JCS_YCCK: - cinfo->out_color_components = 4; - break; - default: /* else must be same colorspace as in file */ - cinfo->out_color_components = cinfo->num_components; - break; - } - cinfo->output_components = (cinfo->quantize_colors ? 1 : - cinfo->out_color_components); - - /* See if upsampler will want to emit more than one row at a time */ - if (use_merged_upsample(cinfo)) - cinfo->rec_outbuf_height = cinfo->max_v_samp_factor; - else - cinfo->rec_outbuf_height = 1; -} - - -/* - * Several decompression processes need to range-limit values to the range - * 0..MAXJSAMPLE; the input value may fall somewhat outside this range - * due to noise introduced by quantization, roundoff error, etc. These - * processes are inner loops and need to be as fast as possible. On most - * machines, particularly CPUs with pipelines or instruction prefetch, - * a (subscript-check-less) C table lookup - * x = sample_range_limit[x]; - * is faster than explicit tests - * if (x < 0) x = 0; - * else if (x > MAXJSAMPLE) x = MAXJSAMPLE; - * These processes all use a common table prepared by the routine below. - * - * For most steps we can mathematically guarantee that the initial value - * of x is within MAXJSAMPLE+1 of the legal range, so a table running from - * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial - * limiting step (just after the IDCT), a wildly out-of-range value is - * possible if the input data is corrupt. To avoid any chance of indexing - * off the end of memory and getting a bad-pointer trap, we perform the - * post-IDCT limiting thus: - * x = range_limit[x & MASK]; - * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit - * samples. Under normal circumstances this is more than enough range and - * a correct output will be generated; with bogus input data the mask will - * cause wraparound, and we will safely generate a bogus-but-in-range output. - * For the post-IDCT step, we want to convert the data from signed to unsigned - * representation by adding CENTERJSAMPLE at the same time that we limit it. - * So the post-IDCT limiting table ends up looking like this: - * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE, - * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), - * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), - * 0,1,...,CENTERJSAMPLE-1 - * Negative inputs select values from the upper half of the table after - * masking. - * - * We can save some space by overlapping the start of the post-IDCT table - * with the simpler range limiting table. The post-IDCT table begins at - * sample_range_limit + CENTERJSAMPLE. - * - * Note that the table is allocated in near data space on PCs; it's small - * enough and used often enough to justify this. - */ - -LOCAL(void) -prepare_range_limit_table (j_decompress_ptr cinfo) -/* Allocate and fill in the sample_range_limit table */ -{ - JSAMPLE * table; - int i; - - table = (JSAMPLE *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE)); - table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */ - cinfo->sample_range_limit = table; - /* First segment of "simple" table: limit[x] = 0 for x < 0 */ - MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE)); - /* Main part of "simple" table: limit[x] = x */ - for (i = 0; i <= MAXJSAMPLE; i++) - table[i] = (JSAMPLE) i; - table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */ - /* End of simple table, rest of first half of post-IDCT table */ - for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++) - table[i] = MAXJSAMPLE; - /* Second half of post-IDCT table */ - MEMZERO(table + (2 * (MAXJSAMPLE+1)), - (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE)); - MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE), - cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE)); -} - - -/* - * Master selection of decompression modules. - * This is done once at jpeg_start_decompress time. We determine - * which modules will be used and give them appropriate initialization calls. - * We also initialize the decompressor input side to begin consuming data. - * - * Since jpeg_read_header has finished, we know what is in the SOF - * and (first) SOS markers. We also have all the application parameter - * settings. - */ - -LOCAL(void) -master_selection (j_decompress_ptr cinfo) -{ - my_master_ptr master = (my_master_ptr) cinfo->master; - boolean use_c_buffer; - long samplesperrow; - JDIMENSION jd_samplesperrow; - - /* Initialize dimensions and other stuff */ - jpeg_calc_output_dimensions(cinfo); - prepare_range_limit_table(cinfo); - - /* Width of an output scanline must be representable as JDIMENSION. */ - samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components; - jd_samplesperrow = (JDIMENSION) samplesperrow; - if ((long) jd_samplesperrow != samplesperrow) - ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); - - /* Initialize my private state */ - master->pass_number = 0; - master->using_merged_upsample = use_merged_upsample(cinfo); - - /* Color quantizer selection */ - master->quantizer_1pass = NULL; - master->quantizer_2pass = NULL; - /* No mode changes if not using buffered-image mode. */ - if (! cinfo->quantize_colors || ! cinfo->buffered_image) { - cinfo->enable_1pass_quant = FALSE; - cinfo->enable_external_quant = FALSE; - cinfo->enable_2pass_quant = FALSE; - } - if (cinfo->quantize_colors) { - if (cinfo->raw_data_out) - ERREXIT(cinfo, JERR_NOTIMPL); - /* 2-pass quantizer only works in 3-component color space. */ - if (cinfo->out_color_components != 3) { - cinfo->enable_1pass_quant = TRUE; - cinfo->enable_external_quant = FALSE; - cinfo->enable_2pass_quant = FALSE; - cinfo->colormap = NULL; - } else if (cinfo->colormap != NULL) { - cinfo->enable_external_quant = TRUE; - } else if (cinfo->two_pass_quantize) { - cinfo->enable_2pass_quant = TRUE; - } else { - cinfo->enable_1pass_quant = TRUE; - } - - if (cinfo->enable_1pass_quant) { -#ifdef QUANT_1PASS_SUPPORTED - jinit_1pass_quantizer(cinfo); - master->quantizer_1pass = cinfo->cquantize; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } - - /* We use the 2-pass code to map to external colormaps. */ - if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) { -#ifdef QUANT_2PASS_SUPPORTED - jinit_2pass_quantizer(cinfo); - master->quantizer_2pass = cinfo->cquantize; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } - /* If both quantizers are initialized, the 2-pass one is left active; - * this is necessary for starting with quantization to an external map. - */ - } - - /* Post-processing: in particular, color conversion first */ - if (! cinfo->raw_data_out) { - if (master->using_merged_upsample) { -#ifdef UPSAMPLE_MERGING_SUPPORTED - jinit_merged_upsampler(cinfo); /* does color conversion too */ -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - jinit_color_deconverter(cinfo); - jinit_upsampler(cinfo); - } - jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant); - } - /* Inverse DCT */ - jinit_inverse_dct(cinfo); - /* Entropy decoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef D_PROGRESSIVE_SUPPORTED - jinit_phuff_decoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_decoder(cinfo); - } - - /* Initialize principal buffer controllers. */ - use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image; - jinit_d_coef_controller(cinfo, use_c_buffer); - - if (! cinfo->raw_data_out) - jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */); - - /* We can now tell the memory manager to allocate virtual arrays. */ - (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); - - /* Initialize input side of decompressor to consume first scan. */ - (*cinfo->inputctl->start_input_pass) (cinfo); - -#ifdef D_MULTISCAN_FILES_SUPPORTED - /* If jpeg_start_decompress will read the whole file, initialize - * progress monitoring appropriately. The input step is counted - * as one pass. - */ - if (cinfo->progress != NULL && ! cinfo->buffered_image && - cinfo->inputctl->has_multiple_scans) { - int nscans; - /* Estimate number of scans to set pass_limit. */ - if (cinfo->progressive_mode) { - /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ - nscans = 2 + 3 * cinfo->num_components; - } else { - /* For a nonprogressive multiscan file, estimate 1 scan per component. */ - nscans = cinfo->num_components; - } - cinfo->progress->pass_counter = 0L; - cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; - cinfo->progress->completed_passes = 0; - cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2); - /* Count the input pass as done */ - master->pass_number++; - } -#endif /* D_MULTISCAN_FILES_SUPPORTED */ -} - - -/* - * Per-pass setup. - * This is called at the beginning of each output pass. We determine which - * modules will be active during this pass and give them appropriate - * start_pass calls. We also set is_dummy_pass to indicate whether this - * is a "real" output pass or a dummy pass for color quantization. - * (In the latter case, jdapistd.c will crank the pass to completion.) - */ - -METHODDEF(void) -prepare_for_output_pass (j_decompress_ptr cinfo) -{ - my_master_ptr master = (my_master_ptr) cinfo->master; - - if (master->pub.is_dummy_pass) { -#ifdef QUANT_2PASS_SUPPORTED - /* Final pass of 2-pass quantization */ - master->pub.is_dummy_pass = FALSE; - (*cinfo->cquantize->start_pass) (cinfo, FALSE); - (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST); - (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif /* QUANT_2PASS_SUPPORTED */ - } else { - if (cinfo->quantize_colors && cinfo->colormap == NULL) { - /* Select new quantization method */ - if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) { - cinfo->cquantize = master->quantizer_2pass; - master->pub.is_dummy_pass = TRUE; - } else if (cinfo->enable_1pass_quant) { - cinfo->cquantize = master->quantizer_1pass; - } else { - ERREXIT(cinfo, JERR_MODE_CHANGE); - } - } - (*cinfo->idct->start_pass) (cinfo); - (*cinfo->coef->start_output_pass) (cinfo); - if (! cinfo->raw_data_out) { - if (! master->using_merged_upsample) - (*cinfo->cconvert->start_pass) (cinfo); - (*cinfo->upsample->start_pass) (cinfo); - if (cinfo->quantize_colors) - (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass); - (*cinfo->post->start_pass) (cinfo, - (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); - (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); - } - } - - /* Set up progress monitor's pass info if present */ - if (cinfo->progress != NULL) { - cinfo->progress->completed_passes = master->pass_number; - cinfo->progress->total_passes = master->pass_number + - (master->pub.is_dummy_pass ? 2 : 1); - /* In buffered-image mode, we assume one more output pass if EOI not - * yet reached, but no more passes if EOI has been reached. - */ - if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) { - cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1); - } - } -} - - -/* - * Finish up at end of an output pass. - */ - -METHODDEF(void) -finish_output_pass (j_decompress_ptr cinfo) -{ - my_master_ptr master = (my_master_ptr) cinfo->master; - - if (cinfo->quantize_colors) - (*cinfo->cquantize->finish_pass) (cinfo); - master->pass_number++; -} - - -#ifdef D_MULTISCAN_FILES_SUPPORTED - -/* - * Switch to a new external colormap between output passes. - */ - -GLOBAL(void) -jpeg_new_colormap (j_decompress_ptr cinfo) -{ - my_master_ptr master = (my_master_ptr) cinfo->master; - - /* Prevent application from calling me at wrong times */ - if (cinfo->global_state != DSTATE_BUFIMAGE) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - if (cinfo->quantize_colors && cinfo->enable_external_quant && - cinfo->colormap != NULL) { - /* Select 2-pass quantizer for external colormap use */ - cinfo->cquantize = master->quantizer_2pass; - /* Notify quantizer of colormap change */ - (*cinfo->cquantize->new_color_map) (cinfo); - master->pub.is_dummy_pass = FALSE; /* just in case */ - } else - ERREXIT(cinfo, JERR_MODE_CHANGE); -} - -#endif /* D_MULTISCAN_FILES_SUPPORTED */ - - -/* - * Initialize master decompression control and select active modules. - * This is performed at the start of jpeg_start_decompress. - */ - -GLOBAL(void) -jinit_master_decompress (j_decompress_ptr cinfo) -{ - my_master_ptr master; - - master = (my_master_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_decomp_master)); - cinfo->master = (struct jpeg_decomp_master *) master; - master->pub.prepare_for_output_pass = prepare_for_output_pass; - master->pub.finish_output_pass = finish_output_pass; - - master->pub.is_dummy_pass = FALSE; - - master_selection(cinfo); -} diff --git a/src/SFML/Graphics/libjpeg/jdmerge.c b/src/SFML/Graphics/libjpeg/jdmerge.c deleted file mode 100644 index 9e3a595d..00000000 --- a/src/SFML/Graphics/libjpeg/jdmerge.c +++ /dev/null @@ -1,400 +0,0 @@ -/* - * jdmerge.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains code for merged upsampling/color conversion. - * - * This file combines functions from jdsample.c and jdcolor.c; - * read those files first to understand what's going on. - * - * When the chroma components are to be upsampled by simple replication - * (ie, box filtering), we can save some work in color conversion by - * calculating all the output pixels corresponding to a pair of chroma - * samples at one time. In the conversion equations - * R = Y + K1 * Cr - * G = Y + K2 * Cb + K3 * Cr - * B = Y + K4 * Cb - * only the Y term varies among the group of pixels corresponding to a pair - * of chroma samples, so the rest of the terms can be calculated just once. - * At typical sampling ratios, this eliminates half or three-quarters of the - * multiplications needed for color conversion. - * - * This file currently provides implementations for the following cases: - * YCbCr => RGB color conversion only. - * Sampling ratios of 2h1v or 2h2v. - * No scaling needed at upsample time. - * Corner-aligned (non-CCIR601) sampling alignment. - * Other special cases could be added, but in most applications these are - * the only common cases. (For uncommon cases we fall back on the more - * general code in jdsample.c and jdcolor.c.) - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - -#ifdef UPSAMPLE_MERGING_SUPPORTED - - -/* Private subobject */ - -typedef struct { - struct jpeg_upsampler pub; /* public fields */ - - /* Pointer to routine to do actual upsampling/conversion of one row group */ - JMETHOD(void, upmethod, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, - JSAMPARRAY output_buf)); - - /* Private state for YCC->RGB conversion */ - int * Cr_r_tab; /* => table for Cr to R conversion */ - int * Cb_b_tab; /* => table for Cb to B conversion */ - INT32 * Cr_g_tab; /* => table for Cr to G conversion */ - INT32 * Cb_g_tab; /* => table for Cb to G conversion */ - - /* For 2:1 vertical sampling, we produce two output rows at a time. - * We need a "spare" row buffer to hold the second output row if the - * application provides just a one-row buffer; we also use the spare - * to discard the dummy last row if the image height is odd. - */ - JSAMPROW spare_row; - boolean spare_full; /* T if spare buffer is occupied */ - - JDIMENSION out_row_width; /* samples per output row */ - JDIMENSION rows_to_go; /* counts rows remaining in image */ -} my_upsampler; - -typedef my_upsampler * my_upsample_ptr; - -#define SCALEBITS 16 /* speediest right-shift on some machines */ -#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) -#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. - * This is taken directly from jdcolor.c; see that file for more info. - */ - -LOCAL(void) -build_ycc_rgb_table (j_decompress_ptr cinfo) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - int i; - INT32 x; - SHIFT_TEMPS - - upsample->Cr_r_tab = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(int)); - upsample->Cb_b_tab = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(int)); - upsample->Cr_g_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(INT32)); - upsample->Cb_g_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(INT32)); - - for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { - /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ - /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ - /* Cr=>R value is nearest int to 1.40200 * x */ - upsample->Cr_r_tab[i] = (int) - RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); - /* Cb=>B value is nearest int to 1.77200 * x */ - upsample->Cb_b_tab[i] = (int) - RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); - /* Cr=>G value is scaled-up -0.71414 * x */ - upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; - /* Cb=>G value is scaled-up -0.34414 * x */ - /* We also add in ONE_HALF so that need not do it in inner loop */ - upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; - } -} - - -/* - * Initialize for an upsampling pass. - */ - -METHODDEF(void) -start_pass_merged_upsample (j_decompress_ptr cinfo) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - - /* Mark the spare buffer empty */ - upsample->spare_full = FALSE; - /* Initialize total-height counter for detecting bottom of image */ - upsample->rows_to_go = cinfo->output_height; -} - - -/* - * Control routine to do upsampling (and color conversion). - * - * The control routine just handles the row buffering considerations. - */ - -METHODDEF(void) -merged_2v_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -/* 2:1 vertical sampling case: may need a spare row. */ -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - JSAMPROW work_ptrs[2]; - JDIMENSION num_rows; /* number of rows returned to caller */ - - if (upsample->spare_full) { - /* If we have a spare row saved from a previous cycle, just return it. */ - jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, - 1, upsample->out_row_width); - num_rows = 1; - upsample->spare_full = FALSE; - } else { - /* Figure number of rows to return to caller. */ - num_rows = 2; - /* Not more than the distance to the end of the image. */ - if (num_rows > upsample->rows_to_go) - num_rows = upsample->rows_to_go; - /* And not more than what the client can accept: */ - out_rows_avail -= *out_row_ctr; - if (num_rows > out_rows_avail) - num_rows = out_rows_avail; - /* Create output pointer array for upsampler. */ - work_ptrs[0] = output_buf[*out_row_ctr]; - if (num_rows > 1) { - work_ptrs[1] = output_buf[*out_row_ctr + 1]; - } else { - work_ptrs[1] = upsample->spare_row; - upsample->spare_full = TRUE; - } - /* Now do the upsampling. */ - (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs); - } - - /* Adjust counts */ - *out_row_ctr += num_rows; - upsample->rows_to_go -= num_rows; - /* When the buffer is emptied, declare this input row group consumed */ - if (! upsample->spare_full) - (*in_row_group_ctr)++; -} - - -METHODDEF(void) -merged_1v_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -/* 1:1 vertical sampling case: much easier, never need a spare row. */ -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - - /* Just do the upsampling. */ - (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, - output_buf + *out_row_ctr); - /* Adjust counts */ - (*out_row_ctr)++; - (*in_row_group_ctr)++; -} - - -/* - * These are the routines invoked by the control routines to do - * the actual upsampling/conversion. One row group is processed per call. - * - * Note: since we may be writing directly into application-supplied buffers, - * we have to be honest about the output width; we can't assume the buffer - * has been rounded up to an even width. - */ - - -/* - * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. - */ - -METHODDEF(void) -h2v1_merged_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, - JSAMPARRAY output_buf) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - register int y, cred, cgreen, cblue; - int cb, cr; - register JSAMPROW outptr; - JSAMPROW inptr0, inptr1, inptr2; - JDIMENSION col; - /* copy these pointers into registers if possible */ - register JSAMPLE * range_limit = cinfo->sample_range_limit; - int * Crrtab = upsample->Cr_r_tab; - int * Cbbtab = upsample->Cb_b_tab; - INT32 * Crgtab = upsample->Cr_g_tab; - INT32 * Cbgtab = upsample->Cb_g_tab; - SHIFT_TEMPS - - inptr0 = input_buf[0][in_row_group_ctr]; - inptr1 = input_buf[1][in_row_group_ctr]; - inptr2 = input_buf[2][in_row_group_ctr]; - outptr = output_buf[0]; - /* Loop for each pair of output pixels */ - for (col = cinfo->output_width >> 1; col > 0; col--) { - /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); - cred = Crrtab[cr]; - cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); - cblue = Cbbtab[cb]; - /* Fetch 2 Y values and emit 2 pixels */ - y = GETJSAMPLE(*inptr0++); - outptr[RGB_RED] = range_limit[y + cred]; - outptr[RGB_GREEN] = range_limit[y + cgreen]; - outptr[RGB_BLUE] = range_limit[y + cblue]; - outptr += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr0++); - outptr[RGB_RED] = range_limit[y + cred]; - outptr[RGB_GREEN] = range_limit[y + cgreen]; - outptr[RGB_BLUE] = range_limit[y + cblue]; - outptr += RGB_PIXELSIZE; - } - /* If image width is odd, do the last output column separately */ - if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); - cred = Crrtab[cr]; - cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); - cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr0); - outptr[RGB_RED] = range_limit[y + cred]; - outptr[RGB_GREEN] = range_limit[y + cgreen]; - outptr[RGB_BLUE] = range_limit[y + cblue]; - } -} - - -/* - * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. - */ - -METHODDEF(void) -h2v2_merged_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, - JSAMPARRAY output_buf) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - register int y, cred, cgreen, cblue; - int cb, cr; - register JSAMPROW outptr0, outptr1; - JSAMPROW inptr00, inptr01, inptr1, inptr2; - JDIMENSION col; - /* copy these pointers into registers if possible */ - register JSAMPLE * range_limit = cinfo->sample_range_limit; - int * Crrtab = upsample->Cr_r_tab; - int * Cbbtab = upsample->Cb_b_tab; - INT32 * Crgtab = upsample->Cr_g_tab; - INT32 * Cbgtab = upsample->Cb_g_tab; - SHIFT_TEMPS - - inptr00 = input_buf[0][in_row_group_ctr*2]; - inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; - inptr1 = input_buf[1][in_row_group_ctr]; - inptr2 = input_buf[2][in_row_group_ctr]; - outptr0 = output_buf[0]; - outptr1 = output_buf[1]; - /* Loop for each group of output pixels */ - for (col = cinfo->output_width >> 1; col > 0; col--) { - /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); - cred = Crrtab[cr]; - cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); - cblue = Cbbtab[cb]; - /* Fetch 4 Y values and emit 4 pixels */ - y = GETJSAMPLE(*inptr00++); - outptr0[RGB_RED] = range_limit[y + cred]; - outptr0[RGB_GREEN] = range_limit[y + cgreen]; - outptr0[RGB_BLUE] = range_limit[y + cblue]; - outptr0 += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr00++); - outptr0[RGB_RED] = range_limit[y + cred]; - outptr0[RGB_GREEN] = range_limit[y + cgreen]; - outptr0[RGB_BLUE] = range_limit[y + cblue]; - outptr0 += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr01++); - outptr1[RGB_RED] = range_limit[y + cred]; - outptr1[RGB_GREEN] = range_limit[y + cgreen]; - outptr1[RGB_BLUE] = range_limit[y + cblue]; - outptr1 += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr01++); - outptr1[RGB_RED] = range_limit[y + cred]; - outptr1[RGB_GREEN] = range_limit[y + cgreen]; - outptr1[RGB_BLUE] = range_limit[y + cblue]; - outptr1 += RGB_PIXELSIZE; - } - /* If image width is odd, do the last output column separately */ - if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); - cred = Crrtab[cr]; - cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); - cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr00); - outptr0[RGB_RED] = range_limit[y + cred]; - outptr0[RGB_GREEN] = range_limit[y + cgreen]; - outptr0[RGB_BLUE] = range_limit[y + cblue]; - y = GETJSAMPLE(*inptr01); - outptr1[RGB_RED] = range_limit[y + cred]; - outptr1[RGB_GREEN] = range_limit[y + cgreen]; - outptr1[RGB_BLUE] = range_limit[y + cblue]; - } -} - - -/* - * Module initialization routine for merged upsampling/color conversion. - * - * NB: this is called under the conditions determined by use_merged_upsample() - * in jdmaster.c. That routine MUST correspond to the actual capabilities - * of this module; no safety checks are made here. - */ - -GLOBAL(void) -jinit_merged_upsampler (j_decompress_ptr cinfo) -{ - my_upsample_ptr upsample; - - upsample = (my_upsample_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_upsampler)); - cinfo->upsample = (struct jpeg_upsampler *) upsample; - upsample->pub.start_pass = start_pass_merged_upsample; - upsample->pub.need_context_rows = FALSE; - - upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; - - if (cinfo->max_v_samp_factor == 2) { - upsample->pub.upsample = merged_2v_upsample; - upsample->upmethod = h2v2_merged_upsample; - /* Allocate a spare row buffer */ - upsample->spare_row = (JSAMPROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); - } else { - upsample->pub.upsample = merged_1v_upsample; - upsample->upmethod = h2v1_merged_upsample; - /* No spare row needed */ - upsample->spare_row = NULL; - } - - build_ycc_rgb_table(cinfo); -} - -#endif /* UPSAMPLE_MERGING_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jdphuff.c b/src/SFML/Graphics/libjpeg/jdphuff.c deleted file mode 100644 index 24047432..00000000 --- a/src/SFML/Graphics/libjpeg/jdphuff.c +++ /dev/null @@ -1,668 +0,0 @@ -/* - * jdphuff.c - * - * Copyright (C) 1995-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy decoding routines for progressive JPEG. - * - * Much of the complexity here has to do with supporting input suspension. - * If the data source module demands suspension, we want to be able to back - * up to the start of the current MCU. To do this, we copy state variables - * into local working storage, and update them back to the permanent - * storage only upon successful completion of an MCU. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdhuff.h" /* Declarations shared with jdhuff.c */ - - -#ifdef D_PROGRESSIVE_SUPPORTED - -/* - * Expanded entropy decoder object for progressive Huffman decoding. - * - * The savable_state subrecord contains fields that change within an MCU, - * but must not be updated permanently until we complete the MCU. - */ - -typedef struct { - unsigned int EOBRUN; /* remaining EOBs in EOBRUN */ - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ -} savable_state; - -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest,src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest,src) \ - ((dest).EOBRUN = (src).EOBRUN, \ - (dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - -typedef struct { - struct jpeg_entropy_decoder pub; /* public fields */ - - /* These fields are loaded into local variables at start of each MCU. - * In case of suspension, we exit WITHOUT updating them. - */ - bitread_perm_state bitstate; /* Bit buffer at start of MCU */ - savable_state saved; /* Other state at start of MCU */ - - /* These fields are NOT loaded into local working state. */ - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - - /* Pointers to derived tables (these workspaces have image lifespan) */ - d_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; - - d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */ -} phuff_entropy_decoder; - -typedef phuff_entropy_decoder * phuff_entropy_ptr; - -/* Forward declarations */ -METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); - - -/* - * Initialize for a Huffman-compressed scan. - */ - -METHODDEF(void) -start_pass_phuff_decoder (j_decompress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - boolean is_DC_band, bad; - int ci, coefi, tbl; - int *coef_bit_ptr; - jpeg_component_info * compptr; - - is_DC_band = (cinfo->Ss == 0); - - /* Validate scan parameters */ - bad = FALSE; - if (is_DC_band) { - if (cinfo->Se != 0) - bad = TRUE; - } else { - /* need not check Ss/Se < 0 since they came from unsigned bytes */ - if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2) - bad = TRUE; - /* AC scans may have only one component */ - if (cinfo->comps_in_scan != 1) - bad = TRUE; - } - if (cinfo->Ah != 0) { - /* Successive approximation refinement scan: must have Al = Ah-1. */ - if (cinfo->Al != cinfo->Ah-1) - bad = TRUE; - } - if (cinfo->Al > 13) /* need not check for < 0 */ - bad = TRUE; - /* Arguably the maximum Al value should be less than 13 for 8-bit precision, - * but the spec doesn't say so, and we try to be liberal about what we - * accept. Note: large Al values could result in out-of-range DC - * coefficients during early scans, leading to bizarre displays due to - * overflows in the IDCT math. But we won't crash. - */ - if (bad) - ERREXIT4(cinfo, JERR_BAD_PROGRESSION, - cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); - /* Update progression status, and verify that scan order is legal. - * Note that inter-scan inconsistencies are treated as warnings - * not fatal errors ... not clear if this is right way to behave. - */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - int cindex = cinfo->cur_comp_info[ci]->component_index; - coef_bit_ptr = & cinfo->coef_bits[cindex][0]; - if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ - WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); - for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { - int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; - if (cinfo->Ah != expected) - WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); - coef_bit_ptr[coefi] = cinfo->Al; - } - } - - /* Select MCU decoding routine */ - if (cinfo->Ah == 0) { - if (is_DC_band) - entropy->pub.decode_mcu = decode_mcu_DC_first; - else - entropy->pub.decode_mcu = decode_mcu_AC_first; - } else { - if (is_DC_band) - entropy->pub.decode_mcu = decode_mcu_DC_refine; - else - entropy->pub.decode_mcu = decode_mcu_AC_refine; - } - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Make sure requested tables are present, and compute derived tables. - * We may build same derived table more than once, but it's not expensive. - */ - if (is_DC_band) { - if (cinfo->Ah == 0) { /* DC refinement needs no table */ - tbl = compptr->dc_tbl_no; - jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, - & entropy->derived_tbls[tbl]); - } - } else { - tbl = compptr->ac_tbl_no; - jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, - & entropy->derived_tbls[tbl]); - /* remember the single active table */ - entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; - } - /* Initialize DC predictions to 0 */ - entropy->saved.last_dc_val[ci] = 0; - } - - /* Initialize bitread state variables */ - entropy->bitstate.bits_left = 0; - entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ - entropy->pub.insufficient_data = FALSE; - - /* Initialize private state variables */ - entropy->saved.EOBRUN = 0; - - /* Initialize restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; -} - - -/* - * Figure F.12: extend sign bit. - * On some machines, a shift and add will be faster than a table lookup. - */ - -#ifdef AVOID_TABLES - -#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) - -#else - -#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) - -static const int extend_test[16] = /* entry n is 2**(n-1) */ - { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; - -static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ - { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, - ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, - ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, - ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; - -#endif /* AVOID_TABLES */ - - -/* - * Check for a restart marker & resynchronize decoder. - * Returns FALSE if must suspend. - */ - -LOCAL(boolean) -process_restart (j_decompress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int ci; - - /* Throw away any unused bits remaining in bit buffer; */ - /* include any full bytes in next_marker's count of discarded bytes */ - cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; - entropy->bitstate.bits_left = 0; - - /* Advance past the RSTn marker */ - if (! (*cinfo->marker->read_restart_marker) (cinfo)) - return FALSE; - - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) - entropy->saved.last_dc_val[ci] = 0; - /* Re-init EOB run count, too */ - entropy->saved.EOBRUN = 0; - - /* Reset restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; - - /* Reset out-of-data flag, unless read_restart_marker left us smack up - * against a marker. In that case we will end up treating the next data - * segment as empty, and we can avoid producing bogus output pixels by - * leaving the flag set. - */ - if (cinfo->unread_marker == 0) - entropy->pub.insufficient_data = FALSE; - - return TRUE; -} - - -/* - * Huffman MCU decoding. - * Each of these routines decodes and returns one MCU's worth of - * Huffman-compressed coefficients. - * The coefficients are reordered from zigzag order into natural array order, - * but are not dequantized. - * - * The i'th block of the MCU is stored into the block pointed to by - * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. - * - * We return FALSE if data source requested suspension. In that case no - * changes have been made to permanent state. (Exception: some output - * coefficients may already have been assigned. This is harmless for - * spectral selection, since we'll just re-assign them on the next call. - * Successive approximation AC refinement has to be more careful, however.) - */ - -/* - * MCU decoding for DC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int Al = cinfo->Al; - register int s, r; - int blkn, ci; - JBLOCKROW block; - BITREAD_STATE_VARS; - savable_state state; - d_derived_tbl * tbl; - jpeg_component_info * compptr; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(state, entropy->saved); - - /* Outer loop handles each block in the MCU */ - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - tbl = entropy->derived_tbls[compptr->dc_tbl_no]; - - /* Decode a single block's worth of coefficients */ - - /* Section F.2.2.1: decode the DC coefficient difference */ - HUFF_DECODE(s, br_state, tbl, return FALSE, label1); - if (s) { - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - } - - /* Convert DC difference to actual value, update last_dc_val */ - s += state.last_dc_val[ci]; - state.last_dc_val[ci] = s; - /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ - (*block)[0] = (JCOEF) (s << Al); - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(entropy->saved, state); - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * MCU decoding for AC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int Se = cinfo->Se; - int Al = cinfo->Al; - register int s, k, r; - unsigned int EOBRUN; - JBLOCKROW block; - BITREAD_STATE_VARS; - d_derived_tbl * tbl; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state. - * We can avoid loading/saving bitread state if in an EOB run. - */ - EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ - - /* There is always only one block per MCU */ - - if (EOBRUN > 0) /* if it's a band of zeroes... */ - EOBRUN--; /* ...process it now (we do nothing) */ - else { - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - block = MCU_data[0]; - tbl = entropy->ac_derived_tbl; - - for (k = cinfo->Ss; k <= Se; k++) { - HUFF_DECODE(s, br_state, tbl, return FALSE, label2); - r = s >> 4; - s &= 15; - if (s) { - k += r; - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - /* Scale and output coefficient in natural (dezigzagged) order */ - (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al); - } else { - if (r == 15) { /* ZRL */ - k += 15; /* skip 15 zeroes in band */ - } else { /* EOBr, run length is 2^r + appended bits */ - EOBRUN = 1 << r; - if (r) { /* EOBr, r > 0 */ - CHECK_BIT_BUFFER(br_state, r, return FALSE); - r = GET_BITS(r); - EOBRUN += r; - } - EOBRUN--; /* this band is processed at this moment */ - break; /* force end-of-band */ - } - } - } - - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - } - - /* Completed MCU, so update state */ - entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * MCU decoding for DC successive approximation refinement scan. - * Note: we assume such scans can be multi-component, although the spec - * is not very clear on the point. - */ - -METHODDEF(boolean) -decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ - int blkn; - JBLOCKROW block; - BITREAD_STATE_VARS; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* Not worth the cycles to check insufficient_data here, - * since we will not change the data anyway if we read zeroes. - */ - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - - /* Outer loop handles each block in the MCU */ - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - - /* Encoded data is simply the next bit of the two's-complement DC value */ - CHECK_BIT_BUFFER(br_state, 1, return FALSE); - if (GET_BITS(1)) - (*block)[0] |= p1; - /* Note: since we use |=, repeating the assignment later is safe */ - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * MCU decoding for AC successive approximation refinement scan. - */ - -METHODDEF(boolean) -decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int Se = cinfo->Se; - int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ - int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ - register int s, k, r; - unsigned int EOBRUN; - JBLOCKROW block; - JCOEFPTR thiscoef; - BITREAD_STATE_VARS; - d_derived_tbl * tbl; - int num_newnz; - int newnz_pos[DCTSIZE2]; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* If we've run out of data, don't modify the MCU. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ - - /* There is always only one block per MCU */ - block = MCU_data[0]; - tbl = entropy->ac_derived_tbl; - - /* If we are forced to suspend, we must undo the assignments to any newly - * nonzero coefficients in the block, because otherwise we'd get confused - * next time about which coefficients were already nonzero. - * But we need not undo addition of bits to already-nonzero coefficients; - * instead, we can test the current bit to see if we already did it. - */ - num_newnz = 0; - - /* initialize coefficient loop counter to start of band */ - k = cinfo->Ss; - - if (EOBRUN == 0) { - for (; k <= Se; k++) { - HUFF_DECODE(s, br_state, tbl, goto undoit, label3); - r = s >> 4; - s &= 15; - if (s) { - if (s != 1) /* size of new coef should always be 1 */ - WARNMS(cinfo, JWRN_HUFF_BAD_CODE); - CHECK_BIT_BUFFER(br_state, 1, goto undoit); - if (GET_BITS(1)) - s = p1; /* newly nonzero coef is positive */ - else - s = m1; /* newly nonzero coef is negative */ - } else { - if (r != 15) { - EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ - if (r) { - CHECK_BIT_BUFFER(br_state, r, goto undoit); - r = GET_BITS(r); - EOBRUN += r; - } - break; /* rest of block is handled by EOB logic */ - } - /* note s = 0 for processing ZRL */ - } - /* Advance over already-nonzero coefs and r still-zero coefs, - * appending correction bits to the nonzeroes. A correction bit is 1 - * if the absolute value of the coefficient must be increased. - */ - do { - thiscoef = *block + jpeg_natural_order[k]; - if (*thiscoef != 0) { - CHECK_BIT_BUFFER(br_state, 1, goto undoit); - if (GET_BITS(1)) { - if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ - if (*thiscoef >= 0) - *thiscoef += p1; - else - *thiscoef += m1; - } - } - } else { - if (--r < 0) - break; /* reached target zero coefficient */ - } - k++; - } while (k <= Se); - if (s) { - int pos = jpeg_natural_order[k]; - /* Output newly nonzero coefficient */ - (*block)[pos] = (JCOEF) s; - /* Remember its position in case we have to suspend */ - newnz_pos[num_newnz++] = pos; - } - } - } - - if (EOBRUN > 0) { - /* Scan any remaining coefficient positions after the end-of-band - * (the last newly nonzero coefficient, if any). Append a correction - * bit to each already-nonzero coefficient. A correction bit is 1 - * if the absolute value of the coefficient must be increased. - */ - for (; k <= Se; k++) { - thiscoef = *block + jpeg_natural_order[k]; - if (*thiscoef != 0) { - CHECK_BIT_BUFFER(br_state, 1, goto undoit); - if (GET_BITS(1)) { - if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ - if (*thiscoef >= 0) - *thiscoef += p1; - else - *thiscoef += m1; - } - } - } - } - /* Count one block completed in EOB run */ - EOBRUN--; - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; - -undoit: - /* Re-zero any output coefficients that we made newly nonzero */ - while (num_newnz > 0) - (*block)[newnz_pos[--num_newnz]] = 0; - - return FALSE; -} - - -/* - * Module initialization routine for progressive Huffman entropy decoding. - */ - -GLOBAL(void) -jinit_phuff_decoder (j_decompress_ptr cinfo) -{ - phuff_entropy_ptr entropy; - int *coef_bit_ptr; - int ci, i; - - entropy = (phuff_entropy_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(phuff_entropy_decoder)); - cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; - entropy->pub.start_pass = start_pass_phuff_decoder; - - /* Mark derived tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->derived_tbls[i] = NULL; - } - - /* Create progression status table */ - cinfo->coef_bits = (int (*)[DCTSIZE2]) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components*DCTSIZE2*SIZEOF(int)); - coef_bit_ptr = & cinfo->coef_bits[0][0]; - for (ci = 0; ci < cinfo->num_components; ci++) - for (i = 0; i < DCTSIZE2; i++) - *coef_bit_ptr++ = -1; -} - -#endif /* D_PROGRESSIVE_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jdpostct.c b/src/SFML/Graphics/libjpeg/jdpostct.c deleted file mode 100644 index 7ba9eed5..00000000 --- a/src/SFML/Graphics/libjpeg/jdpostct.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - * jdpostct.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the decompression postprocessing controller. - * This controller manages the upsampling, color conversion, and color - * quantization/reduction steps; specifically, it controls the buffering - * between upsample/color conversion and color quantization/reduction. - * - * If no color quantization/reduction is required, then this module has no - * work to do, and it just hands off to the upsample/color conversion code. - * An integrated upsample/convert/quantize process would replace this module - * entirely. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_d_post_controller pub; /* public fields */ - - /* Color quantization source buffer: this holds output data from - * the upsample/color conversion step to be passed to the quantizer. - * For two-pass color quantization, we need a full-image buffer; - * for one-pass operation, a strip buffer is sufficient. - */ - jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */ - JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */ - JDIMENSION strip_height; /* buffer size in rows */ - /* for two-pass mode only: */ - JDIMENSION starting_row; /* row # of first row in current strip */ - JDIMENSION next_row; /* index of next row to fill/empty in strip */ -} my_post_controller; - -typedef my_post_controller * my_post_ptr; - - -/* Forward declarations */ -METHODDEF(void) post_process_1pass - JPP((j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -#ifdef QUANT_2PASS_SUPPORTED -METHODDEF(void) post_process_prepass - JPP((j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -METHODDEF(void) post_process_2pass - JPP((j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -#endif - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_post_ptr post = (my_post_ptr) cinfo->post; - - switch (pass_mode) { - case JBUF_PASS_THRU: - if (cinfo->quantize_colors) { - /* Single-pass processing with color quantization. */ - post->pub.post_process_data = post_process_1pass; - /* We could be doing buffered-image output before starting a 2-pass - * color quantization; in that case, jinit_d_post_controller did not - * allocate a strip buffer. Use the virtual-array buffer as workspace. - */ - if (post->buffer == NULL) { - post->buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, post->whole_image, - (JDIMENSION) 0, post->strip_height, TRUE); - } - } else { - /* For single-pass processing without color quantization, - * I have no work to do; just call the upsampler directly. - */ - post->pub.post_process_data = cinfo->upsample->upsample; - } - break; -#ifdef QUANT_2PASS_SUPPORTED - case JBUF_SAVE_AND_PASS: - /* First pass of 2-pass quantization */ - if (post->whole_image == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - post->pub.post_process_data = post_process_prepass; - break; - case JBUF_CRANK_DEST: - /* Second pass of 2-pass quantization */ - if (post->whole_image == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - post->pub.post_process_data = post_process_2pass; - break; -#endif /* QUANT_2PASS_SUPPORTED */ - default: - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; - } - post->starting_row = post->next_row = 0; -} - - -/* - * Process some data in the one-pass (strip buffer) case. - * This is used for color precision reduction as well as one-pass quantization. - */ - -METHODDEF(void) -post_process_1pass (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_post_ptr post = (my_post_ptr) cinfo->post; - JDIMENSION num_rows, max_rows; - - /* Fill the buffer, but not more than what we can dump out in one go. */ - /* Note we rely on the upsampler to detect bottom of image. */ - max_rows = out_rows_avail - *out_row_ctr; - if (max_rows > post->strip_height) - max_rows = post->strip_height; - num_rows = 0; - (*cinfo->upsample->upsample) (cinfo, - input_buf, in_row_group_ctr, in_row_groups_avail, - post->buffer, &num_rows, max_rows); - /* Quantize and emit data. */ - (*cinfo->cquantize->color_quantize) (cinfo, - post->buffer, output_buf + *out_row_ctr, (int) num_rows); - *out_row_ctr += num_rows; -} - - -#ifdef QUANT_2PASS_SUPPORTED - -/* - * Process some data in the first pass of 2-pass quantization. - */ - -METHODDEF(void) -post_process_prepass (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_post_ptr post = (my_post_ptr) cinfo->post; - JDIMENSION old_next_row, num_rows; - - /* Reposition virtual buffer if at start of strip. */ - if (post->next_row == 0) { - post->buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, post->whole_image, - post->starting_row, post->strip_height, TRUE); - } - - /* Upsample some data (up to a strip height's worth). */ - old_next_row = post->next_row; - (*cinfo->upsample->upsample) (cinfo, - input_buf, in_row_group_ctr, in_row_groups_avail, - post->buffer, &post->next_row, post->strip_height); - - /* Allow quantizer to scan new data. No data is emitted, */ - /* but we advance out_row_ctr so outer loop can tell when we're done. */ - if (post->next_row > old_next_row) { - num_rows = post->next_row - old_next_row; - (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row, - (JSAMPARRAY) NULL, (int) num_rows); - *out_row_ctr += num_rows; - } - - /* Advance if we filled the strip. */ - if (post->next_row >= post->strip_height) { - post->starting_row += post->strip_height; - post->next_row = 0; - } -} - - -/* - * Process some data in the second pass of 2-pass quantization. - */ - -METHODDEF(void) -post_process_2pass (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_post_ptr post = (my_post_ptr) cinfo->post; - JDIMENSION num_rows, max_rows; - - /* Reposition virtual buffer if at start of strip. */ - if (post->next_row == 0) { - post->buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, post->whole_image, - post->starting_row, post->strip_height, FALSE); - } - - /* Determine number of rows to emit. */ - num_rows = post->strip_height - post->next_row; /* available in strip */ - max_rows = out_rows_avail - *out_row_ctr; /* available in output area */ - if (num_rows > max_rows) - num_rows = max_rows; - /* We have to check bottom of image here, can't depend on upsampler. */ - max_rows = cinfo->output_height - post->starting_row; - if (num_rows > max_rows) - num_rows = max_rows; - - /* Quantize and emit data. */ - (*cinfo->cquantize->color_quantize) (cinfo, - post->buffer + post->next_row, output_buf + *out_row_ctr, - (int) num_rows); - *out_row_ctr += num_rows; - - /* Advance if we filled the strip. */ - post->next_row += num_rows; - if (post->next_row >= post->strip_height) { - post->starting_row += post->strip_height; - post->next_row = 0; - } -} - -#endif /* QUANT_2PASS_SUPPORTED */ - - -/* - * Initialize postprocessing controller. - */ - -GLOBAL(void) -jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer) -{ - my_post_ptr post; - - post = (my_post_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_post_controller)); - cinfo->post = (struct jpeg_d_post_controller *) post; - post->pub.start_pass = start_pass_dpost; - post->whole_image = NULL; /* flag for no virtual arrays */ - post->buffer = NULL; /* flag for no strip buffer */ - - /* Create the quantization buffer, if needed */ - if (cinfo->quantize_colors) { - /* The buffer strip height is max_v_samp_factor, which is typically - * an efficient number of rows for upsampling to return. - * (In the presence of output rescaling, we might want to be smarter?) - */ - post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor; - if (need_full_buffer) { - /* Two-pass color quantization: need full-image storage. */ - /* We round up the number of rows to a multiple of the strip height. */ -#ifdef QUANT_2PASS_SUPPORTED - post->whole_image = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - cinfo->output_width * cinfo->out_color_components, - (JDIMENSION) jround_up((long) cinfo->output_height, - (long) post->strip_height), - post->strip_height); -#else - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); -#endif /* QUANT_2PASS_SUPPORTED */ - } else { - /* One-pass color quantization: just make a strip buffer. */ - post->buffer = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->output_width * cinfo->out_color_components, - post->strip_height); - } - } -} diff --git a/src/SFML/Graphics/libjpeg/jdsample.c b/src/SFML/Graphics/libjpeg/jdsample.c deleted file mode 100644 index e0d9040a..00000000 --- a/src/SFML/Graphics/libjpeg/jdsample.c +++ /dev/null @@ -1,478 +0,0 @@ -/* - * jdsample.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains upsampling routines. - * - * Upsampling input data is counted in "row groups". A row group - * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) - * sample rows of each component. Upsampling will normally produce - * max_v_samp_factor pixel rows from each row group (but this could vary - * if the upsampler is applying a scale factor of its own). - * - * An excellent reference for image resampling is - * Digital Image Warping, George Wolberg, 1990. - * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Pointer to routine to upsample a single component */ -typedef JMETHOD(void, upsample1_ptr, - (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); - -/* Private subobject */ - -typedef struct { - struct jpeg_upsampler pub; /* public fields */ - - /* Color conversion buffer. When using separate upsampling and color - * conversion steps, this buffer holds one upsampled row group until it - * has been color converted and output. - * Note: we do not allocate any storage for component(s) which are full-size, - * ie do not need rescaling. The corresponding entry of color_buf[] is - * simply set to point to the input data array, thereby avoiding copying. - */ - JSAMPARRAY color_buf[MAX_COMPONENTS]; - - /* Per-component upsampling method pointers */ - upsample1_ptr methods[MAX_COMPONENTS]; - - int next_row_out; /* counts rows emitted from color_buf */ - JDIMENSION rows_to_go; /* counts rows remaining in image */ - - /* Height of an input row group for each component. */ - int rowgroup_height[MAX_COMPONENTS]; - - /* These arrays save pixel expansion factors so that int_expand need not - * recompute them each time. They are unused for other upsampling methods. - */ - UINT8 h_expand[MAX_COMPONENTS]; - UINT8 v_expand[MAX_COMPONENTS]; -} my_upsampler; - -typedef my_upsampler * my_upsample_ptr; - - -/* - * Initialize for an upsampling pass. - */ - -METHODDEF(void) -start_pass_upsample (j_decompress_ptr cinfo) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - - /* Mark the conversion buffer empty */ - upsample->next_row_out = cinfo->max_v_samp_factor; - /* Initialize total-height counter for detecting bottom of image */ - upsample->rows_to_go = cinfo->output_height; -} - - -/* - * Control routine to do upsampling (and color conversion). - * - * In this version we upsample each component independently. - * We upsample one row group into the conversion buffer, then apply - * color conversion a row at a time. - */ - -METHODDEF(void) -sep_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - int ci; - jpeg_component_info * compptr; - JDIMENSION num_rows; - - /* Fill the conversion buffer, if it's empty */ - if (upsample->next_row_out >= cinfo->max_v_samp_factor) { - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Invoke per-component upsample method. Notice we pass a POINTER - * to color_buf[ci], so that fullsize_upsample can change it. - */ - (*upsample->methods[ci]) (cinfo, compptr, - input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]), - upsample->color_buf + ci); - } - upsample->next_row_out = 0; - } - - /* Color-convert and emit rows */ - - /* How many we have in the buffer: */ - num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out); - /* Not more than the distance to the end of the image. Need this test - * in case the image height is not a multiple of max_v_samp_factor: - */ - if (num_rows > upsample->rows_to_go) - num_rows = upsample->rows_to_go; - /* And not more than what the client can accept: */ - out_rows_avail -= *out_row_ctr; - if (num_rows > out_rows_avail) - num_rows = out_rows_avail; - - (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf, - (JDIMENSION) upsample->next_row_out, - output_buf + *out_row_ctr, - (int) num_rows); - - /* Adjust counts */ - *out_row_ctr += num_rows; - upsample->rows_to_go -= num_rows; - upsample->next_row_out += num_rows; - /* When the buffer is emptied, declare this input row group consumed */ - if (upsample->next_row_out >= cinfo->max_v_samp_factor) - (*in_row_group_ctr)++; -} - - -/* - * These are the routines invoked by sep_upsample to upsample pixel values - * of a single component. One row group is processed per call. - */ - - -/* - * For full-size components, we just make color_buf[ci] point at the - * input buffer, and thus avoid copying any data. Note that this is - * safe only because sep_upsample doesn't declare the input row group - * "consumed" until we are done color converting and emitting it. - */ - -METHODDEF(void) -fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - *output_data_ptr = input_data; -} - - -/* - * This is a no-op version used for "uninteresting" components. - * These components will not be referenced by color conversion. - */ - -METHODDEF(void) -noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - *output_data_ptr = NULL; /* safety check */ -} - - -/* - * This version handles any integral sampling ratios. - * This is not used for typical JPEG files, so it need not be fast. - * Nor, for that matter, is it particularly accurate: the algorithm is - * simple replication of the input pixel onto the corresponding output - * pixels. The hi-falutin sampling literature refers to this as a - * "box filter". A box filter tends to introduce visible artifacts, - * so if you are actually going to use 3:1 or 4:1 sampling ratios - * you would be well advised to improve this code. - */ - -METHODDEF(void) -int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - JSAMPARRAY output_data = *output_data_ptr; - register JSAMPROW inptr, outptr; - register JSAMPLE invalue; - register int h; - JSAMPROW outend; - int h_expand, v_expand; - int inrow, outrow; - - h_expand = upsample->h_expand[compptr->component_index]; - v_expand = upsample->v_expand[compptr->component_index]; - - inrow = outrow = 0; - while (outrow < cinfo->max_v_samp_factor) { - /* Generate one output row with proper horizontal expansion */ - inptr = input_data[inrow]; - outptr = output_data[outrow]; - outend = outptr + cinfo->output_width; - while (outptr < outend) { - invalue = *inptr++; /* don't need GETJSAMPLE() here */ - for (h = h_expand; h > 0; h--) { - *outptr++ = invalue; - } - } - /* Generate any additional output rows by duplicating the first one */ - if (v_expand > 1) { - jcopy_sample_rows(output_data, outrow, output_data, outrow+1, - v_expand-1, cinfo->output_width); - } - inrow++; - outrow += v_expand; - } -} - - -/* - * Fast processing for the common case of 2:1 horizontal and 1:1 vertical. - * It's still a box filter. - */ - -METHODDEF(void) -h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - register JSAMPROW inptr, outptr; - register JSAMPLE invalue; - JSAMPROW outend; - int inrow; - - for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { - inptr = input_data[inrow]; - outptr = output_data[inrow]; - outend = outptr + cinfo->output_width; - while (outptr < outend) { - invalue = *inptr++; /* don't need GETJSAMPLE() here */ - *outptr++ = invalue; - *outptr++ = invalue; - } - } -} - - -/* - * Fast processing for the common case of 2:1 horizontal and 2:1 vertical. - * It's still a box filter. - */ - -METHODDEF(void) -h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - register JSAMPROW inptr, outptr; - register JSAMPLE invalue; - JSAMPROW outend; - int inrow, outrow; - - inrow = outrow = 0; - while (outrow < cinfo->max_v_samp_factor) { - inptr = input_data[inrow]; - outptr = output_data[outrow]; - outend = outptr + cinfo->output_width; - while (outptr < outend) { - invalue = *inptr++; /* don't need GETJSAMPLE() here */ - *outptr++ = invalue; - *outptr++ = invalue; - } - jcopy_sample_rows(output_data, outrow, output_data, outrow+1, - 1, cinfo->output_width); - inrow++; - outrow += 2; - } -} - - -/* - * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical. - * - * The upsampling algorithm is linear interpolation between pixel centers, - * also known as a "triangle filter". This is a good compromise between - * speed and visual quality. The centers of the output pixels are 1/4 and 3/4 - * of the way between input pixel centers. - * - * A note about the "bias" calculations: when rounding fractional values to - * integer, we do not want to always round 0.5 up to the next integer. - * If we did that, we'd introduce a noticeable bias towards larger values. - * Instead, this code is arranged so that 0.5 will be rounded up or down at - * alternate pixel locations (a simple ordered dither pattern). - */ - -METHODDEF(void) -h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - register JSAMPROW inptr, outptr; - register int invalue; - register JDIMENSION colctr; - int inrow; - - for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { - inptr = input_data[inrow]; - outptr = output_data[inrow]; - /* Special case for first column */ - invalue = GETJSAMPLE(*inptr++); - *outptr++ = (JSAMPLE) invalue; - *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2); - - for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { - /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ - invalue = GETJSAMPLE(*inptr++) * 3; - *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2); - *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2); - } - - /* Special case for last column */ - invalue = GETJSAMPLE(*inptr); - *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2); - *outptr++ = (JSAMPLE) invalue; - } -} - - -/* - * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical. - * Again a triangle filter; see comments for h2v1 case, above. - * - * It is OK for us to reference the adjacent input rows because we demanded - * context from the main buffer controller (see initialization code). - */ - -METHODDEF(void) -h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - register JSAMPROW inptr0, inptr1, outptr; -#if BITS_IN_JSAMPLE == 8 - register int thiscolsum, lastcolsum, nextcolsum; -#else - register INT32 thiscolsum, lastcolsum, nextcolsum; -#endif - register JDIMENSION colctr; - int inrow, outrow, v; - - inrow = outrow = 0; - while (outrow < cinfo->max_v_samp_factor) { - for (v = 0; v < 2; v++) { - /* inptr0 points to nearest input row, inptr1 points to next nearest */ - inptr0 = input_data[inrow]; - if (v == 0) /* next nearest is row above */ - inptr1 = input_data[inrow-1]; - else /* next nearest is row below */ - inptr1 = input_data[inrow+1]; - outptr = output_data[outrow++]; - - /* Special case for first column */ - thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4); - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); - lastcolsum = thiscolsum; thiscolsum = nextcolsum; - - for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { - /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */ - /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */ - nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); - lastcolsum = thiscolsum; thiscolsum = nextcolsum; - } - - /* Special case for last column */ - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); - *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4); - } - inrow++; - } -} - - -/* - * Module initialization routine for upsampling. - */ - -GLOBAL(void) -jinit_upsampler (j_decompress_ptr cinfo) -{ - my_upsample_ptr upsample; - int ci; - jpeg_component_info * compptr; - boolean need_buffer, do_fancy; - int h_in_group, v_in_group, h_out_group, v_out_group; - - upsample = (my_upsample_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_upsampler)); - cinfo->upsample = (struct jpeg_upsampler *) upsample; - upsample->pub.start_pass = start_pass_upsample; - upsample->pub.upsample = sep_upsample; - upsample->pub.need_context_rows = FALSE; /* until we find out differently */ - - if (cinfo->CCIR601_sampling) /* this isn't supported */ - ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); - - /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1, - * so don't ask for it. - */ - do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1; - - /* Verify we can handle the sampling factors, select per-component methods, - * and create storage as needed. - */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Compute size of an "input group" after IDCT scaling. This many samples - * are to be converted to max_h_samp_factor * max_v_samp_factor pixels. - */ - h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; - v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; - h_out_group = cinfo->max_h_samp_factor; - v_out_group = cinfo->max_v_samp_factor; - upsample->rowgroup_height[ci] = v_in_group; /* save for use later */ - need_buffer = TRUE; - if (! compptr->component_needed) { - /* Don't bother to upsample an uninteresting component. */ - upsample->methods[ci] = noop_upsample; - need_buffer = FALSE; - } else if (h_in_group == h_out_group && v_in_group == v_out_group) { - /* Fullsize components can be processed without any work. */ - upsample->methods[ci] = fullsize_upsample; - need_buffer = FALSE; - } else if (h_in_group * 2 == h_out_group && - v_in_group == v_out_group) { - /* Special cases for 2h1v upsampling */ - if (do_fancy && compptr->downsampled_width > 2) - upsample->methods[ci] = h2v1_fancy_upsample; - else - upsample->methods[ci] = h2v1_upsample; - } else if (h_in_group * 2 == h_out_group && - v_in_group * 2 == v_out_group) { - /* Special cases for 2h2v upsampling */ - if (do_fancy && compptr->downsampled_width > 2) { - upsample->methods[ci] = h2v2_fancy_upsample; - upsample->pub.need_context_rows = TRUE; - } else - upsample->methods[ci] = h2v2_upsample; - } else if ((h_out_group % h_in_group) == 0 && - (v_out_group % v_in_group) == 0) { - /* Generic integral-factors upsampling method */ - upsample->methods[ci] = int_upsample; - upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group); - upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group); - } else - ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); - if (need_buffer) { - upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) jround_up((long) cinfo->output_width, - (long) cinfo->max_h_samp_factor), - (JDIMENSION) cinfo->max_v_samp_factor); - } - } -} diff --git a/src/SFML/Graphics/libjpeg/jdtrans.c b/src/SFML/Graphics/libjpeg/jdtrans.c deleted file mode 100644 index 12c193c8..00000000 --- a/src/SFML/Graphics/libjpeg/jdtrans.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * jdtrans.c - * - * Copyright (C) 1995-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains library routines for transcoding decompression, - * that is, reading raw DCT coefficient arrays from an input JPEG file. - * The routines in jdapimin.c will also be needed by a transcoder. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Forward declarations */ -LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo)); - - -/* - * Read the coefficient arrays from a JPEG file. - * jpeg_read_header must be completed before calling this. - * - * The entire image is read into a set of virtual coefficient-block arrays, - * one per component. The return value is a pointer to the array of - * virtual-array descriptors. These can be manipulated directly via the - * JPEG memory manager, or handed off to jpeg_write_coefficients(). - * To release the memory occupied by the virtual arrays, call - * jpeg_finish_decompress() when done with the data. - * - * An alternative usage is to simply obtain access to the coefficient arrays - * during a buffered-image-mode decompression operation. This is allowed - * after any jpeg_finish_output() call. The arrays can be accessed until - * jpeg_finish_decompress() is called. (Note that any call to the library - * may reposition the arrays, so don't rely on access_virt_barray() results - * to stay valid across library calls.) - * - * Returns NULL if suspended. This case need be checked only if - * a suspending data source is used. - */ - -GLOBAL(jvirt_barray_ptr *) -jpeg_read_coefficients (j_decompress_ptr cinfo) -{ - if (cinfo->global_state == DSTATE_READY) { - /* First call: initialize active modules */ - transdecode_master_selection(cinfo); - cinfo->global_state = DSTATE_RDCOEFS; - } - if (cinfo->global_state == DSTATE_RDCOEFS) { - /* Absorb whole file into the coef buffer */ - for (;;) { - int retcode; - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - /* Absorb some more input */ - retcode = (*cinfo->inputctl->consume_input) (cinfo); - if (retcode == JPEG_SUSPENDED) - return NULL; - if (retcode == JPEG_REACHED_EOI) - break; - /* Advance progress counter if appropriate */ - if (cinfo->progress != NULL && - (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { - if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { - /* startup underestimated number of scans; ratchet up one scan */ - cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; - } - } - } - /* Set state so that jpeg_finish_decompress does the right thing */ - cinfo->global_state = DSTATE_STOPPING; - } - /* At this point we should be in state DSTATE_STOPPING if being used - * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access - * to the coefficients during a full buffered-image-mode decompression. - */ - if ((cinfo->global_state == DSTATE_STOPPING || - cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) { - return cinfo->coef->coef_arrays; - } - /* Oops, improper usage */ - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - return NULL; /* keep compiler happy */ -} - - -/* - * Master selection of decompression modules for transcoding. - * This substitutes for jdmaster.c's initialization of the full decompressor. - */ - -LOCAL(void) -transdecode_master_selection (j_decompress_ptr cinfo) -{ - /* This is effectively a buffered-image operation. */ - cinfo->buffered_image = TRUE; - - /* Entropy decoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef D_PROGRESSIVE_SUPPORTED - jinit_phuff_decoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_decoder(cinfo); - } - - /* Always get a full-image coefficient buffer. */ - jinit_d_coef_controller(cinfo, TRUE); - - /* We can now tell the memory manager to allocate virtual arrays. */ - (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); - - /* Initialize input side of decompressor to consume first scan. */ - (*cinfo->inputctl->start_input_pass) (cinfo); - - /* Initialize progress monitoring. */ - if (cinfo->progress != NULL) { - int nscans; - /* Estimate number of scans to set pass_limit. */ - if (cinfo->progressive_mode) { - /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ - nscans = 2 + 3 * cinfo->num_components; - } else if (cinfo->inputctl->has_multiple_scans) { - /* For a nonprogressive multiscan file, estimate 1 scan per component. */ - nscans = cinfo->num_components; - } else { - nscans = 1; - } - cinfo->progress->pass_counter = 0L; - cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; - cinfo->progress->completed_passes = 0; - cinfo->progress->total_passes = 1; - } -} diff --git a/src/SFML/Graphics/libjpeg/jerror.c b/src/SFML/Graphics/libjpeg/jerror.c deleted file mode 100644 index c98aed76..00000000 --- a/src/SFML/Graphics/libjpeg/jerror.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * jerror.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains simple error-reporting and trace-message routines. - * These are suitable for Unix-like systems and others where writing to - * stderr is the right thing to do. Many applications will want to replace - * some or all of these routines. - * - * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile, - * you get a Windows-specific hack to display error messages in a dialog box. - * It ain't much, but it beats dropping error messages into the bit bucket, - * which is what happens to output to stderr under most Windows C compilers. - * - * These routines are used by both the compression and decompression code. - */ - -/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ -#include "jinclude.h" -#include "jpeglib.h" -#include "jversion.h" -#include "jerror.h" - -#ifdef USE_WINDOWS_MESSAGEBOX -#include -#endif - -#ifndef EXIT_FAILURE /* define exit() codes if not provided */ -#define EXIT_FAILURE 1 -#endif - - -/* - * Create the message string table. - * We do this from the master message list in jerror.h by re-reading - * jerror.h with a suitable definition for macro JMESSAGE. - * The message table is made an external symbol just in case any applications - * want to refer to it directly. - */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_std_message_table jMsgTable -#endif - -#define JMESSAGE(code,string) string , - -const char * const jpeg_std_message_table[] = { -#include "jerror.h" - NULL -}; - - -/* - * Error exit handler: must not return to caller. - * - * Applications may override this if they want to get control back after - * an error. Typically one would longjmp somewhere instead of exiting. - * The setjmp buffer can be made a private field within an expanded error - * handler object. Note that the info needed to generate an error message - * is stored in the error object, so you can generate the message now or - * later, at your convenience. - * You should make sure that the JPEG object is cleaned up (with jpeg_abort - * or jpeg_destroy) at some point. - */ - -METHODDEF(void) -error_exit (j_common_ptr cinfo) -{ - /* Always display the message */ - (*cinfo->err->output_message) (cinfo); - - /* Let the memory manager delete any temp files before we die */ - jpeg_destroy(cinfo); - - exit(EXIT_FAILURE); -} - - -/* - * Actual output of an error or trace message. - * Applications may override this method to send JPEG messages somewhere - * other than stderr. - * - * On Windows, printing to stderr is generally completely useless, - * so we provide optional code to produce an error-dialog popup. - * Most Windows applications will still prefer to override this routine, - * but if they don't, it'll do something at least marginally useful. - * - * NOTE: to use the library in an environment that doesn't support the - * C stdio library, you may have to delete the call to fprintf() entirely, - * not just not use this routine. - */ - -METHODDEF(void) -output_message (j_common_ptr cinfo) -{ - char buffer[JMSG_LENGTH_MAX]; - - /* Create the message */ - (*cinfo->err->format_message) (cinfo, buffer); - -#ifdef USE_WINDOWS_MESSAGEBOX - /* Display it in a message dialog box */ - MessageBox(GetActiveWindow(), buffer, "JPEG Library Error", - MB_OK | MB_ICONERROR); -#else - /* Send it to stderr, adding a newline */ - fprintf(stderr, "%s\n", buffer); -#endif -} - - -/* - * Decide whether to emit a trace or warning message. - * msg_level is one of: - * -1: recoverable corrupt-data warning, may want to abort. - * 0: important advisory messages (always display to user). - * 1: first level of tracing detail. - * 2,3,...: successively more detailed tracing messages. - * An application might override this method if it wanted to abort on warnings - * or change the policy about which messages to display. - */ - -METHODDEF(void) -emit_message (j_common_ptr cinfo, int msg_level) -{ - struct jpeg_error_mgr * err = cinfo->err; - - if (msg_level < 0) { - /* It's a warning message. Since corrupt files may generate many warnings, - * the policy implemented here is to show only the first warning, - * unless trace_level >= 3. - */ - if (err->num_warnings == 0 || err->trace_level >= 3) - (*err->output_message) (cinfo); - /* Always count warnings in num_warnings. */ - err->num_warnings++; - } else { - /* It's a trace message. Show it if trace_level >= msg_level. */ - if (err->trace_level >= msg_level) - (*err->output_message) (cinfo); - } -} - - -/* - * Format a message string for the most recent JPEG error or message. - * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX - * characters. Note that no '\n' character is added to the string. - * Few applications should need to override this method. - */ - -METHODDEF(void) -format_message (j_common_ptr cinfo, char * buffer) -{ - struct jpeg_error_mgr * err = cinfo->err; - int msg_code = err->msg_code; - const char * msgtext = NULL; - const char * msgptr; - char ch; - boolean isstring; - - /* Look up message string in proper table */ - if (msg_code > 0 && msg_code <= err->last_jpeg_message) { - msgtext = err->jpeg_message_table[msg_code]; - } else if (err->addon_message_table != NULL && - msg_code >= err->first_addon_message && - msg_code <= err->last_addon_message) { - msgtext = err->addon_message_table[msg_code - err->first_addon_message]; - } - - /* Defend against bogus message number */ - if (msgtext == NULL) { - err->msg_parm.i[0] = msg_code; - msgtext = err->jpeg_message_table[0]; - } - - /* Check for string parameter, as indicated by %s in the message text */ - isstring = FALSE; - msgptr = msgtext; - while ((ch = *msgptr++) != '\0') { - if (ch == '%') { - if (*msgptr == 's') isstring = TRUE; - break; - } - } - - /* Format the message into the passed buffer */ - if (isstring) - sprintf(buffer, msgtext, err->msg_parm.s); - else - sprintf(buffer, msgtext, - err->msg_parm.i[0], err->msg_parm.i[1], - err->msg_parm.i[2], err->msg_parm.i[3], - err->msg_parm.i[4], err->msg_parm.i[5], - err->msg_parm.i[6], err->msg_parm.i[7]); -} - - -/* - * Reset error state variables at start of a new image. - * This is called during compression startup to reset trace/error - * processing to default state, without losing any application-specific - * method pointers. An application might possibly want to override - * this method if it has additional error processing state. - */ - -METHODDEF(void) -reset_error_mgr (j_common_ptr cinfo) -{ - cinfo->err->num_warnings = 0; - /* trace_level is not reset since it is an application-supplied parameter */ - cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */ -} - - -/* - * Fill in the standard error-handling methods in a jpeg_error_mgr object. - * Typical call is: - * struct jpeg_compress_struct cinfo; - * struct jpeg_error_mgr err; - * - * cinfo.err = jpeg_std_error(&err); - * after which the application may override some of the methods. - */ - -GLOBAL(struct jpeg_error_mgr *) -jpeg_std_error (struct jpeg_error_mgr * err) -{ - err->error_exit = error_exit; - err->emit_message = emit_message; - err->output_message = output_message; - err->format_message = format_message; - err->reset_error_mgr = reset_error_mgr; - - err->trace_level = 0; /* default = no tracing */ - err->num_warnings = 0; /* no warnings emitted yet */ - err->msg_code = 0; /* may be useful as a flag for "no error" */ - - /* Initialize message table pointers */ - err->jpeg_message_table = jpeg_std_message_table; - err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1; - - err->addon_message_table = NULL; - err->first_addon_message = 0; /* for safety */ - err->last_addon_message = 0; - - return err; -} diff --git a/src/SFML/Graphics/libjpeg/jfdctflt.c b/src/SFML/Graphics/libjpeg/jfdctflt.c deleted file mode 100644 index 7ccfb380..00000000 --- a/src/SFML/Graphics/libjpeg/jfdctflt.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * jfdctflt.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a floating-point implementation of the - * forward DCT (Discrete Cosine Transform). - * - * This implementation should be more accurate than either of the integer - * DCT implementations. However, it may not give the same results on all - * machines because of differences in roundoff behavior. Speed will depend - * on the hardware's floating point capacity. - * - * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT - * on each column. Direct algorithms are also available, but they are - * much more complex and seem not to be any faster when reduced to code. - * - * This implementation is based on Arai, Agui, and Nakajima's algorithm for - * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - * Japanese, but the algorithm is described in the Pennebaker & Mitchell - * JPEG textbook (see REFERENCES section in file README). The following code - * is based directly on figure 4-8 in P&M. - * While an 8-point DCT cannot be done in less than 11 multiplies, it is - * possible to arrange the computation so that many of the multiplies are - * simple scalings of the final outputs. These multiplies can then be - * folded into the multiplications or divisions by the JPEG quantization - * table entries. The AA&N method leaves only 5 multiplies and 29 adds - * to be done in the DCT itself. - * The primary disadvantage of this method is that with a fixed-point - * implementation, accuracy is lost due to imprecise representation of the - * scaled quantization values. However, that problem does not arise if - * we use floating point arithmetic. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_FLOAT_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* - * Perform the forward DCT on one block of samples. - */ - -GLOBAL(void) -jpeg_fdct_float (FAST_FLOAT * data) -{ - FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - FAST_FLOAT tmp10, tmp11, tmp12, tmp13; - FAST_FLOAT z1, z2, z3, z4, z5, z11, z13; - FAST_FLOAT *dataptr; - int ctr; - - /* Pass 1: process rows. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - - /* Even part */ - - tmp10 = tmp0 + tmp3; /* phase 2 */ - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[0] = tmp10 + tmp11; /* phase 3 */ - dataptr[4] = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ - dataptr[2] = tmp13 + z1; /* phase 5 */ - dataptr[6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ - z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ - z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ - z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ - - z11 = tmp7 + z3; /* phase 5 */ - z13 = tmp7 - z3; - - dataptr[5] = z13 + z2; /* phase 6 */ - dataptr[3] = z13 - z2; - dataptr[1] = z11 + z4; - dataptr[7] = z11 - z4; - - dataptr += DCTSIZE; /* advance pointer to next row */ - } - - /* Pass 2: process columns. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; - tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; - tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; - tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; - tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; - tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; - tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; - tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - - /* Even part */ - - tmp10 = tmp0 + tmp3; /* phase 2 */ - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ - dataptr[DCTSIZE*4] = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ - dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ - dataptr[DCTSIZE*6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ - z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ - z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ - z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ - - z11 = tmp7 + z3; /* phase 5 */ - z13 = tmp7 - z3; - - dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ - dataptr[DCTSIZE*3] = z13 - z2; - dataptr[DCTSIZE*1] = z11 + z4; - dataptr[DCTSIZE*7] = z11 - z4; - - dataptr++; /* advance pointer to next column */ - } -} - -#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jfdctfst.c b/src/SFML/Graphics/libjpeg/jfdctfst.c deleted file mode 100644 index 005a74fe..00000000 --- a/src/SFML/Graphics/libjpeg/jfdctfst.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * jfdctfst.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a fast, not so accurate integer implementation of the - * forward DCT (Discrete Cosine Transform). - * - * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT - * on each column. Direct algorithms are also available, but they are - * much more complex and seem not to be any faster when reduced to code. - * - * This implementation is based on Arai, Agui, and Nakajima's algorithm for - * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - * Japanese, but the algorithm is described in the Pennebaker & Mitchell - * JPEG textbook (see REFERENCES section in file README). The following code - * is based directly on figure 4-8 in P&M. - * While an 8-point DCT cannot be done in less than 11 multiplies, it is - * possible to arrange the computation so that many of the multiplies are - * simple scalings of the final outputs. These multiplies can then be - * folded into the multiplications or divisions by the JPEG quantization - * table entries. The AA&N method leaves only 5 multiplies and 29 adds - * to be done in the DCT itself. - * The primary disadvantage of this method is that with fixed-point math, - * accuracy is lost due to imprecise representation of the scaled - * quantization values. The smaller the quantization table entry, the less - * precise the scaled value, so this implementation does worse with high- - * quality-setting files than with low-quality ones. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_IFAST_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* Scaling decisions are generally the same as in the LL&M algorithm; - * see jfdctint.c for more details. However, we choose to descale - * (right shift) multiplication products as soon as they are formed, - * rather than carrying additional fractional bits into subsequent additions. - * This compromises accuracy slightly, but it lets us save a few shifts. - * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) - * everywhere except in the multiplications proper; this saves a good deal - * of work on 16-bit-int machines. - * - * Again to save a few shifts, the intermediate results between pass 1 and - * pass 2 are not upscaled, but are represented only to integral precision. - * - * A final compromise is to represent the multiplicative constants to only - * 8 fractional bits, rather than 13. This saves some shifting work on some - * machines, and may also reduce the cost of multiplication (since there - * are fewer one-bits in the constants). - */ - -#define CONST_BITS 8 - - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 8 -#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */ -#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */ -#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */ -#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */ -#else -#define FIX_0_382683433 FIX(0.382683433) -#define FIX_0_541196100 FIX(0.541196100) -#define FIX_0_707106781 FIX(0.707106781) -#define FIX_1_306562965 FIX(1.306562965) -#endif - - -/* We can gain a little more speed, with a further compromise in accuracy, - * by omitting the addition in a descaling shift. This yields an incorrectly - * rounded result half the time... - */ - -#ifndef USE_ACCURATE_ROUNDING -#undef DESCALE -#define DESCALE(x,n) RIGHT_SHIFT(x, n) -#endif - - -/* Multiply a DCTELEM variable by an INT32 constant, and immediately - * descale to yield a DCTELEM result. - */ - -#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) - - -/* - * Perform the forward DCT on one block of samples. - */ - -GLOBAL(void) -jpeg_fdct_ifast (DCTELEM * data) -{ - DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - DCTELEM tmp10, tmp11, tmp12, tmp13; - DCTELEM z1, z2, z3, z4, z5, z11, z13; - DCTELEM *dataptr; - int ctr; - SHIFT_TEMPS - - /* Pass 1: process rows. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - - /* Even part */ - - tmp10 = tmp0 + tmp3; /* phase 2 */ - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[0] = tmp10 + tmp11; /* phase 3 */ - dataptr[4] = tmp10 - tmp11; - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ - dataptr[2] = tmp13 + z1; /* phase 5 */ - dataptr[6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ - z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ - z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ - z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ - - z11 = tmp7 + z3; /* phase 5 */ - z13 = tmp7 - z3; - - dataptr[5] = z13 + z2; /* phase 6 */ - dataptr[3] = z13 - z2; - dataptr[1] = z11 + z4; - dataptr[7] = z11 - z4; - - dataptr += DCTSIZE; /* advance pointer to next row */ - } - - /* Pass 2: process columns. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; - tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; - tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; - tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; - tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; - tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; - tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; - tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - - /* Even part */ - - tmp10 = tmp0 + tmp3; /* phase 2 */ - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ - dataptr[DCTSIZE*4] = tmp10 - tmp11; - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ - dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ - dataptr[DCTSIZE*6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ - z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ - z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ - z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ - - z11 = tmp7 + z3; /* phase 5 */ - z13 = tmp7 - z3; - - dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ - dataptr[DCTSIZE*3] = z13 - z2; - dataptr[DCTSIZE*1] = z11 + z4; - dataptr[DCTSIZE*7] = z11 - z4; - - dataptr++; /* advance pointer to next column */ - } -} - -#endif /* DCT_IFAST_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jfdctint.c b/src/SFML/Graphics/libjpeg/jfdctint.c deleted file mode 100644 index d6269274..00000000 --- a/src/SFML/Graphics/libjpeg/jfdctint.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * jfdctint.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a slow-but-accurate integer implementation of the - * forward DCT (Discrete Cosine Transform). - * - * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT - * on each column. Direct algorithms are also available, but they are - * much more complex and seem not to be any faster when reduced to code. - * - * This implementation is based on an algorithm described in - * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT - * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, - * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. - * The primary algorithm described there uses 11 multiplies and 29 adds. - * We use their alternate method with 12 multiplies and 32 adds. - * The advantage of this method is that no data path contains more than one - * multiplication; this allows a very simple and accurate implementation in - * scaled fixed-point arithmetic, with a minimal number of shifts. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_ISLOW_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* - * The poop on this scaling stuff is as follows: - * - * Each 1-D DCT step produces outputs which are a factor of sqrt(N) - * larger than the true DCT outputs. The final outputs are therefore - * a factor of N larger than desired; since N=8 this can be cured by - * a simple right shift at the end of the algorithm. The advantage of - * this arrangement is that we save two multiplications per 1-D DCT, - * because the y0 and y4 outputs need not be divided by sqrt(N). - * In the IJG code, this factor of 8 is removed by the quantization step - * (in jcdctmgr.c), NOT in this module. - * - * We have to do addition and subtraction of the integer inputs, which - * is no problem, and multiplication by fractional constants, which is - * a problem to do in integer arithmetic. We multiply all the constants - * by CONST_SCALE and convert them to integer constants (thus retaining - * CONST_BITS bits of precision in the constants). After doing a - * multiplication we have to divide the product by CONST_SCALE, with proper - * rounding, to produce the correct output. This division can be done - * cheaply as a right shift of CONST_BITS bits. We postpone shifting - * as long as possible so that partial sums can be added together with - * full fractional precision. - * - * The outputs of the first pass are scaled up by PASS1_BITS bits so that - * they are represented to better-than-integral precision. These outputs - * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word - * with the recommended scaling. (For 12-bit sample data, the intermediate - * array is INT32 anyway.) - * - * To avoid overflow of the 32-bit intermediate results in pass 2, we must - * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis - * shows that the values given below are the most effective. - */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 13 -#define PASS1_BITS 2 -#else -#define CONST_BITS 13 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 13 -#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ -#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ -#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ -#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ -#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ -#else -#define FIX_0_298631336 FIX(0.298631336) -#define FIX_0_390180644 FIX(0.390180644) -#define FIX_0_541196100 FIX(0.541196100) -#define FIX_0_765366865 FIX(0.765366865) -#define FIX_0_899976223 FIX(0.899976223) -#define FIX_1_175875602 FIX(1.175875602) -#define FIX_1_501321110 FIX(1.501321110) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_1_961570560 FIX(1.961570560) -#define FIX_2_053119869 FIX(2.053119869) -#define FIX_2_562915447 FIX(2.562915447) -#define FIX_3_072711026 FIX(3.072711026) -#endif - - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * For 8-bit samples with the recommended scaling, all the variable - * and constant values involved are no more than 16 bits wide, so a - * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. - * For 12-bit samples, a full 32-bit multiplication will be needed. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MULTIPLY(var,const) MULTIPLY16C16(var,const) -#else -#define MULTIPLY(var,const) ((var) * (const)) -#endif - - -/* - * Perform the forward DCT on one block of samples. - */ - -GLOBAL(void) -jpeg_fdct_islow (DCTELEM * data) -{ - INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; - DCTELEM *dataptr; - int ctr; - SHIFT_TEMPS - - /* Pass 1: process rows. */ - /* Note results are scaled up by sqrt(8) compared to a true DCT; */ - /* furthermore, we scale the results by 2**PASS1_BITS. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - - /* Even part per LL&M figure 1 --- note that published figure is faulty; - * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". - */ - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS); - dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); - dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), - CONST_BITS-PASS1_BITS); - dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), - CONST_BITS-PASS1_BITS); - - /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. - */ - - z1 = tmp4 + tmp7; - z2 = tmp5 + tmp6; - z3 = tmp4 + tmp6; - z4 = tmp5 + tmp7; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS); - dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS); - dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS); - dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS); - - dataptr += DCTSIZE; /* advance pointer to next row */ - } - - /* Pass 2: process columns. - * We remove the PASS1_BITS scaling, but leave the results scaled up - * by an overall factor of 8. - */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; - tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; - tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; - tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; - tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; - tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; - tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; - tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - - /* Even part per LL&M figure 1 --- note that published figure is faulty; - * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". - */ - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); - dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); - dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), - CONST_BITS+PASS1_BITS); - - /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. - */ - - z1 = tmp4 + tmp7; - z2 = tmp5 + tmp6; - z3 = tmp4 + tmp6; - z4 = tmp5 + tmp7; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, - CONST_BITS+PASS1_BITS); - - dataptr++; /* advance pointer to next column */ - } -} - -#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jidctflt.c b/src/SFML/Graphics/libjpeg/jidctflt.c deleted file mode 100644 index 5fea54c2..00000000 --- a/src/SFML/Graphics/libjpeg/jidctflt.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * jidctflt.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a floating-point implementation of the - * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - * must also perform dequantization of the input coefficients. - * - * This implementation should be more accurate than either of the integer - * IDCT implementations. However, it may not give the same results on all - * machines because of differences in roundoff behavior. Speed will depend - * on the hardware's floating point capacity. - * - * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - * on each row (or vice versa, but it's more convenient to emit a row at - * a time). Direct algorithms are also available, but they are much more - * complex and seem not to be any faster when reduced to code. - * - * This implementation is based on Arai, Agui, and Nakajima's algorithm for - * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - * Japanese, but the algorithm is described in the Pennebaker & Mitchell - * JPEG textbook (see REFERENCES section in file README). The following code - * is based directly on figure 4-8 in P&M. - * While an 8-point DCT cannot be done in less than 11 multiplies, it is - * possible to arrange the computation so that many of the multiplies are - * simple scalings of the final outputs. These multiplies can then be - * folded into the multiplications or divisions by the JPEG quantization - * table entries. The AA&N method leaves only 5 multiplies and 29 adds - * to be done in the DCT itself. - * The primary disadvantage of this method is that with a fixed-point - * implementation, accuracy is lost due to imprecise representation of the - * scaled quantization values. However, that problem does not arise if - * we use floating point arithmetic. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_FLOAT_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce a float result. - */ - -#define DEQUANTIZE(coef,quantval) (((FAST_FLOAT) (coef)) * (quantval)) - - -/* - * Perform dequantization and inverse DCT on one block of coefficients. - */ - -GLOBAL(void) -jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - FAST_FLOAT tmp10, tmp11, tmp12, tmp13; - FAST_FLOAT z5, z10, z11, z12, z13; - JCOEFPTR inptr; - FLOAT_MULT_TYPE * quantptr; - FAST_FLOAT * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (FLOAT_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; ctr--) { - /* Due to quantization, we will usually find that many of the input - * coefficients are zero, especially the AC terms. We can exploit this - * by short-circuiting the IDCT calculation for any column in which all - * the AC terms are zero. In that case each output is equal to the - * DC coefficient (with scale factor as needed). - * With typical images and quantization tables, half or more of the - * column DCT calculations can be simplified this way. - */ - - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && - inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && - inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && - inptr[DCTSIZE*7] == 0) { - /* AC terms all zero */ - FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - wsptr[DCTSIZE*2] = dcval; - wsptr[DCTSIZE*3] = dcval; - wsptr[DCTSIZE*4] = dcval; - wsptr[DCTSIZE*5] = dcval; - wsptr[DCTSIZE*6] = dcval; - wsptr[DCTSIZE*7] = dcval; - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - continue; - } - - /* Even part */ - - tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); - tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); - tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); - - tmp10 = tmp0 + tmp2; /* phase 3 */ - tmp11 = tmp0 - tmp2; - - tmp13 = tmp1 + tmp3; /* phases 5-3 */ - tmp12 = (tmp1 - tmp3) * ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */ - - tmp0 = tmp10 + tmp13; /* phase 2 */ - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - - z13 = tmp6 + tmp5; /* phase 6 */ - z10 = tmp6 - tmp5; - z11 = tmp4 + tmp7; - z12 = tmp4 - tmp7; - - tmp7 = z11 + z13; /* phase 5 */ - tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */ - - z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ - tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ - tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; /* phase 2 */ - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - wsptr[DCTSIZE*0] = tmp0 + tmp7; - wsptr[DCTSIZE*7] = tmp0 - tmp7; - wsptr[DCTSIZE*1] = tmp1 + tmp6; - wsptr[DCTSIZE*6] = tmp1 - tmp6; - wsptr[DCTSIZE*2] = tmp2 + tmp5; - wsptr[DCTSIZE*5] = tmp2 - tmp5; - wsptr[DCTSIZE*4] = tmp3 + tmp4; - wsptr[DCTSIZE*3] = tmp3 - tmp4; - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - } - - /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3. */ - - wsptr = workspace; - for (ctr = 0; ctr < DCTSIZE; ctr++) { - outptr = output_buf[ctr] + output_col; - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * And testing floats for zero is relatively expensive, so we don't bother. - */ - - /* Even part */ - - tmp10 = wsptr[0] + wsptr[4]; - tmp11 = wsptr[0] - wsptr[4]; - - tmp13 = wsptr[2] + wsptr[6]; - tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13; - - tmp0 = tmp10 + tmp13; - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - z13 = wsptr[5] + wsptr[3]; - z10 = wsptr[5] - wsptr[3]; - z11 = wsptr[1] + wsptr[7]; - z12 = wsptr[1] - wsptr[7]; - - tmp7 = z11 + z13; - tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); - - z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ - tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ - tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - /* Final output stage: scale down by a factor of 8 and range-limit */ - - outptr[0] = range_limit[(int) DESCALE((INT32) (tmp0 + tmp7), 3) - & RANGE_MASK]; - outptr[7] = range_limit[(int) DESCALE((INT32) (tmp0 - tmp7), 3) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE((INT32) (tmp1 + tmp6), 3) - & RANGE_MASK]; - outptr[6] = range_limit[(int) DESCALE((INT32) (tmp1 - tmp6), 3) - & RANGE_MASK]; - outptr[2] = range_limit[(int) DESCALE((INT32) (tmp2 + tmp5), 3) - & RANGE_MASK]; - outptr[5] = range_limit[(int) DESCALE((INT32) (tmp2 - tmp5), 3) - & RANGE_MASK]; - outptr[4] = range_limit[(int) DESCALE((INT32) (tmp3 + tmp4), 3) - & RANGE_MASK]; - outptr[3] = range_limit[(int) DESCALE((INT32) (tmp3 - tmp4), 3) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - -#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jidctfst.c b/src/SFML/Graphics/libjpeg/jidctfst.c deleted file mode 100644 index 078b8c44..00000000 --- a/src/SFML/Graphics/libjpeg/jidctfst.c +++ /dev/null @@ -1,368 +0,0 @@ -/* - * jidctfst.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a fast, not so accurate integer implementation of the - * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - * must also perform dequantization of the input coefficients. - * - * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - * on each row (or vice versa, but it's more convenient to emit a row at - * a time). Direct algorithms are also available, but they are much more - * complex and seem not to be any faster when reduced to code. - * - * This implementation is based on Arai, Agui, and Nakajima's algorithm for - * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - * Japanese, but the algorithm is described in the Pennebaker & Mitchell - * JPEG textbook (see REFERENCES section in file README). The following code - * is based directly on figure 4-8 in P&M. - * While an 8-point DCT cannot be done in less than 11 multiplies, it is - * possible to arrange the computation so that many of the multiplies are - * simple scalings of the final outputs. These multiplies can then be - * folded into the multiplications or divisions by the JPEG quantization - * table entries. The AA&N method leaves only 5 multiplies and 29 adds - * to be done in the DCT itself. - * The primary disadvantage of this method is that with fixed-point math, - * accuracy is lost due to imprecise representation of the scaled - * quantization values. The smaller the quantization table entry, the less - * precise the scaled value, so this implementation does worse with high- - * quality-setting files than with low-quality ones. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_IFAST_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* Scaling decisions are generally the same as in the LL&M algorithm; - * see jidctint.c for more details. However, we choose to descale - * (right shift) multiplication products as soon as they are formed, - * rather than carrying additional fractional bits into subsequent additions. - * This compromises accuracy slightly, but it lets us save a few shifts. - * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) - * everywhere except in the multiplications proper; this saves a good deal - * of work on 16-bit-int machines. - * - * The dequantized coefficients are not integers because the AA&N scaling - * factors have been incorporated. We represent them scaled up by PASS1_BITS, - * so that the first and second IDCT rounds have the same input scaling. - * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to - * avoid a descaling shift; this compromises accuracy rather drastically - * for small quantization table entries, but it saves a lot of shifts. - * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway, - * so we use a much larger scaling factor to preserve accuracy. - * - * A final compromise is to represent the multiplicative constants to only - * 8 fractional bits, rather than 13. This saves some shifting work on some - * machines, and may also reduce the cost of multiplication (since there - * are fewer one-bits in the constants). - */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 8 -#define PASS1_BITS 2 -#else -#define CONST_BITS 8 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 8 -#define FIX_1_082392200 ((INT32) 277) /* FIX(1.082392200) */ -#define FIX_1_414213562 ((INT32) 362) /* FIX(1.414213562) */ -#define FIX_1_847759065 ((INT32) 473) /* FIX(1.847759065) */ -#define FIX_2_613125930 ((INT32) 669) /* FIX(2.613125930) */ -#else -#define FIX_1_082392200 FIX(1.082392200) -#define FIX_1_414213562 FIX(1.414213562) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_2_613125930 FIX(2.613125930) -#endif - - -/* We can gain a little more speed, with a further compromise in accuracy, - * by omitting the addition in a descaling shift. This yields an incorrectly - * rounded result half the time... - */ - -#ifndef USE_ACCURATE_ROUNDING -#undef DESCALE -#define DESCALE(x,n) RIGHT_SHIFT(x, n) -#endif - - -/* Multiply a DCTELEM variable by an INT32 constant, and immediately - * descale to yield a DCTELEM result. - */ - -#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce a DCTELEM result. For 8-bit data a 16x16->16 - * multiplication will do. For 12-bit data, the multiplier table is - * declared INT32, so a 32-bit multiply will be used. - */ - -#if BITS_IN_JSAMPLE == 8 -#define DEQUANTIZE(coef,quantval) (((IFAST_MULT_TYPE) (coef)) * (quantval)) -#else -#define DEQUANTIZE(coef,quantval) \ - DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS) -#endif - - -/* Like DESCALE, but applies to a DCTELEM and produces an int. - * We assume that int right shift is unsigned if INT32 right shift is. - */ - -#ifdef RIGHT_SHIFT_IS_UNSIGNED -#define ISHIFT_TEMPS DCTELEM ishift_temp; -#if BITS_IN_JSAMPLE == 8 -#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */ -#else -#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */ -#endif -#define IRIGHT_SHIFT(x,shft) \ - ((ishift_temp = (x)) < 0 ? \ - (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \ - (ishift_temp >> (shft))) -#else -#define ISHIFT_TEMPS -#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) -#endif - -#ifdef USE_ACCURATE_ROUNDING -#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n)) -#else -#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n)) -#endif - - -/* - * Perform dequantization and inverse DCT on one block of coefficients. - */ - -GLOBAL(void) -jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - DCTELEM tmp10, tmp11, tmp12, tmp13; - DCTELEM z5, z10, z11, z12, z13; - JCOEFPTR inptr; - IFAST_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE2]; /* buffers data between passes */ - SHIFT_TEMPS /* for DESCALE */ - ISHIFT_TEMPS /* for IDESCALE */ - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (IFAST_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; ctr--) { - /* Due to quantization, we will usually find that many of the input - * coefficients are zero, especially the AC terms. We can exploit this - * by short-circuiting the IDCT calculation for any column in which all - * the AC terms are zero. In that case each output is equal to the - * DC coefficient (with scale factor as needed). - * With typical images and quantization tables, half or more of the - * column DCT calculations can be simplified this way. - */ - - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && - inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && - inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && - inptr[DCTSIZE*7] == 0) { - /* AC terms all zero */ - int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - wsptr[DCTSIZE*2] = dcval; - wsptr[DCTSIZE*3] = dcval; - wsptr[DCTSIZE*4] = dcval; - wsptr[DCTSIZE*5] = dcval; - wsptr[DCTSIZE*6] = dcval; - wsptr[DCTSIZE*7] = dcval; - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - continue; - } - - /* Even part */ - - tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); - tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); - tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); - - tmp10 = tmp0 + tmp2; /* phase 3 */ - tmp11 = tmp0 - tmp2; - - tmp13 = tmp1 + tmp3; /* phases 5-3 */ - tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */ - - tmp0 = tmp10 + tmp13; /* phase 2 */ - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - - z13 = tmp6 + tmp5; /* phase 6 */ - z10 = tmp6 - tmp5; - z11 = tmp4 + tmp7; - z12 = tmp4 - tmp7; - - tmp7 = z11 + z13; /* phase 5 */ - tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ - - z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ - tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ - tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; /* phase 2 */ - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); - wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); - wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); - wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); - wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5); - wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); - wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); - wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - } - - /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3, */ - /* and also undo the PASS1_BITS scaling. */ - - wsptr = workspace; - for (ctr = 0; ctr < DCTSIZE; ctr++) { - outptr = output_buf[ctr] + output_col; - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * On machines with very fast multiplication, it's possible that the - * test takes more time than it's worth. In that case this section - * may be commented out. - */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && - wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - outptr[2] = dcval; - outptr[3] = dcval; - outptr[4] = dcval; - outptr[5] = dcval; - outptr[6] = dcval; - outptr[7] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part */ - - tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]); - tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); - - tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); - tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562) - - tmp13; - - tmp0 = tmp10 + tmp13; - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; - z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; - z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; - z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; - - tmp7 = z11 + z13; /* phase 5 */ - tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ - - z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ - tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ - tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; /* phase 2 */ - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - /* Final output stage: scale down by a factor of 8 and range-limit */ - - outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) - & RANGE_MASK]; - outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3) - & RANGE_MASK]; - outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3) - & RANGE_MASK]; - outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) - & RANGE_MASK]; - outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) - & RANGE_MASK]; - outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) - & RANGE_MASK]; - outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3) - & RANGE_MASK]; - outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - -#endif /* DCT_IFAST_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jidctint.c b/src/SFML/Graphics/libjpeg/jidctint.c deleted file mode 100644 index 4f47fe83..00000000 --- a/src/SFML/Graphics/libjpeg/jidctint.c +++ /dev/null @@ -1,389 +0,0 @@ -/* - * jidctint.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a slow-but-accurate integer implementation of the - * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - * must also perform dequantization of the input coefficients. - * - * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - * on each row (or vice versa, but it's more convenient to emit a row at - * a time). Direct algorithms are also available, but they are much more - * complex and seem not to be any faster when reduced to code. - * - * This implementation is based on an algorithm described in - * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT - * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, - * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. - * The primary algorithm described there uses 11 multiplies and 29 adds. - * We use their alternate method with 12 multiplies and 32 adds. - * The advantage of this method is that no data path contains more than one - * multiplication; this allows a very simple and accurate implementation in - * scaled fixed-point arithmetic, with a minimal number of shifts. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_ISLOW_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* - * The poop on this scaling stuff is as follows: - * - * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) - * larger than the true IDCT outputs. The final outputs are therefore - * a factor of N larger than desired; since N=8 this can be cured by - * a simple right shift at the end of the algorithm. The advantage of - * this arrangement is that we save two multiplications per 1-D IDCT, - * because the y0 and y4 inputs need not be divided by sqrt(N). - * - * We have to do addition and subtraction of the integer inputs, which - * is no problem, and multiplication by fractional constants, which is - * a problem to do in integer arithmetic. We multiply all the constants - * by CONST_SCALE and convert them to integer constants (thus retaining - * CONST_BITS bits of precision in the constants). After doing a - * multiplication we have to divide the product by CONST_SCALE, with proper - * rounding, to produce the correct output. This division can be done - * cheaply as a right shift of CONST_BITS bits. We postpone shifting - * as long as possible so that partial sums can be added together with - * full fractional precision. - * - * The outputs of the first pass are scaled up by PASS1_BITS bits so that - * they are represented to better-than-integral precision. These outputs - * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word - * with the recommended scaling. (To scale up 12-bit sample data further, an - * intermediate INT32 array would be needed.) - * - * To avoid overflow of the 32-bit intermediate results in pass 2, we must - * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis - * shows that the values given below are the most effective. - */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 13 -#define PASS1_BITS 2 -#else -#define CONST_BITS 13 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 13 -#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ -#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ -#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ -#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ -#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ -#else -#define FIX_0_298631336 FIX(0.298631336) -#define FIX_0_390180644 FIX(0.390180644) -#define FIX_0_541196100 FIX(0.541196100) -#define FIX_0_765366865 FIX(0.765366865) -#define FIX_0_899976223 FIX(0.899976223) -#define FIX_1_175875602 FIX(1.175875602) -#define FIX_1_501321110 FIX(1.501321110) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_1_961570560 FIX(1.961570560) -#define FIX_2_053119869 FIX(2.053119869) -#define FIX_2_562915447 FIX(2.562915447) -#define FIX_3_072711026 FIX(3.072711026) -#endif - - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * For 8-bit samples with the recommended scaling, all the variable - * and constant values involved are no more than 16 bits wide, so a - * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. - * For 12-bit samples, a full 32-bit multiplication will be needed. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MULTIPLY(var,const) MULTIPLY16C16(var,const) -#else -#define MULTIPLY(var,const) ((var) * (const)) -#endif - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce an int result. In this module, both inputs and result - * are 16 bits or less, so either int or short multiply will work. - */ - -#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) - - -/* - * Perform dequantization and inverse DCT on one block of coefficients. - */ - -GLOBAL(void) -jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - INT32 tmp0, tmp1, tmp2, tmp3; - INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; - JCOEFPTR inptr; - ISLOW_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE2]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ - /* furthermore, we scale the results by 2**PASS1_BITS. */ - - inptr = coef_block; - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; ctr--) { - /* Due to quantization, we will usually find that many of the input - * coefficients are zero, especially the AC terms. We can exploit this - * by short-circuiting the IDCT calculation for any column in which all - * the AC terms are zero. In that case each output is equal to the - * DC coefficient (with scale factor as needed). - * With typical images and quantization tables, half or more of the - * column DCT calculations can be simplified this way. - */ - - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && - inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && - inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && - inptr[DCTSIZE*7] == 0) { - /* AC terms all zero */ - int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - wsptr[DCTSIZE*2] = dcval; - wsptr[DCTSIZE*3] = dcval; - wsptr[DCTSIZE*4] = dcval; - wsptr[DCTSIZE*5] = dcval; - wsptr[DCTSIZE*6] = dcval; - wsptr[DCTSIZE*7] = dcval; - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - continue; - } - - /* Even part: reverse the even part of the forward DCT. */ - /* The rotator is sqrt(2)*c(-6). */ - - z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); - z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); - - z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); - - tmp0 = (z2 + z3) << CONST_BITS; - tmp1 = (z2 - z3) << CONST_BITS; - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - /* Odd part per figure 8; the matrix is unitary and hence its - * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. - */ - - tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - z4 = tmp1 + tmp3; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; - - /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - - wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS); - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - } - - /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3, */ - /* and also undo the PASS1_BITS scaling. */ - - wsptr = workspace; - for (ctr = 0; ctr < DCTSIZE; ctr++) { - outptr = output_buf[ctr] + output_col; - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * On machines with very fast multiplication, it's possible that the - * test takes more time than it's worth. In that case this section - * may be commented out. - */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && - wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - outptr[2] = dcval; - outptr[3] = dcval; - outptr[4] = dcval; - outptr[5] = dcval; - outptr[6] = dcval; - outptr[7] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part: reverse the even part of the forward DCT. */ - /* The rotator is sqrt(2)*c(-6). */ - - z2 = (INT32) wsptr[2]; - z3 = (INT32) wsptr[6]; - - z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS; - tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS; - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - /* Odd part per figure 8; the matrix is unitary and hence its - * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. - */ - - tmp0 = (INT32) wsptr[7]; - tmp1 = (INT32) wsptr[5]; - tmp2 = (INT32) wsptr[3]; - tmp3 = (INT32) wsptr[1]; - - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - z4 = tmp1 + tmp3; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; - - /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - - outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - -#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jidctred.c b/src/SFML/Graphics/libjpeg/jidctred.c deleted file mode 100644 index 911899b8..00000000 --- a/src/SFML/Graphics/libjpeg/jidctred.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * jidctred.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains inverse-DCT routines that produce reduced-size output: - * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block. - * - * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M) - * algorithm used in jidctint.c. We simply replace each 8-to-8 1-D IDCT step - * with an 8-to-4 step that produces the four averages of two adjacent outputs - * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output). - * These steps were derived by computing the corresponding values at the end - * of the normal LL&M code, then simplifying as much as possible. - * - * 1x1 is trivial: just take the DC coefficient divided by 8. - * - * See jidctint.c for additional comments. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef IDCT_SCALING_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* Scaling is the same as in jidctint.c. */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 13 -#define PASS1_BITS 2 -#else -#define CONST_BITS 13 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 13 -#define FIX_0_211164243 ((INT32) 1730) /* FIX(0.211164243) */ -#define FIX_0_509795579 ((INT32) 4176) /* FIX(0.509795579) */ -#define FIX_0_601344887 ((INT32) 4926) /* FIX(0.601344887) */ -#define FIX_0_720959822 ((INT32) 5906) /* FIX(0.720959822) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_850430095 ((INT32) 6967) /* FIX(0.850430095) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_061594337 ((INT32) 8697) /* FIX(1.061594337) */ -#define FIX_1_272758580 ((INT32) 10426) /* FIX(1.272758580) */ -#define FIX_1_451774981 ((INT32) 11893) /* FIX(1.451774981) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_2_172734803 ((INT32) 17799) /* FIX(2.172734803) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_624509785 ((INT32) 29692) /* FIX(3.624509785) */ -#else -#define FIX_0_211164243 FIX(0.211164243) -#define FIX_0_509795579 FIX(0.509795579) -#define FIX_0_601344887 FIX(0.601344887) -#define FIX_0_720959822 FIX(0.720959822) -#define FIX_0_765366865 FIX(0.765366865) -#define FIX_0_850430095 FIX(0.850430095) -#define FIX_0_899976223 FIX(0.899976223) -#define FIX_1_061594337 FIX(1.061594337) -#define FIX_1_272758580 FIX(1.272758580) -#define FIX_1_451774981 FIX(1.451774981) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_2_172734803 FIX(2.172734803) -#define FIX_2_562915447 FIX(2.562915447) -#define FIX_3_624509785 FIX(3.624509785) -#endif - - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * For 8-bit samples with the recommended scaling, all the variable - * and constant values involved are no more than 16 bits wide, so a - * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. - * For 12-bit samples, a full 32-bit multiplication will be needed. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MULTIPLY(var,const) MULTIPLY16C16(var,const) -#else -#define MULTIPLY(var,const) ((var) * (const)) -#endif - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce an int result. In this module, both inputs and result - * are 16 bits or less, so either int or short multiply will work. - */ - -#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) - - -/* - * Perform dequantization and inverse DCT on one block of coefficients, - * producing a reduced-size 4x4 output block. - */ - -GLOBAL(void) -jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - INT32 tmp0, tmp2, tmp10, tmp12; - INT32 z1, z2, z3, z4; - JCOEFPTR inptr; - ISLOW_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE*4]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { - /* Don't bother to process column 4, because second pass won't use it */ - if (ctr == DCTSIZE-4) - continue; - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && - inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 && - inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) { - /* AC terms all zero; we need not examine term 4 for 4x4 output */ - int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - wsptr[DCTSIZE*2] = dcval; - wsptr[DCTSIZE*3] = dcval; - - continue; - } - - /* Even part */ - - tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp0 <<= (CONST_BITS+1); - - z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); - z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); - - tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865); - - tmp10 = tmp0 + tmp2; - tmp12 = tmp0 - tmp2; - - /* Odd part */ - - z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - - tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ - + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ - + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ - + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ - - tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ - + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ - + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ - + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ - - /* Final output stage */ - - wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1); - wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1); - wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1); - wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1); - } - - /* Pass 2: process 4 rows from work array, store into output array. */ - - wsptr = workspace; - for (ctr = 0; ctr < 4; ctr++) { - outptr = output_buf[ctr] + output_col; - /* It's not clear whether a zero row test is worthwhile here ... */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && - wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - outptr[2] = dcval; - outptr[3] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part */ - - tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1); - - tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065) - + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865); - - tmp10 = tmp0 + tmp2; - tmp12 = tmp0 - tmp2; - - /* Odd part */ - - z1 = (INT32) wsptr[7]; - z2 = (INT32) wsptr[5]; - z3 = (INT32) wsptr[3]; - z4 = (INT32) wsptr[1]; - - tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ - + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ - + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ - + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ - - tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ - + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ - + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ - + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ - - /* Final output stage */ - - outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - - -/* - * Perform dequantization and inverse DCT on one block of coefficients, - * producing a reduced-size 2x2 output block. - */ - -GLOBAL(void) -jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - INT32 tmp0, tmp10, z1; - JCOEFPTR inptr; - ISLOW_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE*2]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { - /* Don't bother to process columns 2,4,6 */ - if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6) - continue; - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 && - inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) { - /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */ - int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - - continue; - } - - /* Even part */ - - z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp10 = z1 << (CONST_BITS+2); - - /* Odd part */ - - z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */ - z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */ - z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */ - z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ - - /* Final output stage */ - - wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2); - wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2); - } - - /* Pass 2: process 2 rows from work array, store into output array. */ - - wsptr = workspace; - for (ctr = 0; ctr < 2; ctr++) { - outptr = output_buf[ctr] + output_col; - /* It's not clear whether a zero row test is worthwhile here ... */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part */ - - tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2); - - /* Odd part */ - - tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */ - + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */ - + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */ - + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ - - /* Final output stage */ - - outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0, - CONST_BITS+PASS1_BITS+3+2) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0, - CONST_BITS+PASS1_BITS+3+2) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - - -/* - * Perform dequantization and inverse DCT on one block of coefficients, - * producing a reduced-size 1x1 output block. - */ - -GLOBAL(void) -jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - int dcval; - ISLOW_MULT_TYPE * quantptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - SHIFT_TEMPS - - /* We hardly need an inverse DCT routine for this: just take the - * average pixel value, which is one-eighth of the DC coefficient. - */ - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - dcval = DEQUANTIZE(coef_block[0], quantptr[0]); - dcval = (int) DESCALE((INT32) dcval, 3); - - output_buf[0][output_col] = range_limit[dcval & RANGE_MASK]; -} - -#endif /* IDCT_SCALING_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jinclude.h b/src/SFML/Graphics/libjpeg/jinclude.h deleted file mode 100644 index 5ff60fed..00000000 --- a/src/SFML/Graphics/libjpeg/jinclude.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * jinclude.h - * - * Copyright (C) 1991-1994, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file exists to provide a single place to fix any problems with - * including the wrong system include files. (Common problems are taken - * care of by the standard jconfig symbols, but on really weird systems - * you may have to edit this file.) - * - * NOTE: this file is NOT intended to be included by applications using the - * JPEG library. Most applications need only include jpeglib.h. - */ - - -/* Include auto-config file to find out which system include files we need. */ - -#include "jconfig.h" /* auto configuration options */ -#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */ - -/* - * We need the NULL macro and size_t typedef. - * On an ANSI-conforming system it is sufficient to include . - * Otherwise, we get them from or ; we may have to - * pull in as well. - * Note that the core JPEG library does not require ; - * only the default error handler and data source/destination modules do. - * But we must pull it in because of the references to FILE in jpeglib.h. - * You can remove those references if you want to compile without . - */ - -#ifdef HAVE_STDDEF_H -#include -#endif - -#ifdef HAVE_STDLIB_H -#include -#endif - -#ifdef NEED_SYS_TYPES_H -#include -#endif - -#include - -/* - * We need memory copying and zeroing functions, plus strncpy(). - * ANSI and System V implementations declare these in . - * BSD doesn't have the mem() functions, but it does have bcopy()/bzero(). - * Some systems may declare memset and memcpy in . - * - * NOTE: we assume the size parameters to these functions are of type size_t. - * Change the casts in these macros if not! - */ - -#ifdef NEED_BSD_STRINGS - -#include -#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size)) -#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size)) - -#else /* not BSD, assume ANSI/SysV string lib */ - -#include -#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) -#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) - -#endif - -/* - * In ANSI C, and indeed any rational implementation, size_t is also the - * type returned by sizeof(). However, it seems there are some irrational - * implementations out there, in which sizeof() returns an int even though - * size_t is defined as long or unsigned long. To ensure consistent results - * we always use this SIZEOF() macro in place of using sizeof() directly. - */ - -#define SIZEOF(object) ((size_t) sizeof(object)) - -/* - * The modules that use fread() and fwrite() always invoke them through - * these macros. On some systems you may need to twiddle the argument casts. - * CAUTION: argument order is different from underlying functions! - */ - -#define JFREAD(file,buf,sizeofbuf) \ - ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) -#define JFWRITE(file,buf,sizeofbuf) \ - ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) diff --git a/src/SFML/Graphics/libjpeg/jmemmgr.c b/src/SFML/Graphics/libjpeg/jmemmgr.c deleted file mode 100644 index b636f1be..00000000 --- a/src/SFML/Graphics/libjpeg/jmemmgr.c +++ /dev/null @@ -1,1118 +0,0 @@ -/* - * jmemmgr.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the JPEG system-independent memory management - * routines. This code is usable across a wide variety of machines; most - * of the system dependencies have been isolated in a separate file. - * The major functions provided here are: - * * pool-based allocation and freeing of memory; - * * policy decisions about how to divide available memory among the - * virtual arrays; - * * control logic for swapping virtual arrays between main memory and - * backing storage. - * The separate system-dependent file provides the actual backing-storage - * access code, and it contains the policy decision about how much total - * main memory to use. - * This file is system-dependent in the sense that some of its functions - * are unnecessary in some systems. For example, if there is enough virtual - * memory so that backing storage will never be used, much of the virtual - * array control logic could be removed. (Of course, if you have that much - * memory then you shouldn't care about a little bit of unused code...) - */ - -#define JPEG_INTERNALS -#define AM_MEMORY_MANAGER /* we define jvirt_Xarray_control structs */ -#include "jinclude.h" -#include "jpeglib.h" -#include "jmemsys.h" /* import the system-dependent declarations */ - -#ifndef NO_GETENV -#ifndef HAVE_STDLIB_H /* should declare getenv() */ -extern char * getenv JPP((const char * name)); -#endif -#endif - - -/* - * Some important notes: - * The allocation routines provided here must never return NULL. - * They should exit to error_exit if unsuccessful. - * - * It's not a good idea to try to merge the sarray and barray routines, - * even though they are textually almost the same, because samples are - * usually stored as bytes while coefficients are shorts or ints. Thus, - * in machines where byte pointers have a different representation from - * word pointers, the resulting machine code could not be the same. - */ - - -/* - * Many machines require storage alignment: longs must start on 4-byte - * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc() - * always returns pointers that are multiples of the worst-case alignment - * requirement, and we had better do so too. - * There isn't any really portable way to determine the worst-case alignment - * requirement. This module assumes that the alignment requirement is - * multiples of sizeof(ALIGN_TYPE). - * By default, we define ALIGN_TYPE as double. This is necessary on some - * workstations (where doubles really do need 8-byte alignment) and will work - * fine on nearly everything. If your machine has lesser alignment needs, - * you can save a few bytes by making ALIGN_TYPE smaller. - * The only place I know of where this will NOT work is certain Macintosh - * 680x0 compilers that define double as a 10-byte IEEE extended float. - * Doing 10-byte alignment is counterproductive because longwords won't be - * aligned well. Put "#define ALIGN_TYPE long" in jconfig.h if you have - * such a compiler. - */ - -#ifndef ALIGN_TYPE /* so can override from jconfig.h */ -#define ALIGN_TYPE double -#endif - - -/* - * We allocate objects from "pools", where each pool is gotten with a single - * request to jpeg_get_small() or jpeg_get_large(). There is no per-object - * overhead within a pool, except for alignment padding. Each pool has a - * header with a link to the next pool of the same class. - * Small and large pool headers are identical except that the latter's - * link pointer must be FAR on 80x86 machines. - * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE - * field. This forces the compiler to make SIZEOF(small_pool_hdr) a multiple - * of the alignment requirement of ALIGN_TYPE. - */ - -typedef union small_pool_struct * small_pool_ptr; - -typedef union small_pool_struct { - struct { - small_pool_ptr next; /* next in list of pools */ - size_t bytes_used; /* how many bytes already used within pool */ - size_t bytes_left; /* bytes still available in this pool */ - } hdr; - ALIGN_TYPE dummy; /* included in union to ensure alignment */ -} small_pool_hdr; - -typedef union large_pool_struct FAR * large_pool_ptr; - -typedef union large_pool_struct { - struct { - large_pool_ptr next; /* next in list of pools */ - size_t bytes_used; /* how many bytes already used within pool */ - size_t bytes_left; /* bytes still available in this pool */ - } hdr; - ALIGN_TYPE dummy; /* included in union to ensure alignment */ -} large_pool_hdr; - - -/* - * Here is the full definition of a memory manager object. - */ - -typedef struct { - struct jpeg_memory_mgr pub; /* public fields */ - - /* Each pool identifier (lifetime class) names a linked list of pools. */ - small_pool_ptr small_list[JPOOL_NUMPOOLS]; - large_pool_ptr large_list[JPOOL_NUMPOOLS]; - - /* Since we only have one lifetime class of virtual arrays, only one - * linked list is necessary (for each datatype). Note that the virtual - * array control blocks being linked together are actually stored somewhere - * in the small-pool list. - */ - jvirt_sarray_ptr virt_sarray_list; - jvirt_barray_ptr virt_barray_list; - - /* This counts total space obtained from jpeg_get_small/large */ - long total_space_allocated; - - /* alloc_sarray and alloc_barray set this value for use by virtual - * array routines. - */ - JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */ -} my_memory_mgr; - -typedef my_memory_mgr * my_mem_ptr; - - -/* - * The control blocks for virtual arrays. - * Note that these blocks are allocated in the "small" pool area. - * System-dependent info for the associated backing store (if any) is hidden - * inside the backing_store_info struct. - */ - -struct jvirt_sarray_control { - JSAMPARRAY mem_buffer; /* => the in-memory buffer */ - JDIMENSION rows_in_array; /* total virtual array height */ - JDIMENSION samplesperrow; /* width of array (and of memory buffer) */ - JDIMENSION maxaccess; /* max rows accessed by access_virt_sarray */ - JDIMENSION rows_in_mem; /* height of memory buffer */ - JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ - JDIMENSION cur_start_row; /* first logical row # in the buffer */ - JDIMENSION first_undef_row; /* row # of first uninitialized row */ - boolean pre_zero; /* pre-zero mode requested? */ - boolean dirty; /* do current buffer contents need written? */ - boolean b_s_open; /* is backing-store data valid? */ - jvirt_sarray_ptr next; /* link to next virtual sarray control block */ - backing_store_info b_s_info; /* System-dependent control info */ -}; - -struct jvirt_barray_control { - JBLOCKARRAY mem_buffer; /* => the in-memory buffer */ - JDIMENSION rows_in_array; /* total virtual array height */ - JDIMENSION blocksperrow; /* width of array (and of memory buffer) */ - JDIMENSION maxaccess; /* max rows accessed by access_virt_barray */ - JDIMENSION rows_in_mem; /* height of memory buffer */ - JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ - JDIMENSION cur_start_row; /* first logical row # in the buffer */ - JDIMENSION first_undef_row; /* row # of first uninitialized row */ - boolean pre_zero; /* pre-zero mode requested? */ - boolean dirty; /* do current buffer contents need written? */ - boolean b_s_open; /* is backing-store data valid? */ - jvirt_barray_ptr next; /* link to next virtual barray control block */ - backing_store_info b_s_info; /* System-dependent control info */ -}; - - -#ifdef MEM_STATS /* optional extra stuff for statistics */ - -LOCAL(void) -print_mem_stats (j_common_ptr cinfo, int pool_id) -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - small_pool_ptr shdr_ptr; - large_pool_ptr lhdr_ptr; - - /* Since this is only a debugging stub, we can cheat a little by using - * fprintf directly rather than going through the trace message code. - * This is helpful because message parm array can't handle longs. - */ - fprintf(stderr, "Freeing pool %d, total space = %ld\n", - pool_id, mem->total_space_allocated); - - for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL; - lhdr_ptr = lhdr_ptr->hdr.next) { - fprintf(stderr, " Large chunk used %ld\n", - (long) lhdr_ptr->hdr.bytes_used); - } - - for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL; - shdr_ptr = shdr_ptr->hdr.next) { - fprintf(stderr, " Small chunk used %ld free %ld\n", - (long) shdr_ptr->hdr.bytes_used, - (long) shdr_ptr->hdr.bytes_left); - } -} - -#endif /* MEM_STATS */ - - -LOCAL(void) -out_of_memory (j_common_ptr cinfo, int which) -/* Report an out-of-memory error and stop execution */ -/* If we compiled MEM_STATS support, report alloc requests before dying */ -{ -#ifdef MEM_STATS - cinfo->err->trace_level = 2; /* force self_destruct to report stats */ -#endif - ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which); -} - - -/* - * Allocation of "small" objects. - * - * For these, we use pooled storage. When a new pool must be created, - * we try to get enough space for the current request plus a "slop" factor, - * where the slop will be the amount of leftover space in the new pool. - * The speed vs. space tradeoff is largely determined by the slop values. - * A different slop value is provided for each pool class (lifetime), - * and we also distinguish the first pool of a class from later ones. - * NOTE: the values given work fairly well on both 16- and 32-bit-int - * machines, but may be too small if longs are 64 bits or more. - */ - -static const size_t first_pool_slop[JPOOL_NUMPOOLS] = -{ - 1600, /* first PERMANENT pool */ - 16000 /* first IMAGE pool */ -}; - -static const size_t extra_pool_slop[JPOOL_NUMPOOLS] = -{ - 0, /* additional PERMANENT pools */ - 5000 /* additional IMAGE pools */ -}; - -#define MIN_SLOP 50 /* greater than 0 to avoid futile looping */ - - -METHODDEF(void *) -alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject) -/* Allocate a "small" object */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - small_pool_ptr hdr_ptr, prev_hdr_ptr; - char * data_ptr; - size_t odd_bytes, min_request, slop; - - /* Check for unsatisfiable request (do now to ensure no overflow below) */ - if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr))) - out_of_memory(cinfo, 1); /* request exceeds malloc's ability */ - - /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ - odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); - if (odd_bytes > 0) - sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; - - /* See if space is available in any existing pool */ - if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - prev_hdr_ptr = NULL; - hdr_ptr = mem->small_list[pool_id]; - while (hdr_ptr != NULL) { - if (hdr_ptr->hdr.bytes_left >= sizeofobject) - break; /* found pool with enough space */ - prev_hdr_ptr = hdr_ptr; - hdr_ptr = hdr_ptr->hdr.next; - } - - /* Time to make a new pool? */ - if (hdr_ptr == NULL) { - /* min_request is what we need now, slop is what will be leftover */ - min_request = sizeofobject + SIZEOF(small_pool_hdr); - if (prev_hdr_ptr == NULL) /* first pool in class? */ - slop = first_pool_slop[pool_id]; - else - slop = extra_pool_slop[pool_id]; - /* Don't ask for more than MAX_ALLOC_CHUNK */ - if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request)) - slop = (size_t) (MAX_ALLOC_CHUNK-min_request); - /* Try to get space, if fail reduce slop and try again */ - for (;;) { - hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop); - if (hdr_ptr != NULL) - break; - slop /= 2; - if (slop < MIN_SLOP) /* give up when it gets real small */ - out_of_memory(cinfo, 2); /* jpeg_get_small failed */ - } - mem->total_space_allocated += min_request + slop; - /* Success, initialize the new pool header and add to end of list */ - hdr_ptr->hdr.next = NULL; - hdr_ptr->hdr.bytes_used = 0; - hdr_ptr->hdr.bytes_left = sizeofobject + slop; - if (prev_hdr_ptr == NULL) /* first pool in class? */ - mem->small_list[pool_id] = hdr_ptr; - else - prev_hdr_ptr->hdr.next = hdr_ptr; - } - - /* OK, allocate the object from the current pool */ - data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */ - data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */ - hdr_ptr->hdr.bytes_used += sizeofobject; - hdr_ptr->hdr.bytes_left -= sizeofobject; - - return (void *) data_ptr; -} - - -/* - * Allocation of "large" objects. - * - * The external semantics of these are the same as "small" objects, - * except that FAR pointers are used on 80x86. However the pool - * management heuristics are quite different. We assume that each - * request is large enough that it may as well be passed directly to - * jpeg_get_large; the pool management just links everything together - * so that we can free it all on demand. - * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY - * structures. The routines that create these structures (see below) - * deliberately bunch rows together to ensure a large request size. - */ - -METHODDEF(void FAR *) -alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject) -/* Allocate a "large" object */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - large_pool_ptr hdr_ptr; - size_t odd_bytes; - - /* Check for unsatisfiable request (do now to ensure no overflow below) */ - if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr))) - out_of_memory(cinfo, 3); /* request exceeds malloc's ability */ - - /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ - odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); - if (odd_bytes > 0) - sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; - - /* Always make a new pool */ - if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - - hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject + - SIZEOF(large_pool_hdr)); - if (hdr_ptr == NULL) - out_of_memory(cinfo, 4); /* jpeg_get_large failed */ - mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr); - - /* Success, initialize the new pool header and add to list */ - hdr_ptr->hdr.next = mem->large_list[pool_id]; - /* We maintain space counts in each pool header for statistical purposes, - * even though they are not needed for allocation. - */ - hdr_ptr->hdr.bytes_used = sizeofobject; - hdr_ptr->hdr.bytes_left = 0; - mem->large_list[pool_id] = hdr_ptr; - - return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */ -} - - -/* - * Creation of 2-D sample arrays. - * The pointers are in near heap, the samples themselves in FAR heap. - * - * To minimize allocation overhead and to allow I/O of large contiguous - * blocks, we allocate the sample rows in groups of as many rows as possible - * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request. - * NB: the virtual array control routines, later in this file, know about - * this chunking of rows. The rowsperchunk value is left in the mem manager - * object so that it can be saved away if this sarray is the workspace for - * a virtual array. - */ - -METHODDEF(JSAMPARRAY) -alloc_sarray (j_common_ptr cinfo, int pool_id, - JDIMENSION samplesperrow, JDIMENSION numrows) -/* Allocate a 2-D sample array */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - JSAMPARRAY result; - JSAMPROW workspace; - JDIMENSION rowsperchunk, currow, i; - long ltemp; - - /* Calculate max # of rows allowed in one allocation chunk */ - ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / - ((long) samplesperrow * SIZEOF(JSAMPLE)); - if (ltemp <= 0) - ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); - if (ltemp < (long) numrows) - rowsperchunk = (JDIMENSION) ltemp; - else - rowsperchunk = numrows; - mem->last_rowsperchunk = rowsperchunk; - - /* Get space for row pointers (small object) */ - result = (JSAMPARRAY) alloc_small(cinfo, pool_id, - (size_t) (numrows * SIZEOF(JSAMPROW))); - - /* Get the rows themselves (large objects) */ - currow = 0; - while (currow < numrows) { - rowsperchunk = MIN(rowsperchunk, numrows - currow); - workspace = (JSAMPROW) alloc_large(cinfo, pool_id, - (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow - * SIZEOF(JSAMPLE))); - for (i = rowsperchunk; i > 0; i--) { - result[currow++] = workspace; - workspace += samplesperrow; - } - } - - return result; -} - - -/* - * Creation of 2-D coefficient-block arrays. - * This is essentially the same as the code for sample arrays, above. - */ - -METHODDEF(JBLOCKARRAY) -alloc_barray (j_common_ptr cinfo, int pool_id, - JDIMENSION blocksperrow, JDIMENSION numrows) -/* Allocate a 2-D coefficient-block array */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - JBLOCKARRAY result; - JBLOCKROW workspace; - JDIMENSION rowsperchunk, currow, i; - long ltemp; - - /* Calculate max # of rows allowed in one allocation chunk */ - ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / - ((long) blocksperrow * SIZEOF(JBLOCK)); - if (ltemp <= 0) - ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); - if (ltemp < (long) numrows) - rowsperchunk = (JDIMENSION) ltemp; - else - rowsperchunk = numrows; - mem->last_rowsperchunk = rowsperchunk; - - /* Get space for row pointers (small object) */ - result = (JBLOCKARRAY) alloc_small(cinfo, pool_id, - (size_t) (numrows * SIZEOF(JBLOCKROW))); - - /* Get the rows themselves (large objects) */ - currow = 0; - while (currow < numrows) { - rowsperchunk = MIN(rowsperchunk, numrows - currow); - workspace = (JBLOCKROW) alloc_large(cinfo, pool_id, - (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow - * SIZEOF(JBLOCK))); - for (i = rowsperchunk; i > 0; i--) { - result[currow++] = workspace; - workspace += blocksperrow; - } - } - - return result; -} - - -/* - * About virtual array management: - * - * The above "normal" array routines are only used to allocate strip buffers - * (as wide as the image, but just a few rows high). Full-image-sized buffers - * are handled as "virtual" arrays. The array is still accessed a strip at a - * time, but the memory manager must save the whole array for repeated - * accesses. The intended implementation is that there is a strip buffer in - * memory (as high as is possible given the desired memory limit), plus a - * backing file that holds the rest of the array. - * - * The request_virt_array routines are told the total size of the image and - * the maximum number of rows that will be accessed at once. The in-memory - * buffer must be at least as large as the maxaccess value. - * - * The request routines create control blocks but not the in-memory buffers. - * That is postponed until realize_virt_arrays is called. At that time the - * total amount of space needed is known (approximately, anyway), so free - * memory can be divided up fairly. - * - * The access_virt_array routines are responsible for making a specific strip - * area accessible (after reading or writing the backing file, if necessary). - * Note that the access routines are told whether the caller intends to modify - * the accessed strip; during a read-only pass this saves having to rewrite - * data to disk. The access routines are also responsible for pre-zeroing - * any newly accessed rows, if pre-zeroing was requested. - * - * In current usage, the access requests are usually for nonoverlapping - * strips; that is, successive access start_row numbers differ by exactly - * num_rows = maxaccess. This means we can get good performance with simple - * buffer dump/reload logic, by making the in-memory buffer be a multiple - * of the access height; then there will never be accesses across bufferload - * boundaries. The code will still work with overlapping access requests, - * but it doesn't handle bufferload overlaps very efficiently. - */ - - -METHODDEF(jvirt_sarray_ptr) -request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero, - JDIMENSION samplesperrow, JDIMENSION numrows, - JDIMENSION maxaccess) -/* Request a virtual 2-D sample array */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - jvirt_sarray_ptr result; - - /* Only IMAGE-lifetime virtual arrays are currently supported */ - if (pool_id != JPOOL_IMAGE) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - - /* get control block */ - result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id, - SIZEOF(struct jvirt_sarray_control)); - - result->mem_buffer = NULL; /* marks array not yet realized */ - result->rows_in_array = numrows; - result->samplesperrow = samplesperrow; - result->maxaccess = maxaccess; - result->pre_zero = pre_zero; - result->b_s_open = FALSE; /* no associated backing-store object */ - result->next = mem->virt_sarray_list; /* add to list of virtual arrays */ - mem->virt_sarray_list = result; - - return result; -} - - -METHODDEF(jvirt_barray_ptr) -request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero, - JDIMENSION blocksperrow, JDIMENSION numrows, - JDIMENSION maxaccess) -/* Request a virtual 2-D coefficient-block array */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - jvirt_barray_ptr result; - - /* Only IMAGE-lifetime virtual arrays are currently supported */ - if (pool_id != JPOOL_IMAGE) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - - /* get control block */ - result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id, - SIZEOF(struct jvirt_barray_control)); - - result->mem_buffer = NULL; /* marks array not yet realized */ - result->rows_in_array = numrows; - result->blocksperrow = blocksperrow; - result->maxaccess = maxaccess; - result->pre_zero = pre_zero; - result->b_s_open = FALSE; /* no associated backing-store object */ - result->next = mem->virt_barray_list; /* add to list of virtual arrays */ - mem->virt_barray_list = result; - - return result; -} - - -METHODDEF(void) -realize_virt_arrays (j_common_ptr cinfo) -/* Allocate the in-memory buffers for any unrealized virtual arrays */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - long space_per_minheight, maximum_space, avail_mem; - long minheights, max_minheights; - jvirt_sarray_ptr sptr; - jvirt_barray_ptr bptr; - - /* Compute the minimum space needed (maxaccess rows in each buffer) - * and the maximum space needed (full image height in each buffer). - * These may be of use to the system-dependent jpeg_mem_available routine. - */ - space_per_minheight = 0; - maximum_space = 0; - for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { - if (sptr->mem_buffer == NULL) { /* if not realized yet */ - space_per_minheight += (long) sptr->maxaccess * - (long) sptr->samplesperrow * SIZEOF(JSAMPLE); - maximum_space += (long) sptr->rows_in_array * - (long) sptr->samplesperrow * SIZEOF(JSAMPLE); - } - } - for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { - if (bptr->mem_buffer == NULL) { /* if not realized yet */ - space_per_minheight += (long) bptr->maxaccess * - (long) bptr->blocksperrow * SIZEOF(JBLOCK); - maximum_space += (long) bptr->rows_in_array * - (long) bptr->blocksperrow * SIZEOF(JBLOCK); - } - } - - if (space_per_minheight <= 0) - return; /* no unrealized arrays, no work */ - - /* Determine amount of memory to actually use; this is system-dependent. */ - avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space, - mem->total_space_allocated); - - /* If the maximum space needed is available, make all the buffers full - * height; otherwise parcel it out with the same number of minheights - * in each buffer. - */ - if (avail_mem >= maximum_space) - max_minheights = 1000000000L; - else { - max_minheights = avail_mem / space_per_minheight; - /* If there doesn't seem to be enough space, try to get the minimum - * anyway. This allows a "stub" implementation of jpeg_mem_available(). - */ - if (max_minheights <= 0) - max_minheights = 1; - } - - /* Allocate the in-memory buffers and initialize backing store as needed. */ - - for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { - if (sptr->mem_buffer == NULL) { /* if not realized yet */ - minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L; - if (minheights <= max_minheights) { - /* This buffer fits in memory */ - sptr->rows_in_mem = sptr->rows_in_array; - } else { - /* It doesn't fit in memory, create backing store. */ - sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess); - jpeg_open_backing_store(cinfo, & sptr->b_s_info, - (long) sptr->rows_in_array * - (long) sptr->samplesperrow * - (long) SIZEOF(JSAMPLE)); - sptr->b_s_open = TRUE; - } - sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE, - sptr->samplesperrow, sptr->rows_in_mem); - sptr->rowsperchunk = mem->last_rowsperchunk; - sptr->cur_start_row = 0; - sptr->first_undef_row = 0; - sptr->dirty = FALSE; - } - } - - for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { - if (bptr->mem_buffer == NULL) { /* if not realized yet */ - minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L; - if (minheights <= max_minheights) { - /* This buffer fits in memory */ - bptr->rows_in_mem = bptr->rows_in_array; - } else { - /* It doesn't fit in memory, create backing store. */ - bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess); - jpeg_open_backing_store(cinfo, & bptr->b_s_info, - (long) bptr->rows_in_array * - (long) bptr->blocksperrow * - (long) SIZEOF(JBLOCK)); - bptr->b_s_open = TRUE; - } - bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE, - bptr->blocksperrow, bptr->rows_in_mem); - bptr->rowsperchunk = mem->last_rowsperchunk; - bptr->cur_start_row = 0; - bptr->first_undef_row = 0; - bptr->dirty = FALSE; - } - } -} - - -LOCAL(void) -do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing) -/* Do backing store read or write of a virtual sample array */ -{ - long bytesperrow, file_offset, byte_count, rows, thisrow, i; - - bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE); - file_offset = ptr->cur_start_row * bytesperrow; - /* Loop to read or write each allocation chunk in mem_buffer */ - for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { - /* One chunk, but check for short chunk at end of buffer */ - rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); - /* Transfer no more than is currently defined */ - thisrow = (long) ptr->cur_start_row + i; - rows = MIN(rows, (long) ptr->first_undef_row - thisrow); - /* Transfer no more than fits in file */ - rows = MIN(rows, (long) ptr->rows_in_array - thisrow); - if (rows <= 0) /* this chunk might be past end of file! */ - break; - byte_count = rows * bytesperrow; - if (writing) - (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, - (void FAR *) ptr->mem_buffer[i], - file_offset, byte_count); - else - (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, - (void FAR *) ptr->mem_buffer[i], - file_offset, byte_count); - file_offset += byte_count; - } -} - - -LOCAL(void) -do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing) -/* Do backing store read or write of a virtual coefficient-block array */ -{ - long bytesperrow, file_offset, byte_count, rows, thisrow, i; - - bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK); - file_offset = ptr->cur_start_row * bytesperrow; - /* Loop to read or write each allocation chunk in mem_buffer */ - for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { - /* One chunk, but check for short chunk at end of buffer */ - rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); - /* Transfer no more than is currently defined */ - thisrow = (long) ptr->cur_start_row + i; - rows = MIN(rows, (long) ptr->first_undef_row - thisrow); - /* Transfer no more than fits in file */ - rows = MIN(rows, (long) ptr->rows_in_array - thisrow); - if (rows <= 0) /* this chunk might be past end of file! */ - break; - byte_count = rows * bytesperrow; - if (writing) - (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, - (void FAR *) ptr->mem_buffer[i], - file_offset, byte_count); - else - (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, - (void FAR *) ptr->mem_buffer[i], - file_offset, byte_count); - file_offset += byte_count; - } -} - - -METHODDEF(JSAMPARRAY) -access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr, - JDIMENSION start_row, JDIMENSION num_rows, - boolean writable) -/* Access the part of a virtual sample array starting at start_row */ -/* and extending for num_rows rows. writable is true if */ -/* caller intends to modify the accessed area. */ -{ - JDIMENSION end_row = start_row + num_rows; - JDIMENSION undef_row; - - /* debugging check */ - if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || - ptr->mem_buffer == NULL) - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - - /* Make the desired part of the virtual array accessible */ - if (start_row < ptr->cur_start_row || - end_row > ptr->cur_start_row+ptr->rows_in_mem) { - if (! ptr->b_s_open) - ERREXIT(cinfo, JERR_VIRTUAL_BUG); - /* Flush old buffer contents if necessary */ - if (ptr->dirty) { - do_sarray_io(cinfo, ptr, TRUE); - ptr->dirty = FALSE; - } - /* Decide what part of virtual array to access. - * Algorithm: if target address > current window, assume forward scan, - * load starting at target address. If target address < current window, - * assume backward scan, load so that target area is top of window. - * Note that when switching from forward write to forward read, will have - * start_row = 0, so the limiting case applies and we load from 0 anyway. - */ - if (start_row > ptr->cur_start_row) { - ptr->cur_start_row = start_row; - } else { - /* use long arithmetic here to avoid overflow & unsigned problems */ - long ltemp; - - ltemp = (long) end_row - (long) ptr->rows_in_mem; - if (ltemp < 0) - ltemp = 0; /* don't fall off front end of file */ - ptr->cur_start_row = (JDIMENSION) ltemp; - } - /* Read in the selected part of the array. - * During the initial write pass, we will do no actual read - * because the selected part is all undefined. - */ - do_sarray_io(cinfo, ptr, FALSE); - } - /* Ensure the accessed part of the array is defined; prezero if needed. - * To improve locality of access, we only prezero the part of the array - * that the caller is about to access, not the entire in-memory array. - */ - if (ptr->first_undef_row < end_row) { - if (ptr->first_undef_row < start_row) { - if (writable) /* writer skipped over a section of array */ - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - undef_row = start_row; /* but reader is allowed to read ahead */ - } else { - undef_row = ptr->first_undef_row; - } - if (writable) - ptr->first_undef_row = end_row; - if (ptr->pre_zero) { - size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE); - undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ - end_row -= ptr->cur_start_row; - while (undef_row < end_row) { - jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); - undef_row++; - } - } else { - if (! writable) /* reader looking at undefined data */ - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - } - } - /* Flag the buffer dirty if caller will write in it */ - if (writable) - ptr->dirty = TRUE; - /* Return address of proper part of the buffer */ - return ptr->mem_buffer + (start_row - ptr->cur_start_row); -} - - -METHODDEF(JBLOCKARRAY) -access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr, - JDIMENSION start_row, JDIMENSION num_rows, - boolean writable) -/* Access the part of a virtual block array starting at start_row */ -/* and extending for num_rows rows. writable is true if */ -/* caller intends to modify the accessed area. */ -{ - JDIMENSION end_row = start_row + num_rows; - JDIMENSION undef_row; - - /* debugging check */ - if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || - ptr->mem_buffer == NULL) - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - - /* Make the desired part of the virtual array accessible */ - if (start_row < ptr->cur_start_row || - end_row > ptr->cur_start_row+ptr->rows_in_mem) { - if (! ptr->b_s_open) - ERREXIT(cinfo, JERR_VIRTUAL_BUG); - /* Flush old buffer contents if necessary */ - if (ptr->dirty) { - do_barray_io(cinfo, ptr, TRUE); - ptr->dirty = FALSE; - } - /* Decide what part of virtual array to access. - * Algorithm: if target address > current window, assume forward scan, - * load starting at target address. If target address < current window, - * assume backward scan, load so that target area is top of window. - * Note that when switching from forward write to forward read, will have - * start_row = 0, so the limiting case applies and we load from 0 anyway. - */ - if (start_row > ptr->cur_start_row) { - ptr->cur_start_row = start_row; - } else { - /* use long arithmetic here to avoid overflow & unsigned problems */ - long ltemp; - - ltemp = (long) end_row - (long) ptr->rows_in_mem; - if (ltemp < 0) - ltemp = 0; /* don't fall off front end of file */ - ptr->cur_start_row = (JDIMENSION) ltemp; - } - /* Read in the selected part of the array. - * During the initial write pass, we will do no actual read - * because the selected part is all undefined. - */ - do_barray_io(cinfo, ptr, FALSE); - } - /* Ensure the accessed part of the array is defined; prezero if needed. - * To improve locality of access, we only prezero the part of the array - * that the caller is about to access, not the entire in-memory array. - */ - if (ptr->first_undef_row < end_row) { - if (ptr->first_undef_row < start_row) { - if (writable) /* writer skipped over a section of array */ - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - undef_row = start_row; /* but reader is allowed to read ahead */ - } else { - undef_row = ptr->first_undef_row; - } - if (writable) - ptr->first_undef_row = end_row; - if (ptr->pre_zero) { - size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK); - undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ - end_row -= ptr->cur_start_row; - while (undef_row < end_row) { - jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); - undef_row++; - } - } else { - if (! writable) /* reader looking at undefined data */ - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - } - } - /* Flag the buffer dirty if caller will write in it */ - if (writable) - ptr->dirty = TRUE; - /* Return address of proper part of the buffer */ - return ptr->mem_buffer + (start_row - ptr->cur_start_row); -} - - -/* - * Release all objects belonging to a specified pool. - */ - -METHODDEF(void) -free_pool (j_common_ptr cinfo, int pool_id) -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - small_pool_ptr shdr_ptr; - large_pool_ptr lhdr_ptr; - size_t space_freed; - - if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - -#ifdef MEM_STATS - if (cinfo->err->trace_level > 1) - print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */ -#endif - - /* If freeing IMAGE pool, close any virtual arrays first */ - if (pool_id == JPOOL_IMAGE) { - jvirt_sarray_ptr sptr; - jvirt_barray_ptr bptr; - - for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { - if (sptr->b_s_open) { /* there may be no backing store */ - sptr->b_s_open = FALSE; /* prevent recursive close if error */ - (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info); - } - } - mem->virt_sarray_list = NULL; - for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { - if (bptr->b_s_open) { /* there may be no backing store */ - bptr->b_s_open = FALSE; /* prevent recursive close if error */ - (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info); - } - } - mem->virt_barray_list = NULL; - } - - /* Release large objects */ - lhdr_ptr = mem->large_list[pool_id]; - mem->large_list[pool_id] = NULL; - - while (lhdr_ptr != NULL) { - large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next; - space_freed = lhdr_ptr->hdr.bytes_used + - lhdr_ptr->hdr.bytes_left + - SIZEOF(large_pool_hdr); - jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed); - mem->total_space_allocated -= space_freed; - lhdr_ptr = next_lhdr_ptr; - } - - /* Release small objects */ - shdr_ptr = mem->small_list[pool_id]; - mem->small_list[pool_id] = NULL; - - while (shdr_ptr != NULL) { - small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next; - space_freed = shdr_ptr->hdr.bytes_used + - shdr_ptr->hdr.bytes_left + - SIZEOF(small_pool_hdr); - jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed); - mem->total_space_allocated -= space_freed; - shdr_ptr = next_shdr_ptr; - } -} - - -/* - * Close up shop entirely. - * Note that this cannot be called unless cinfo->mem is non-NULL. - */ - -METHODDEF(void) -self_destruct (j_common_ptr cinfo) -{ - int pool; - - /* Close all backing store, release all memory. - * Releasing pools in reverse order might help avoid fragmentation - * with some (brain-damaged) malloc libraries. - */ - for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { - free_pool(cinfo, pool); - } - - /* Release the memory manager control block too. */ - jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr)); - cinfo->mem = NULL; /* ensures I will be called only once */ - - jpeg_mem_term(cinfo); /* system-dependent cleanup */ -} - - -/* - * Memory manager initialization. - * When this is called, only the error manager pointer is valid in cinfo! - */ - -GLOBAL(void) -jinit_memory_mgr (j_common_ptr cinfo) -{ - my_mem_ptr mem; - long max_to_use; - int pool; - size_t test_mac; - - cinfo->mem = NULL; /* for safety if init fails */ - - /* Check for configuration errors. - * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably - * doesn't reflect any real hardware alignment requirement. - * The test is a little tricky: for X>0, X and X-1 have no one-bits - * in common if and only if X is a power of 2, ie has only one one-bit. - * Some compilers may give an "unreachable code" warning here; ignore it. - */ - if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0) - ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE); - /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be - * a multiple of SIZEOF(ALIGN_TYPE). - * Again, an "unreachable code" warning may be ignored here. - * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK. - */ - test_mac = (size_t) MAX_ALLOC_CHUNK; - if ((long) test_mac != MAX_ALLOC_CHUNK || - (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0) - ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); - - max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */ - - /* Attempt to allocate memory manager's control block */ - mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr)); - - if (mem == NULL) { - jpeg_mem_term(cinfo); /* system-dependent cleanup */ - ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0); - } - - /* OK, fill in the method pointers */ - mem->pub.alloc_small = alloc_small; - mem->pub.alloc_large = alloc_large; - mem->pub.alloc_sarray = alloc_sarray; - mem->pub.alloc_barray = alloc_barray; - mem->pub.request_virt_sarray = request_virt_sarray; - mem->pub.request_virt_barray = request_virt_barray; - mem->pub.realize_virt_arrays = realize_virt_arrays; - mem->pub.access_virt_sarray = access_virt_sarray; - mem->pub.access_virt_barray = access_virt_barray; - mem->pub.free_pool = free_pool; - mem->pub.self_destruct = self_destruct; - - /* Make MAX_ALLOC_CHUNK accessible to other modules */ - mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK; - - /* Initialize working state */ - mem->pub.max_memory_to_use = max_to_use; - - for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { - mem->small_list[pool] = NULL; - mem->large_list[pool] = NULL; - } - mem->virt_sarray_list = NULL; - mem->virt_barray_list = NULL; - - mem->total_space_allocated = SIZEOF(my_memory_mgr); - - /* Declare ourselves open for business */ - cinfo->mem = & mem->pub; - - /* Check for an environment variable JPEGMEM; if found, override the - * default max_memory setting from jpeg_mem_init. Note that the - * surrounding application may again override this value. - * If your system doesn't support getenv(), define NO_GETENV to disable - * this feature. - */ -#ifndef NO_GETENV - { char * memenv; - - if ((memenv = getenv("JPEGMEM")) != NULL) { - char ch = 'x'; - - if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) { - if (ch == 'm' || ch == 'M') - max_to_use *= 1000L; - mem->pub.max_memory_to_use = max_to_use * 1000L; - } - } - } -#endif - -} diff --git a/src/SFML/Graphics/libjpeg/jmemnobs.c b/src/SFML/Graphics/libjpeg/jmemnobs.c deleted file mode 100644 index 6aa1e929..00000000 --- a/src/SFML/Graphics/libjpeg/jmemnobs.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * jmemnobs.c - * - * Copyright (C) 1992-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file provides a really simple implementation of the system- - * dependent portion of the JPEG memory manager. This implementation - * assumes that no backing-store files are needed: all required space - * can be obtained from malloc(). - * This is very portable in the sense that it'll compile on almost anything, - * but you'd better have lots of main memory (or virtual memory) if you want - * to process big images. - * Note that the max_memory_to_use option is ignored by this implementation. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jmemsys.h" /* import the system-dependent declarations */ - -#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ -extern void * malloc JPP((size_t size)); -extern void free JPP((void *ptr)); -#endif - - -/* - * Memory allocation and freeing are controlled by the regular library - * routines malloc() and free(). - */ - -GLOBAL(void *) -jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void *) malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) -{ - free(object); -} - - -/* - * "Large" objects are treated the same as "small" ones. - * NB: although we include FAR keywords in the routine declarations, - * this file won't actually work in 80x86 small/medium model; at least, - * you probably won't be able to process useful-size images in only 64KB. - */ - -GLOBAL(void FAR *) -jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) -{ - return (void FAR *) malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) -{ - free(object); -} - - -/* - * This routine computes the total memory space available for allocation. - * Here we always say, "we got all you want bud!" - */ - -GLOBAL(long) -jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, - long max_bytes_needed, long already_allocated) -{ - return max_bytes_needed; -} - - -/* - * Backing store (temporary file) management. - * Since jpeg_mem_available always promised the moon, - * this should never be called and we can just error out. - */ - -GLOBAL(void) -jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, - long total_bytes_needed) -{ - ERREXIT(cinfo, JERR_NO_BACKING_STORE); -} - - -/* - * These routines take care of any system-dependent initialization and - * cleanup required. Here, there isn't any. - */ - -GLOBAL(long) -jpeg_mem_init (j_common_ptr cinfo) -{ - return 0; /* just set max_memory_to_use to 0 */ -} - -GLOBAL(void) -jpeg_mem_term (j_common_ptr cinfo) -{ - /* no work */ -} diff --git a/src/SFML/Graphics/libjpeg/jmemsys.h b/src/SFML/Graphics/libjpeg/jmemsys.h deleted file mode 100644 index 2a879611..00000000 --- a/src/SFML/Graphics/libjpeg/jmemsys.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * jmemsys.h - * - * Copyright (C) 1992-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This include file defines the interface between the system-independent - * and system-dependent portions of the JPEG memory manager. No other - * modules need include it. (The system-independent portion is jmemmgr.c; - * there are several different versions of the system-dependent portion.) - * - * This file works as-is for the system-dependent memory managers supplied - * in the IJG distribution. You may need to modify it if you write a - * custom memory manager. If system-dependent changes are needed in - * this file, the best method is to #ifdef them based on a configuration - * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR - * and USE_MAC_MEMMGR. - */ - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_get_small jGetSmall -#define jpeg_free_small jFreeSmall -#define jpeg_get_large jGetLarge -#define jpeg_free_large jFreeLarge -#define jpeg_mem_available jMemAvail -#define jpeg_open_backing_store jOpenBackStore -#define jpeg_mem_init jMemInit -#define jpeg_mem_term jMemTerm -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* - * These two functions are used to allocate and release small chunks of - * memory. (Typically the total amount requested through jpeg_get_small is - * no more than 20K or so; this will be requested in chunks of a few K each.) - * Behavior should be the same as for the standard library functions malloc - * and free; in particular, jpeg_get_small must return NULL on failure. - * On most systems, these ARE malloc and free. jpeg_free_small is passed the - * size of the object being freed, just in case it's needed. - * On an 80x86 machine using small-data memory model, these manage near heap. - */ - -EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject)); -EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object, - size_t sizeofobject)); - -/* - * These two functions are used to allocate and release large chunks of - * memory (up to the total free space designated by jpeg_mem_available). - * The interface is the same as above, except that on an 80x86 machine, - * far pointers are used. On most other machines these are identical to - * the jpeg_get/free_small routines; but we keep them separate anyway, - * in case a different allocation strategy is desirable for large chunks. - */ - -EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo, - size_t sizeofobject)); -EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object, - size_t sizeofobject)); - -/* - * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may - * be requested in a single call to jpeg_get_large (and jpeg_get_small for that - * matter, but that case should never come into play). This macro is needed - * to model the 64Kb-segment-size limit of far addressing on 80x86 machines. - * On those machines, we expect that jconfig.h will provide a proper value. - * On machines with 32-bit flat address spaces, any large constant may be used. - * - * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type - * size_t and will be a multiple of sizeof(align_type). - */ - -#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */ -#define MAX_ALLOC_CHUNK 1000000000L -#endif - -/* - * This routine computes the total space still available for allocation by - * jpeg_get_large. If more space than this is needed, backing store will be - * used. NOTE: any memory already allocated must not be counted. - * - * There is a minimum space requirement, corresponding to the minimum - * feasible buffer sizes; jmemmgr.c will request that much space even if - * jpeg_mem_available returns zero. The maximum space needed, enough to hold - * all working storage in memory, is also passed in case it is useful. - * Finally, the total space already allocated is passed. If no better - * method is available, cinfo->mem->max_memory_to_use - already_allocated - * is often a suitable calculation. - * - * It is OK for jpeg_mem_available to underestimate the space available - * (that'll just lead to more backing-store access than is really necessary). - * However, an overestimate will lead to failure. Hence it's wise to subtract - * a slop factor from the true available space. 5% should be enough. - * - * On machines with lots of virtual memory, any large constant may be returned. - * Conversely, zero may be returned to always use the minimum amount of memory. - */ - -EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo, - long min_bytes_needed, - long max_bytes_needed, - long already_allocated)); - - -/* - * This structure holds whatever state is needed to access a single - * backing-store object. The read/write/close method pointers are called - * by jmemmgr.c to manipulate the backing-store object; all other fields - * are private to the system-dependent backing store routines. - */ - -#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */ - - -#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */ - -typedef unsigned short XMSH; /* type of extended-memory handles */ -typedef unsigned short EMSH; /* type of expanded-memory handles */ - -typedef union { - short file_handle; /* DOS file handle if it's a temp file */ - XMSH xms_handle; /* handle if it's a chunk of XMS */ - EMSH ems_handle; /* handle if it's a chunk of EMS */ -} handle_union; - -#endif /* USE_MSDOS_MEMMGR */ - -#ifdef USE_MAC_MEMMGR /* Mac-specific junk */ -#include -#endif /* USE_MAC_MEMMGR */ - - -typedef struct backing_store_struct * backing_store_ptr; - -typedef struct backing_store_struct { - /* Methods for reading/writing/closing this backing-store object */ - JMETHOD(void, read_backing_store, (j_common_ptr cinfo, - backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count)); - JMETHOD(void, write_backing_store, (j_common_ptr cinfo, - backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count)); - JMETHOD(void, close_backing_store, (j_common_ptr cinfo, - backing_store_ptr info)); - - /* Private fields for system-dependent backing-store management */ -#ifdef USE_MSDOS_MEMMGR - /* For the MS-DOS manager (jmemdos.c), we need: */ - handle_union handle; /* reference to backing-store storage object */ - char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ -#else -#ifdef USE_MAC_MEMMGR - /* For the Mac manager (jmemmac.c), we need: */ - short temp_file; /* file reference number to temp file */ - FSSpec tempSpec; /* the FSSpec for the temp file */ - char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ -#else - /* For a typical implementation with temp files, we need: */ - FILE * temp_file; /* stdio reference to temp file */ - char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ -#endif -#endif -} backing_store_info; - - -/* - * Initial opening of a backing-store object. This must fill in the - * read/write/close pointers in the object. The read/write routines - * may take an error exit if the specified maximum file size is exceeded. - * (If jpeg_mem_available always returns a large value, this routine can - * just take an error exit.) - */ - -EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo, - backing_store_ptr info, - long total_bytes_needed)); - - -/* - * These routines take care of any system-dependent initialization and - * cleanup required. jpeg_mem_init will be called before anything is - * allocated (and, therefore, nothing in cinfo is of use except the error - * manager pointer). It should return a suitable default value for - * max_memory_to_use; this may subsequently be overridden by the surrounding - * application. (Note that max_memory_to_use is only important if - * jpeg_mem_available chooses to consult it ... no one else will.) - * jpeg_mem_term may assume that all requested memory has been freed and that - * all opened backing-store objects have been closed. - */ - -EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo)); diff --git a/src/SFML/Graphics/libjpeg/jpegint.h b/src/SFML/Graphics/libjpeg/jpegint.h deleted file mode 100644 index 685a3610..00000000 --- a/src/SFML/Graphics/libjpeg/jpegint.h +++ /dev/null @@ -1,392 +0,0 @@ -/* - * jpegint.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file provides common declarations for the various JPEG modules. - * These declarations are considered internal to the JPEG library; most - * applications using the library shouldn't need to include this file. - */ - - -/* Declarations for both compression & decompression */ - -typedef enum { /* Operating modes for buffer controllers */ - JBUF_PASS_THRU, /* Plain stripwise operation */ - /* Remaining modes require a full-image buffer to have been created */ - JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ - JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ - JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ -} J_BUF_MODE; - -/* Values of global_state field (jdapi.c has some dependencies on ordering!) */ -#define CSTATE_START 100 /* after create_compress */ -#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ -#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ -#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ -#define DSTATE_START 200 /* after create_decompress */ -#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ -#define DSTATE_READY 202 /* found SOS, ready for start_decompress */ -#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ -#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ -#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ -#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ -#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ -#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ -#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ -#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ - - -/* Declarations for compression modules */ - -/* Master control module */ -struct jpeg_comp_master { - JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); - JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); - JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); - - /* State variables made visible to other modules */ - boolean call_pass_startup; /* True if pass_startup must be called */ - boolean is_last_pass; /* True during last pass */ -}; - -/* Main buffer control (downsampled-data buffer) */ -struct jpeg_c_main_controller { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, process_data, (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail)); -}; - -/* Compression preprocessing (downsampling input buffer control) */ -struct jpeg_c_prep_controller { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, - JSAMPARRAY input_buf, - JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail, - JSAMPIMAGE output_buf, - JDIMENSION *out_row_group_ctr, - JDIMENSION out_row_groups_avail)); -}; - -/* Coefficient buffer control */ -struct jpeg_c_coef_controller { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, - JSAMPIMAGE input_buf)); -}; - -/* Colorspace conversion */ -struct jpeg_color_converter { - JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - JMETHOD(void, color_convert, (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows)); -}; - -/* Downsampling */ -struct jpeg_downsampler { - JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - JMETHOD(void, downsample, (j_compress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_index, - JSAMPIMAGE output_buf, - JDIMENSION out_row_group_index)); - - boolean need_context_rows; /* TRUE if need rows above & below */ -}; - -/* Forward DCT (also controls coefficient quantization) */ -struct jpeg_forward_dct { - JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - /* perhaps this should be an array??? */ - JMETHOD(void, forward_DCT, (j_compress_ptr cinfo, - jpeg_component_info * compptr, - JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks)); -}; - -/* Entropy encoding */ -struct jpeg_entropy_encoder { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics)); - JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data)); - JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); -}; - -/* Marker writing */ -struct jpeg_marker_writer { - JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); - JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); - JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); - JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); - JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); - /* These routines are exported to allow insertion of extra markers */ - /* Probably only COM and APPn markers should be written this way */ - JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker, - unsigned int datalen)); - JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val)); -}; - - -/* Declarations for decompression modules */ - -/* Master control module */ -struct jpeg_decomp_master { - JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); - - /* State variables made visible to other modules */ - boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ -}; - -/* Input control module */ -struct jpeg_input_controller { - JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); - JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); - JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); - - /* State variables made visible to other modules */ - boolean has_multiple_scans; /* True if file has multiple scans */ - boolean eoi_reached; /* True when EOI has been consumed */ -}; - -/* Main buffer control (downsampled-data buffer) */ -struct jpeg_d_main_controller { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, process_data, (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -}; - -/* Coefficient buffer control */ -struct jpeg_d_coef_controller { - JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); - JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); - JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); - JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, - JSAMPIMAGE output_buf)); - /* Pointer to array of coefficient virtual arrays, or NULL if none */ - jvirt_barray_ptr *coef_arrays; -}; - -/* Decompression postprocessing (color quantization buffer control) */ -struct jpeg_d_post_controller { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, - JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -}; - -/* Marker reading & parsing */ -struct jpeg_marker_reader { - JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); - /* Read markers until SOS or EOI. - * Returns same codes as are defined for jpeg_consume_input: - * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. - */ - JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); - /* Read a restart marker --- exported for use by entropy decoder only */ - jpeg_marker_parser_method read_restart_marker; - - /* State of marker reader --- nominally internal, but applications - * supplying COM or APPn handlers might like to know the state. - */ - boolean saw_SOI; /* found SOI? */ - boolean saw_SOF; /* found SOF? */ - int next_restart_num; /* next restart number expected (0-7) */ - unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ -}; - -/* Entropy decoding */ -struct jpeg_entropy_decoder { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); - - /* This is here to share code between baseline and progressive decoders; */ - /* other modules probably should not use it */ - boolean insufficient_data; /* set TRUE after emitting warning */ -}; - -/* Inverse DCT (also performs dequantization) */ -typedef JMETHOD(void, inverse_DCT_method_ptr, - (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col)); - -struct jpeg_inverse_dct { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - /* It is useful to allow each component to have a separate IDCT method. */ - inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS]; -}; - -/* Upsampling (note that upsampler must also call color converter) */ -struct jpeg_upsampler { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, upsample, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, - JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); - - boolean need_context_rows; /* TRUE if need rows above & below */ -}; - -/* Colorspace conversion */ -struct jpeg_color_deconverter { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, color_convert, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows)); -}; - -/* Color quantization or color precision reduction */ -struct jpeg_color_quantizer { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); - JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPARRAY output_buf, - int num_rows)); - JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); -}; - - -/* Miscellaneous useful macros */ - -#undef MAX -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#undef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - - -/* We assume that right shift corresponds to signed division by 2 with - * rounding towards minus infinity. This is correct for typical "arithmetic - * shift" instructions that shift in copies of the sign bit. But some - * C compilers implement >> with an unsigned shift. For these machines you - * must define RIGHT_SHIFT_IS_UNSIGNED. - * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. - * It is only applied with constant shift counts. SHIFT_TEMPS must be - * included in the variables of any routine using RIGHT_SHIFT. - */ - -#ifdef RIGHT_SHIFT_IS_UNSIGNED -#define SHIFT_TEMPS INT32 shift_temp; -#define RIGHT_SHIFT(x,shft) \ - ((shift_temp = (x)) < 0 ? \ - (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ - (shift_temp >> (shft))) -#else -#define SHIFT_TEMPS -#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jinit_compress_master jICompress -#define jinit_c_master_control jICMaster -#define jinit_c_main_controller jICMainC -#define jinit_c_prep_controller jICPrepC -#define jinit_c_coef_controller jICCoefC -#define jinit_color_converter jICColor -#define jinit_downsampler jIDownsampler -#define jinit_forward_dct jIFDCT -#define jinit_huff_encoder jIHEncoder -#define jinit_phuff_encoder jIPHEncoder -#define jinit_marker_writer jIMWriter -#define jinit_master_decompress jIDMaster -#define jinit_d_main_controller jIDMainC -#define jinit_d_coef_controller jIDCoefC -#define jinit_d_post_controller jIDPostC -#define jinit_input_controller jIInCtlr -#define jinit_marker_reader jIMReader -#define jinit_huff_decoder jIHDecoder -#define jinit_phuff_decoder jIPHDecoder -#define jinit_inverse_dct jIIDCT -#define jinit_upsampler jIUpsampler -#define jinit_color_deconverter jIDColor -#define jinit_1pass_quantizer jI1Quant -#define jinit_2pass_quantizer jI2Quant -#define jinit_merged_upsampler jIMUpsampler -#define jinit_memory_mgr jIMemMgr -#define jdiv_round_up jDivRound -#define jround_up jRound -#define jcopy_sample_rows jCopySamples -#define jcopy_block_row jCopyBlocks -#define jzero_far jZeroFar -#define jpeg_zigzag_order jZIGTable -#define jpeg_natural_order jZAGTable -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Compression module initialization routines */ -EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, - boolean transcode_only)); -EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); -/* Decompression module initialization routines */ -EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); -/* Memory manager initialization */ -EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); - -/* Utility routines in jutils.c */ -EXTERN(long) jdiv_round_up JPP((long a, long b)); -EXTERN(long) jround_up JPP((long a, long b)); -EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, - JSAMPARRAY output_array, int dest_row, - int num_rows, JDIMENSION num_cols)); -EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, - JDIMENSION num_blocks)); -EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); -/* Constant tables in jutils.c */ -#if 0 /* This table is not actually needed in v6a */ -extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ -#endif -extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ - -/* Suppress undefined-structure complaints if necessary. */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -#endif -#endif /* INCOMPLETE_TYPES_BROKEN */ diff --git a/src/SFML/Graphics/libjpeg/jquant1.c b/src/SFML/Graphics/libjpeg/jquant1.c deleted file mode 100644 index aaa34a18..00000000 --- a/src/SFML/Graphics/libjpeg/jquant1.c +++ /dev/null @@ -1,856 +0,0 @@ -/* - * jquant1.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains 1-pass color quantization (color mapping) routines. - * These routines provide mapping to a fixed color map using equally spaced - * color values. Optional Floyd-Steinberg or ordered dithering is available. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - -#ifdef QUANT_1PASS_SUPPORTED - - -/* - * The main purpose of 1-pass quantization is to provide a fast, if not very - * high quality, colormapped output capability. A 2-pass quantizer usually - * gives better visual quality; however, for quantized grayscale output this - * quantizer is perfectly adequate. Dithering is highly recommended with this - * quantizer, though you can turn it off if you really want to. - * - * In 1-pass quantization the colormap must be chosen in advance of seeing the - * image. We use a map consisting of all combinations of Ncolors[i] color - * values for the i'th component. The Ncolors[] values are chosen so that - * their product, the total number of colors, is no more than that requested. - * (In most cases, the product will be somewhat less.) - * - * Since the colormap is orthogonal, the representative value for each color - * component can be determined without considering the other components; - * then these indexes can be combined into a colormap index by a standard - * N-dimensional-array-subscript calculation. Most of the arithmetic involved - * can be precalculated and stored in the lookup table colorindex[]. - * colorindex[i][j] maps pixel value j in component i to the nearest - * representative value (grid plane) for that component; this index is - * multiplied by the array stride for component i, so that the - * index of the colormap entry closest to a given pixel value is just - * sum( colorindex[component-number][pixel-component-value] ) - * Aside from being fast, this scheme allows for variable spacing between - * representative values with no additional lookup cost. - * - * If gamma correction has been applied in color conversion, it might be wise - * to adjust the color grid spacing so that the representative colors are - * equidistant in linear space. At this writing, gamma correction is not - * implemented by jdcolor, so nothing is done here. - */ - - -/* Declarations for ordered dithering. - * - * We use a standard 16x16 ordered dither array. The basic concept of ordered - * dithering is described in many references, for instance Dale Schumacher's - * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991). - * In place of Schumacher's comparisons against a "threshold" value, we add a - * "dither" value to the input pixel and then round the result to the nearest - * output value. The dither value is equivalent to (0.5 - threshold) times - * the distance between output values. For ordered dithering, we assume that - * the output colors are equally spaced; if not, results will probably be - * worse, since the dither may be too much or too little at a given point. - * - * The normal calculation would be to form pixel value + dither, range-limit - * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual. - * We can skip the separate range-limiting step by extending the colorindex - * table in both directions. - */ - -#define ODITHER_SIZE 16 /* dimension of dither matrix */ -/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */ -#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE) /* # cells in matrix */ -#define ODITHER_MASK (ODITHER_SIZE-1) /* mask for wrapping around counters */ - -typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE]; -typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE]; - -static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = { - /* Bayer's order-4 dither array. Generated by the code given in - * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I. - * The values in this array must range from 0 to ODITHER_CELLS-1. - */ - { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 }, - { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 }, - { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 }, - { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 }, - { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 }, - { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 }, - { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 }, - { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 }, - { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 }, - { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 }, - { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 }, - { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 }, - { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 }, - { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 }, - { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 }, - { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 } -}; - - -/* Declarations for Floyd-Steinberg dithering. - * - * Errors are accumulated into the array fserrors[], at a resolution of - * 1/16th of a pixel count. The error at a given pixel is propagated - * to its not-yet-processed neighbors using the standard F-S fractions, - * ... (here) 7/16 - * 3/16 5/16 1/16 - * We work left-to-right on even rows, right-to-left on odd rows. - * - * We can get away with a single array (holding one row's worth of errors) - * by using it to store the current row's errors at pixel columns not yet - * processed, but the next row's errors at columns already processed. We - * need only a few extra variables to hold the errors immediately around the - * current column. (If we are lucky, those variables are in registers, but - * even if not, they're probably cheaper to access than array elements are.) - * - * The fserrors[] array is indexed [component#][position]. - * We provide (#columns + 2) entries per component; the extra entry at each - * end saves us from special-casing the first and last pixels. - * - * Note: on a wide image, we might not have enough room in a PC's near data - * segment to hold the error array; so it is allocated with alloc_large. - */ - -#if BITS_IN_JSAMPLE == 8 -typedef INT16 FSERROR; /* 16 bits should be enough */ -typedef int LOCFSERROR; /* use 'int' for calculation temps */ -#else -typedef INT32 FSERROR; /* may need more than 16 bits */ -typedef INT32 LOCFSERROR; /* be sure calculation temps are big enough */ -#endif - -typedef FSERROR FAR *FSERRPTR; /* pointer to error array (in FAR storage!) */ - - -/* Private subobject */ - -#define MAX_Q_COMPS 4 /* max components I can handle */ - -typedef struct { - struct jpeg_color_quantizer pub; /* public fields */ - - /* Initially allocated colormap is saved here */ - JSAMPARRAY sv_colormap; /* The color map as a 2-D pixel array */ - int sv_actual; /* number of entries in use */ - - JSAMPARRAY colorindex; /* Precomputed mapping for speed */ - /* colorindex[i][j] = index of color closest to pixel value j in component i, - * premultiplied as described above. Since colormap indexes must fit into - * JSAMPLEs, the entries of this array will too. - */ - boolean is_padded; /* is the colorindex padded for odither? */ - - int Ncolors[MAX_Q_COMPS]; /* # of values alloced to each component */ - - /* Variables for ordered dithering */ - int row_index; /* cur row's vertical index in dither matrix */ - ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */ - - /* Variables for Floyd-Steinberg dithering */ - FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */ - boolean on_odd_row; /* flag to remember which row we are on */ -} my_cquantizer; - -typedef my_cquantizer * my_cquantize_ptr; - - -/* - * Policy-making subroutines for create_colormap and create_colorindex. - * These routines determine the colormap to be used. The rest of the module - * only assumes that the colormap is orthogonal. - * - * * select_ncolors decides how to divvy up the available colors - * among the components. - * * output_value defines the set of representative values for a component. - * * largest_input_value defines the mapping from input values to - * representative values for a component. - * Note that the latter two routines may impose different policies for - * different components, though this is not currently done. - */ - - -LOCAL(int) -select_ncolors (j_decompress_ptr cinfo, int Ncolors[]) -/* Determine allocation of desired colors to components, */ -/* and fill in Ncolors[] array to indicate choice. */ -/* Return value is total number of colors (product of Ncolors[] values). */ -{ - int nc = cinfo->out_color_components; /* number of color components */ - int max_colors = cinfo->desired_number_of_colors; - int total_colors, iroot, i, j; - boolean changed; - long temp; - static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE }; - - /* We can allocate at least the nc'th root of max_colors per component. */ - /* Compute floor(nc'th root of max_colors). */ - iroot = 1; - do { - iroot++; - temp = iroot; /* set temp = iroot ** nc */ - for (i = 1; i < nc; i++) - temp *= iroot; - } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */ - iroot--; /* now iroot = floor(root) */ - - /* Must have at least 2 color values per component */ - if (iroot < 2) - ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp); - - /* Initialize to iroot color values for each component */ - total_colors = 1; - for (i = 0; i < nc; i++) { - Ncolors[i] = iroot; - total_colors *= iroot; - } - /* We may be able to increment the count for one or more components without - * exceeding max_colors, though we know not all can be incremented. - * Sometimes, the first component can be incremented more than once! - * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.) - * In RGB colorspace, try to increment G first, then R, then B. - */ - do { - changed = FALSE; - for (i = 0; i < nc; i++) { - j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i); - /* calculate new total_colors if Ncolors[j] is incremented */ - temp = total_colors / Ncolors[j]; - temp *= Ncolors[j]+1; /* done in long arith to avoid oflo */ - if (temp > (long) max_colors) - break; /* won't fit, done with this pass */ - Ncolors[j]++; /* OK, apply the increment */ - total_colors = (int) temp; - changed = TRUE; - } - } while (changed); - - return total_colors; -} - - -LOCAL(int) -output_value (j_decompress_ptr cinfo, int ci, int j, int maxj) -/* Return j'th output value, where j will range from 0 to maxj */ -/* The output values must fall in 0..MAXJSAMPLE in increasing order */ -{ - /* We always provide values 0 and MAXJSAMPLE for each component; - * any additional values are equally spaced between these limits. - * (Forcing the upper and lower values to the limits ensures that - * dithering can't produce a color outside the selected gamut.) - */ - return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj); -} - - -LOCAL(int) -largest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj) -/* Return largest input value that should map to j'th output value */ -/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */ -{ - /* Breakpoints are halfway between values returned by output_value */ - return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj)); -} - - -/* - * Create the colormap. - */ - -LOCAL(void) -create_colormap (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - JSAMPARRAY colormap; /* Created colormap */ - int total_colors; /* Number of distinct output colors */ - int i,j,k, nci, blksize, blkdist, ptr, val; - - /* Select number of colors for each component */ - total_colors = select_ncolors(cinfo, cquantize->Ncolors); - - /* Report selected color counts */ - if (cinfo->out_color_components == 3) - TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS, - total_colors, cquantize->Ncolors[0], - cquantize->Ncolors[1], cquantize->Ncolors[2]); - else - TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors); - - /* Allocate and fill in the colormap. */ - /* The colors are ordered in the map in standard row-major order, */ - /* i.e. rightmost (highest-indexed) color changes most rapidly. */ - - colormap = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components); - - /* blksize is number of adjacent repeated entries for a component */ - /* blkdist is distance between groups of identical entries for a component */ - blkdist = total_colors; - - for (i = 0; i < cinfo->out_color_components; i++) { - /* fill in colormap entries for i'th color component */ - nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ - blksize = blkdist / nci; - for (j = 0; j < nci; j++) { - /* Compute j'th output value (out of nci) for component */ - val = output_value(cinfo, i, j, nci-1); - /* Fill in all colormap entries that have this value of this component */ - for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) { - /* fill in blksize entries beginning at ptr */ - for (k = 0; k < blksize; k++) - colormap[i][ptr+k] = (JSAMPLE) val; - } - } - blkdist = blksize; /* blksize of this color is blkdist of next */ - } - - /* Save the colormap in private storage, - * where it will survive color quantization mode changes. - */ - cquantize->sv_colormap = colormap; - cquantize->sv_actual = total_colors; -} - - -/* - * Create the color index table. - */ - -LOCAL(void) -create_colorindex (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - JSAMPROW indexptr; - int i,j,k, nci, blksize, val, pad; - - /* For ordered dither, we pad the color index tables by MAXJSAMPLE in - * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE). - * This is not necessary in the other dithering modes. However, we - * flag whether it was done in case user changes dithering mode. - */ - if (cinfo->dither_mode == JDITHER_ORDERED) { - pad = MAXJSAMPLE*2; - cquantize->is_padded = TRUE; - } else { - pad = 0; - cquantize->is_padded = FALSE; - } - - cquantize->colorindex = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) (MAXJSAMPLE+1 + pad), - (JDIMENSION) cinfo->out_color_components); - - /* blksize is number of adjacent repeated entries for a component */ - blksize = cquantize->sv_actual; - - for (i = 0; i < cinfo->out_color_components; i++) { - /* fill in colorindex entries for i'th color component */ - nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ - blksize = blksize / nci; - - /* adjust colorindex pointers to provide padding at negative indexes. */ - if (pad) - cquantize->colorindex[i] += MAXJSAMPLE; - - /* in loop, val = index of current output value, */ - /* and k = largest j that maps to current val */ - indexptr = cquantize->colorindex[i]; - val = 0; - k = largest_input_value(cinfo, i, 0, nci-1); - for (j = 0; j <= MAXJSAMPLE; j++) { - while (j > k) /* advance val if past boundary */ - k = largest_input_value(cinfo, i, ++val, nci-1); - /* premultiply so that no multiplication needed in main processing */ - indexptr[j] = (JSAMPLE) (val * blksize); - } - /* Pad at both ends if necessary */ - if (pad) - for (j = 1; j <= MAXJSAMPLE; j++) { - indexptr[-j] = indexptr[0]; - indexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE]; - } - } -} - - -/* - * Create an ordered-dither array for a component having ncolors - * distinct output values. - */ - -LOCAL(ODITHER_MATRIX_PTR) -make_odither_array (j_decompress_ptr cinfo, int ncolors) -{ - ODITHER_MATRIX_PTR odither; - int j,k; - INT32 num,den; - - odither = (ODITHER_MATRIX_PTR) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(ODITHER_MATRIX)); - /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1). - * Hence the dither value for the matrix cell with fill order f - * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1). - * On 16-bit-int machine, be careful to avoid overflow. - */ - den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1)); - for (j = 0; j < ODITHER_SIZE; j++) { - for (k = 0; k < ODITHER_SIZE; k++) { - num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k]))) - * MAXJSAMPLE; - /* Ensure round towards zero despite C's lack of consistency - * about rounding negative values in integer division... - */ - odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den); - } - } - return odither; -} - - -/* - * Create the ordered-dither tables. - * Components having the same number of representative colors may - * share a dither table. - */ - -LOCAL(void) -create_odither_tables (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - ODITHER_MATRIX_PTR odither; - int i, j, nci; - - for (i = 0; i < cinfo->out_color_components; i++) { - nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ - odither = NULL; /* search for matching prior component */ - for (j = 0; j < i; j++) { - if (nci == cquantize->Ncolors[j]) { - odither = cquantize->odither[j]; - break; - } - } - if (odither == NULL) /* need a new table? */ - odither = make_odither_array(cinfo, nci); - cquantize->odither[i] = odither; - } -} - - -/* - * Map some rows of pixels to the output colormapped representation. - */ - -METHODDEF(void) -color_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* General case, no dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - JSAMPARRAY colorindex = cquantize->colorindex; - register int pixcode, ci; - register JSAMPROW ptrin, ptrout; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - register int nc = cinfo->out_color_components; - - for (row = 0; row < num_rows; row++) { - ptrin = input_buf[row]; - ptrout = output_buf[row]; - for (col = width; col > 0; col--) { - pixcode = 0; - for (ci = 0; ci < nc; ci++) { - pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]); - } - *ptrout++ = (JSAMPLE) pixcode; - } - } -} - - -METHODDEF(void) -color_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* Fast path for out_color_components==3, no dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - register int pixcode; - register JSAMPROW ptrin, ptrout; - JSAMPROW colorindex0 = cquantize->colorindex[0]; - JSAMPROW colorindex1 = cquantize->colorindex[1]; - JSAMPROW colorindex2 = cquantize->colorindex[2]; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - ptrin = input_buf[row]; - ptrout = output_buf[row]; - for (col = width; col > 0; col--) { - pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]); - pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]); - pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]); - *ptrout++ = (JSAMPLE) pixcode; - } - } -} - - -METHODDEF(void) -quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* General case, with ordered dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - register JSAMPROW input_ptr; - register JSAMPROW output_ptr; - JSAMPROW colorindex_ci; - int * dither; /* points to active row of dither matrix */ - int row_index, col_index; /* current indexes into dither matrix */ - int nc = cinfo->out_color_components; - int ci; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - /* Initialize output values to 0 so can process components separately */ - jzero_far((void FAR *) output_buf[row], - (size_t) (width * SIZEOF(JSAMPLE))); - row_index = cquantize->row_index; - for (ci = 0; ci < nc; ci++) { - input_ptr = input_buf[row] + ci; - output_ptr = output_buf[row]; - colorindex_ci = cquantize->colorindex[ci]; - dither = cquantize->odither[ci][row_index]; - col_index = 0; - - for (col = width; col > 0; col--) { - /* Form pixel value + dither, range-limit to 0..MAXJSAMPLE, - * select output value, accumulate into output code for this pixel. - * Range-limiting need not be done explicitly, as we have extended - * the colorindex table to produce the right answers for out-of-range - * inputs. The maximum dither is +- MAXJSAMPLE; this sets the - * required amount of padding. - */ - *output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]]; - input_ptr += nc; - output_ptr++; - col_index = (col_index + 1) & ODITHER_MASK; - } - } - /* Advance row index for next row */ - row_index = (row_index + 1) & ODITHER_MASK; - cquantize->row_index = row_index; - } -} - - -METHODDEF(void) -quantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* Fast path for out_color_components==3, with ordered dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - register int pixcode; - register JSAMPROW input_ptr; - register JSAMPROW output_ptr; - JSAMPROW colorindex0 = cquantize->colorindex[0]; - JSAMPROW colorindex1 = cquantize->colorindex[1]; - JSAMPROW colorindex2 = cquantize->colorindex[2]; - int * dither0; /* points to active row of dither matrix */ - int * dither1; - int * dither2; - int row_index, col_index; /* current indexes into dither matrix */ - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - row_index = cquantize->row_index; - input_ptr = input_buf[row]; - output_ptr = output_buf[row]; - dither0 = cquantize->odither[0][row_index]; - dither1 = cquantize->odither[1][row_index]; - dither2 = cquantize->odither[2][row_index]; - col_index = 0; - - for (col = width; col > 0; col--) { - pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) + - dither0[col_index]]); - pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) + - dither1[col_index]]); - pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) + - dither2[col_index]]); - *output_ptr++ = (JSAMPLE) pixcode; - col_index = (col_index + 1) & ODITHER_MASK; - } - row_index = (row_index + 1) & ODITHER_MASK; - cquantize->row_index = row_index; - } -} - - -METHODDEF(void) -quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* General case, with Floyd-Steinberg dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - register LOCFSERROR cur; /* current error or pixel value */ - LOCFSERROR belowerr; /* error for pixel below cur */ - LOCFSERROR bpreverr; /* error for below/prev col */ - LOCFSERROR bnexterr; /* error for below/next col */ - LOCFSERROR delta; - register FSERRPTR errorptr; /* => fserrors[] at column before current */ - register JSAMPROW input_ptr; - register JSAMPROW output_ptr; - JSAMPROW colorindex_ci; - JSAMPROW colormap_ci; - int pixcode; - int nc = cinfo->out_color_components; - int dir; /* 1 for left-to-right, -1 for right-to-left */ - int dirnc; /* dir * nc */ - int ci; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - JSAMPLE *range_limit = cinfo->sample_range_limit; - SHIFT_TEMPS - - for (row = 0; row < num_rows; row++) { - /* Initialize output values to 0 so can process components separately */ - jzero_far((void FAR *) output_buf[row], - (size_t) (width * SIZEOF(JSAMPLE))); - for (ci = 0; ci < nc; ci++) { - input_ptr = input_buf[row] + ci; - output_ptr = output_buf[row]; - if (cquantize->on_odd_row) { - /* work right to left in this row */ - input_ptr += (width-1) * nc; /* so point to rightmost pixel */ - output_ptr += width-1; - dir = -1; - dirnc = -nc; - errorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */ - } else { - /* work left to right in this row */ - dir = 1; - dirnc = nc; - errorptr = cquantize->fserrors[ci]; /* => entry before first column */ - } - colorindex_ci = cquantize->colorindex[ci]; - colormap_ci = cquantize->sv_colormap[ci]; - /* Preset error values: no error propagated to first pixel from left */ - cur = 0; - /* and no error propagated to row below yet */ - belowerr = bpreverr = 0; - - for (col = width; col > 0; col--) { - /* cur holds the error propagated from the previous pixel on the - * current line. Add the error propagated from the previous line - * to form the complete error correction term for this pixel, and - * round the error term (which is expressed * 16) to an integer. - * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct - * for either sign of the error value. - * Note: errorptr points to *previous* column's array entry. - */ - cur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4); - /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. - * The maximum error is +- MAXJSAMPLE; this sets the required size - * of the range_limit array. - */ - cur += GETJSAMPLE(*input_ptr); - cur = GETJSAMPLE(range_limit[cur]); - /* Select output value, accumulate into output code for this pixel */ - pixcode = GETJSAMPLE(colorindex_ci[cur]); - *output_ptr += (JSAMPLE) pixcode; - /* Compute actual representation error at this pixel */ - /* Note: we can do this even though we don't have the final */ - /* pixel code, because the colormap is orthogonal. */ - cur -= GETJSAMPLE(colormap_ci[pixcode]); - /* Compute error fractions to be propagated to adjacent pixels. - * Add these into the running sums, and simultaneously shift the - * next-line error sums left by 1 column. - */ - bnexterr = cur; - delta = cur * 2; - cur += delta; /* form error * 3 */ - errorptr[0] = (FSERROR) (bpreverr + cur); - cur += delta; /* form error * 5 */ - bpreverr = belowerr + cur; - belowerr = bnexterr; - cur += delta; /* form error * 7 */ - /* At this point cur contains the 7/16 error value to be propagated - * to the next pixel on the current line, and all the errors for the - * next line have been shifted over. We are therefore ready to move on. - */ - input_ptr += dirnc; /* advance input ptr to next column */ - output_ptr += dir; /* advance output ptr to next column */ - errorptr += dir; /* advance errorptr to current column */ - } - /* Post-loop cleanup: we must unload the final error value into the - * final fserrors[] entry. Note we need not unload belowerr because - * it is for the dummy column before or after the actual array. - */ - errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */ - } - cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE); - } -} - - -/* - * Allocate workspace for Floyd-Steinberg errors. - */ - -LOCAL(void) -alloc_fs_workspace (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - size_t arraysize; - int i; - - arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); - for (i = 0; i < cinfo->out_color_components; i++) { - cquantize->fserrors[i] = (FSERRPTR) - (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); - } -} - - -/* - * Initialize for one-pass color quantization. - */ - -METHODDEF(void) -start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - size_t arraysize; - int i; - - /* Install my colormap. */ - cinfo->colormap = cquantize->sv_colormap; - cinfo->actual_number_of_colors = cquantize->sv_actual; - - /* Initialize for desired dithering mode. */ - switch (cinfo->dither_mode) { - case JDITHER_NONE: - if (cinfo->out_color_components == 3) - cquantize->pub.color_quantize = color_quantize3; - else - cquantize->pub.color_quantize = color_quantize; - break; - case JDITHER_ORDERED: - if (cinfo->out_color_components == 3) - cquantize->pub.color_quantize = quantize3_ord_dither; - else - cquantize->pub.color_quantize = quantize_ord_dither; - cquantize->row_index = 0; /* initialize state for ordered dither */ - /* If user changed to ordered dither from another mode, - * we must recreate the color index table with padding. - * This will cost extra space, but probably isn't very likely. - */ - if (! cquantize->is_padded) - create_colorindex(cinfo); - /* Create ordered-dither tables if we didn't already. */ - if (cquantize->odither[0] == NULL) - create_odither_tables(cinfo); - break; - case JDITHER_FS: - cquantize->pub.color_quantize = quantize_fs_dither; - cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */ - /* Allocate Floyd-Steinberg workspace if didn't already. */ - if (cquantize->fserrors[0] == NULL) - alloc_fs_workspace(cinfo); - /* Initialize the propagated errors to zero. */ - arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); - for (i = 0; i < cinfo->out_color_components; i++) - jzero_far((void FAR *) cquantize->fserrors[i], arraysize); - break; - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } -} - - -/* - * Finish up at the end of the pass. - */ - -METHODDEF(void) -finish_pass_1_quant (j_decompress_ptr cinfo) -{ - /* no work in 1-pass case */ -} - - -/* - * Switch to a new external colormap between output passes. - * Shouldn't get to this module! - */ - -METHODDEF(void) -new_color_map_1_quant (j_decompress_ptr cinfo) -{ - ERREXIT(cinfo, JERR_MODE_CHANGE); -} - - -/* - * Module initialization routine for 1-pass color quantization. - */ - -GLOBAL(void) -jinit_1pass_quantizer (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize; - - cquantize = (my_cquantize_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_cquantizer)); - cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; - cquantize->pub.start_pass = start_pass_1_quant; - cquantize->pub.finish_pass = finish_pass_1_quant; - cquantize->pub.new_color_map = new_color_map_1_quant; - cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */ - cquantize->odither[0] = NULL; /* Also flag odither arrays not allocated */ - - /* Make sure my internal arrays won't overflow */ - if (cinfo->out_color_components > MAX_Q_COMPS) - ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS); - /* Make sure colormap indexes can be represented by JSAMPLEs */ - if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1)) - ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1); - - /* Create the colormap and color index table. */ - create_colormap(cinfo); - create_colorindex(cinfo); - - /* Allocate Floyd-Steinberg workspace now if requested. - * We do this now since it is FAR storage and may affect the memory - * manager's space calculations. If the user changes to FS dither - * mode in a later pass, we will allocate the space then, and will - * possibly overrun the max_memory_to_use setting. - */ - if (cinfo->dither_mode == JDITHER_FS) - alloc_fs_workspace(cinfo); -} - -#endif /* QUANT_1PASS_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jquant2.c b/src/SFML/Graphics/libjpeg/jquant2.c deleted file mode 100644 index 87a3920b..00000000 --- a/src/SFML/Graphics/libjpeg/jquant2.c +++ /dev/null @@ -1,1310 +0,0 @@ -/* - * jquant2.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains 2-pass color quantization (color mapping) routines. - * These routines provide selection of a custom color map for an image, - * followed by mapping of the image to that color map, with optional - * Floyd-Steinberg dithering. - * It is also possible to use just the second pass to map to an arbitrary - * externally-given color map. - * - * Note: ordered dithering is not supported, since there isn't any fast - * way to compute intercolor distances; it's unclear that ordered dither's - * fundamental assumptions even hold with an irregularly spaced color map. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - -#ifdef QUANT_2PASS_SUPPORTED - - -/* - * This module implements the well-known Heckbert paradigm for color - * quantization. Most of the ideas used here can be traced back to - * Heckbert's seminal paper - * Heckbert, Paul. "Color Image Quantization for Frame Buffer Display", - * Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304. - * - * In the first pass over the image, we accumulate a histogram showing the - * usage count of each possible color. To keep the histogram to a reasonable - * size, we reduce the precision of the input; typical practice is to retain - * 5 or 6 bits per color, so that 8 or 4 different input values are counted - * in the same histogram cell. - * - * Next, the color-selection step begins with a box representing the whole - * color space, and repeatedly splits the "largest" remaining box until we - * have as many boxes as desired colors. Then the mean color in each - * remaining box becomes one of the possible output colors. - * - * The second pass over the image maps each input pixel to the closest output - * color (optionally after applying a Floyd-Steinberg dithering correction). - * This mapping is logically trivial, but making it go fast enough requires - * considerable care. - * - * Heckbert-style quantizers vary a good deal in their policies for choosing - * the "largest" box and deciding where to cut it. The particular policies - * used here have proved out well in experimental comparisons, but better ones - * may yet be found. - * - * In earlier versions of the IJG code, this module quantized in YCbCr color - * space, processing the raw upsampled data without a color conversion step. - * This allowed the color conversion math to be done only once per colormap - * entry, not once per pixel. However, that optimization precluded other - * useful optimizations (such as merging color conversion with upsampling) - * and it also interfered with desired capabilities such as quantizing to an - * externally-supplied colormap. We have therefore abandoned that approach. - * The present code works in the post-conversion color space, typically RGB. - * - * To improve the visual quality of the results, we actually work in scaled - * RGB space, giving G distances more weight than R, and R in turn more than - * B. To do everything in integer math, we must use integer scale factors. - * The 2/3/1 scale factors used here correspond loosely to the relative - * weights of the colors in the NTSC grayscale equation. - * If you want to use this code to quantize a non-RGB color space, you'll - * probably need to change these scale factors. - */ - -#define R_SCALE 2 /* scale R distances by this much */ -#define G_SCALE 3 /* scale G distances by this much */ -#define B_SCALE 1 /* and B by this much */ - -/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined - * in jmorecfg.h. As the code stands, it will do the right thing for R,G,B - * and B,G,R orders. If you define some other weird order in jmorecfg.h, - * you'll get compile errors until you extend this logic. In that case - * you'll probably want to tweak the histogram sizes too. - */ - -#if RGB_RED == 0 -#define C0_SCALE R_SCALE -#endif -#if RGB_BLUE == 0 -#define C0_SCALE B_SCALE -#endif -#if RGB_GREEN == 1 -#define C1_SCALE G_SCALE -#endif -#if RGB_RED == 2 -#define C2_SCALE R_SCALE -#endif -#if RGB_BLUE == 2 -#define C2_SCALE B_SCALE -#endif - - -/* - * First we have the histogram data structure and routines for creating it. - * - * The number of bits of precision can be adjusted by changing these symbols. - * We recommend keeping 6 bits for G and 5 each for R and B. - * If you have plenty of memory and cycles, 6 bits all around gives marginally - * better results; if you are short of memory, 5 bits all around will save - * some space but degrade the results. - * To maintain a fully accurate histogram, we'd need to allocate a "long" - * (preferably unsigned long) for each cell. In practice this is overkill; - * we can get by with 16 bits per cell. Few of the cell counts will overflow, - * and clamping those that do overflow to the maximum value will give close- - * enough results. This reduces the recommended histogram size from 256Kb - * to 128Kb, which is a useful savings on PC-class machines. - * (In the second pass the histogram space is re-used for pixel mapping data; - * in that capacity, each cell must be able to store zero to the number of - * desired colors. 16 bits/cell is plenty for that too.) - * Since the JPEG code is intended to run in small memory model on 80x86 - * machines, we can't just allocate the histogram in one chunk. Instead - * of a true 3-D array, we use a row of pointers to 2-D arrays. Each - * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and - * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries. Note that - * on 80x86 machines, the pointer row is in near memory but the actual - * arrays are in far memory (same arrangement as we use for image arrays). - */ - -#define MAXNUMCOLORS (MAXJSAMPLE+1) /* maximum size of colormap */ - -/* These will do the right thing for either R,G,B or B,G,R color order, - * but you may not like the results for other color orders. - */ -#define HIST_C0_BITS 5 /* bits of precision in R/B histogram */ -#define HIST_C1_BITS 6 /* bits of precision in G histogram */ -#define HIST_C2_BITS 5 /* bits of precision in B/R histogram */ - -/* Number of elements along histogram axes. */ -#define HIST_C0_ELEMS (1<cquantize; - register JSAMPROW ptr; - register histptr histp; - register hist3d histogram = cquantize->histogram; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - ptr = input_buf[row]; - for (col = width; col > 0; col--) { - /* get pixel value and index into the histogram */ - histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT] - [GETJSAMPLE(ptr[1]) >> C1_SHIFT] - [GETJSAMPLE(ptr[2]) >> C2_SHIFT]; - /* increment, check for overflow and undo increment if so. */ - if (++(*histp) <= 0) - (*histp)--; - ptr += 3; - } - } -} - - -/* - * Next we have the really interesting routines: selection of a colormap - * given the completed histogram. - * These routines work with a list of "boxes", each representing a rectangular - * subset of the input color space (to histogram precision). - */ - -typedef struct { - /* The bounds of the box (inclusive); expressed as histogram indexes */ - int c0min, c0max; - int c1min, c1max; - int c2min, c2max; - /* The volume (actually 2-norm) of the box */ - INT32 volume; - /* The number of nonzero histogram cells within this box */ - long colorcount; -} box; - -typedef box * boxptr; - - -LOCAL(boxptr) -find_biggest_color_pop (boxptr boxlist, int numboxes) -/* Find the splittable box with the largest color population */ -/* Returns NULL if no splittable boxes remain */ -{ - register boxptr boxp; - register int i; - register long maxc = 0; - boxptr which = NULL; - - for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { - if (boxp->colorcount > maxc && boxp->volume > 0) { - which = boxp; - maxc = boxp->colorcount; - } - } - return which; -} - - -LOCAL(boxptr) -find_biggest_volume (boxptr boxlist, int numboxes) -/* Find the splittable box with the largest (scaled) volume */ -/* Returns NULL if no splittable boxes remain */ -{ - register boxptr boxp; - register int i; - register INT32 maxv = 0; - boxptr which = NULL; - - for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { - if (boxp->volume > maxv) { - which = boxp; - maxv = boxp->volume; - } - } - return which; -} - - -LOCAL(void) -update_box (j_decompress_ptr cinfo, boxptr boxp) -/* Shrink the min/max bounds of a box to enclose only nonzero elements, */ -/* and recompute its volume and population */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - histptr histp; - int c0,c1,c2; - int c0min,c0max,c1min,c1max,c2min,c2max; - INT32 dist0,dist1,dist2; - long ccount; - - c0min = boxp->c0min; c0max = boxp->c0max; - c1min = boxp->c1min; c1max = boxp->c1max; - c2min = boxp->c2min; c2max = boxp->c2max; - - if (c0max > c0min) - for (c0 = c0min; c0 <= c0max; c0++) - for (c1 = c1min; c1 <= c1max; c1++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) - if (*histp++ != 0) { - boxp->c0min = c0min = c0; - goto have_c0min; - } - } - have_c0min: - if (c0max > c0min) - for (c0 = c0max; c0 >= c0min; c0--) - for (c1 = c1min; c1 <= c1max; c1++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) - if (*histp++ != 0) { - boxp->c0max = c0max = c0; - goto have_c0max; - } - } - have_c0max: - if (c1max > c1min) - for (c1 = c1min; c1 <= c1max; c1++) - for (c0 = c0min; c0 <= c0max; c0++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) - if (*histp++ != 0) { - boxp->c1min = c1min = c1; - goto have_c1min; - } - } - have_c1min: - if (c1max > c1min) - for (c1 = c1max; c1 >= c1min; c1--) - for (c0 = c0min; c0 <= c0max; c0++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) - if (*histp++ != 0) { - boxp->c1max = c1max = c1; - goto have_c1max; - } - } - have_c1max: - if (c2max > c2min) - for (c2 = c2min; c2 <= c2max; c2++) - for (c0 = c0min; c0 <= c0max; c0++) { - histp = & histogram[c0][c1min][c2]; - for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) - if (*histp != 0) { - boxp->c2min = c2min = c2; - goto have_c2min; - } - } - have_c2min: - if (c2max > c2min) - for (c2 = c2max; c2 >= c2min; c2--) - for (c0 = c0min; c0 <= c0max; c0++) { - histp = & histogram[c0][c1min][c2]; - for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) - if (*histp != 0) { - boxp->c2max = c2max = c2; - goto have_c2max; - } - } - have_c2max: - - /* Update box volume. - * We use 2-norm rather than real volume here; this biases the method - * against making long narrow boxes, and it has the side benefit that - * a box is splittable iff norm > 0. - * Since the differences are expressed in histogram-cell units, - * we have to shift back to JSAMPLE units to get consistent distances; - * after which, we scale according to the selected distance scale factors. - */ - dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE; - dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE; - dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE; - boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2; - - /* Now scan remaining volume of box and compute population */ - ccount = 0; - for (c0 = c0min; c0 <= c0max; c0++) - for (c1 = c1min; c1 <= c1max; c1++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++, histp++) - if (*histp != 0) { - ccount++; - } - } - boxp->colorcount = ccount; -} - - -LOCAL(int) -median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes, - int desired_colors) -/* Repeatedly select and split the largest box until we have enough boxes */ -{ - int n,lb; - int c0,c1,c2,cmax; - register boxptr b1,b2; - - while (numboxes < desired_colors) { - /* Select box to split. - * Current algorithm: by population for first half, then by volume. - */ - if (numboxes*2 <= desired_colors) { - b1 = find_biggest_color_pop(boxlist, numboxes); - } else { - b1 = find_biggest_volume(boxlist, numboxes); - } - if (b1 == NULL) /* no splittable boxes left! */ - break; - b2 = &boxlist[numboxes]; /* where new box will go */ - /* Copy the color bounds to the new box. */ - b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max; - b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min; - /* Choose which axis to split the box on. - * Current algorithm: longest scaled axis. - * See notes in update_box about scaling distances. - */ - c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE; - c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE; - c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE; - /* We want to break any ties in favor of green, then red, blue last. - * This code does the right thing for R,G,B or B,G,R color orders only. - */ -#if RGB_RED == 0 - cmax = c1; n = 1; - if (c0 > cmax) { cmax = c0; n = 0; } - if (c2 > cmax) { n = 2; } -#else - cmax = c1; n = 1; - if (c2 > cmax) { cmax = c2; n = 2; } - if (c0 > cmax) { n = 0; } -#endif - /* Choose split point along selected axis, and update box bounds. - * Current algorithm: split at halfway point. - * (Since the box has been shrunk to minimum volume, - * any split will produce two nonempty subboxes.) - * Note that lb value is max for lower box, so must be < old max. - */ - switch (n) { - case 0: - lb = (b1->c0max + b1->c0min) / 2; - b1->c0max = lb; - b2->c0min = lb+1; - break; - case 1: - lb = (b1->c1max + b1->c1min) / 2; - b1->c1max = lb; - b2->c1min = lb+1; - break; - case 2: - lb = (b1->c2max + b1->c2min) / 2; - b1->c2max = lb; - b2->c2min = lb+1; - break; - } - /* Update stats for boxes */ - update_box(cinfo, b1); - update_box(cinfo, b2); - numboxes++; - } - return numboxes; -} - - -LOCAL(void) -compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor) -/* Compute representative color for a box, put it in colormap[icolor] */ -{ - /* Current algorithm: mean weighted by pixels (not colors) */ - /* Note it is important to get the rounding correct! */ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - histptr histp; - int c0,c1,c2; - int c0min,c0max,c1min,c1max,c2min,c2max; - long count; - long total = 0; - long c0total = 0; - long c1total = 0; - long c2total = 0; - - c0min = boxp->c0min; c0max = boxp->c0max; - c1min = boxp->c1min; c1max = boxp->c1max; - c2min = boxp->c2min; c2max = boxp->c2max; - - for (c0 = c0min; c0 <= c0max; c0++) - for (c1 = c1min; c1 <= c1max; c1++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) { - if ((count = *histp++) != 0) { - total += count; - c0total += ((c0 << C0_SHIFT) + ((1<>1)) * count; - c1total += ((c1 << C1_SHIFT) + ((1<>1)) * count; - c2total += ((c2 << C2_SHIFT) + ((1<>1)) * count; - } - } - } - - cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total); - cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total); - cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total); -} - - -LOCAL(void) -select_colors (j_decompress_ptr cinfo, int desired_colors) -/* Master routine for color selection */ -{ - boxptr boxlist; - int numboxes; - int i; - - /* Allocate workspace for box list */ - boxlist = (boxptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF(box)); - /* Initialize one box containing whole space */ - numboxes = 1; - boxlist[0].c0min = 0; - boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT; - boxlist[0].c1min = 0; - boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT; - boxlist[0].c2min = 0; - boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT; - /* Shrink it to actually-used volume and set its statistics */ - update_box(cinfo, & boxlist[0]); - /* Perform median-cut to produce final box list */ - numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors); - /* Compute the representative color for each box, fill colormap */ - for (i = 0; i < numboxes; i++) - compute_color(cinfo, & boxlist[i], i); - cinfo->actual_number_of_colors = numboxes; - TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes); -} - - -/* - * These routines are concerned with the time-critical task of mapping input - * colors to the nearest color in the selected colormap. - * - * We re-use the histogram space as an "inverse color map", essentially a - * cache for the results of nearest-color searches. All colors within a - * histogram cell will be mapped to the same colormap entry, namely the one - * closest to the cell's center. This may not be quite the closest entry to - * the actual input color, but it's almost as good. A zero in the cache - * indicates we haven't found the nearest color for that cell yet; the array - * is cleared to zeroes before starting the mapping pass. When we find the - * nearest color for a cell, its colormap index plus one is recorded in the - * cache for future use. The pass2 scanning routines call fill_inverse_cmap - * when they need to use an unfilled entry in the cache. - * - * Our method of efficiently finding nearest colors is based on the "locally - * sorted search" idea described by Heckbert and on the incremental distance - * calculation described by Spencer W. Thomas in chapter III.1 of Graphics - * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that - * the distances from a given colormap entry to each cell of the histogram can - * be computed quickly using an incremental method: the differences between - * distances to adjacent cells themselves differ by a constant. This allows a - * fairly fast implementation of the "brute force" approach of computing the - * distance from every colormap entry to every histogram cell. Unfortunately, - * it needs a work array to hold the best-distance-so-far for each histogram - * cell (because the inner loop has to be over cells, not colormap entries). - * The work array elements have to be INT32s, so the work array would need - * 256Kb at our recommended precision. This is not feasible in DOS machines. - * - * To get around these problems, we apply Thomas' method to compute the - * nearest colors for only the cells within a small subbox of the histogram. - * The work array need be only as big as the subbox, so the memory usage - * problem is solved. Furthermore, we need not fill subboxes that are never - * referenced in pass2; many images use only part of the color gamut, so a - * fair amount of work is saved. An additional advantage of this - * approach is that we can apply Heckbert's locality criterion to quickly - * eliminate colormap entries that are far away from the subbox; typically - * three-fourths of the colormap entries are rejected by Heckbert's criterion, - * and we need not compute their distances to individual cells in the subbox. - * The speed of this approach is heavily influenced by the subbox size: too - * small means too much overhead, too big loses because Heckbert's criterion - * can't eliminate as many colormap entries. Empirically the best subbox - * size seems to be about 1/512th of the histogram (1/8th in each direction). - * - * Thomas' article also describes a refined method which is asymptotically - * faster than the brute-force method, but it is also far more complex and - * cannot efficiently be applied to small subboxes. It is therefore not - * useful for programs intended to be portable to DOS machines. On machines - * with plenty of memory, filling the whole histogram in one shot with Thomas' - * refined method might be faster than the present code --- but then again, - * it might not be any faster, and it's certainly more complicated. - */ - - -/* log2(histogram cells in update box) for each axis; this can be adjusted */ -#define BOX_C0_LOG (HIST_C0_BITS-3) -#define BOX_C1_LOG (HIST_C1_BITS-3) -#define BOX_C2_LOG (HIST_C2_BITS-3) - -#define BOX_C0_ELEMS (1<actual_number_of_colors; - int maxc0, maxc1, maxc2; - int centerc0, centerc1, centerc2; - int i, x, ncolors; - INT32 minmaxdist, min_dist, max_dist, tdist; - INT32 mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */ - - /* Compute true coordinates of update box's upper corner and center. - * Actually we compute the coordinates of the center of the upper-corner - * histogram cell, which are the upper bounds of the volume we care about. - * Note that since ">>" rounds down, the "center" values may be closer to - * min than to max; hence comparisons to them must be "<=", not "<". - */ - maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT)); - centerc0 = (minc0 + maxc0) >> 1; - maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT)); - centerc1 = (minc1 + maxc1) >> 1; - maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT)); - centerc2 = (minc2 + maxc2) >> 1; - - /* For each color in colormap, find: - * 1. its minimum squared-distance to any point in the update box - * (zero if color is within update box); - * 2. its maximum squared-distance to any point in the update box. - * Both of these can be found by considering only the corners of the box. - * We save the minimum distance for each color in mindist[]; - * only the smallest maximum distance is of interest. - */ - minmaxdist = 0x7FFFFFFFL; - - for (i = 0; i < numcolors; i++) { - /* We compute the squared-c0-distance term, then add in the other two. */ - x = GETJSAMPLE(cinfo->colormap[0][i]); - if (x < minc0) { - tdist = (x - minc0) * C0_SCALE; - min_dist = tdist*tdist; - tdist = (x - maxc0) * C0_SCALE; - max_dist = tdist*tdist; - } else if (x > maxc0) { - tdist = (x - maxc0) * C0_SCALE; - min_dist = tdist*tdist; - tdist = (x - minc0) * C0_SCALE; - max_dist = tdist*tdist; - } else { - /* within cell range so no contribution to min_dist */ - min_dist = 0; - if (x <= centerc0) { - tdist = (x - maxc0) * C0_SCALE; - max_dist = tdist*tdist; - } else { - tdist = (x - minc0) * C0_SCALE; - max_dist = tdist*tdist; - } - } - - x = GETJSAMPLE(cinfo->colormap[1][i]); - if (x < minc1) { - tdist = (x - minc1) * C1_SCALE; - min_dist += tdist*tdist; - tdist = (x - maxc1) * C1_SCALE; - max_dist += tdist*tdist; - } else if (x > maxc1) { - tdist = (x - maxc1) * C1_SCALE; - min_dist += tdist*tdist; - tdist = (x - minc1) * C1_SCALE; - max_dist += tdist*tdist; - } else { - /* within cell range so no contribution to min_dist */ - if (x <= centerc1) { - tdist = (x - maxc1) * C1_SCALE; - max_dist += tdist*tdist; - } else { - tdist = (x - minc1) * C1_SCALE; - max_dist += tdist*tdist; - } - } - - x = GETJSAMPLE(cinfo->colormap[2][i]); - if (x < minc2) { - tdist = (x - minc2) * C2_SCALE; - min_dist += tdist*tdist; - tdist = (x - maxc2) * C2_SCALE; - max_dist += tdist*tdist; - } else if (x > maxc2) { - tdist = (x - maxc2) * C2_SCALE; - min_dist += tdist*tdist; - tdist = (x - minc2) * C2_SCALE; - max_dist += tdist*tdist; - } else { - /* within cell range so no contribution to min_dist */ - if (x <= centerc2) { - tdist = (x - maxc2) * C2_SCALE; - max_dist += tdist*tdist; - } else { - tdist = (x - minc2) * C2_SCALE; - max_dist += tdist*tdist; - } - } - - mindist[i] = min_dist; /* save away the results */ - if (max_dist < minmaxdist) - minmaxdist = max_dist; - } - - /* Now we know that no cell in the update box is more than minmaxdist - * away from some colormap entry. Therefore, only colors that are - * within minmaxdist of some part of the box need be considered. - */ - ncolors = 0; - for (i = 0; i < numcolors; i++) { - if (mindist[i] <= minmaxdist) - colorlist[ncolors++] = (JSAMPLE) i; - } - return ncolors; -} - - -LOCAL(void) -find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2, - int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[]) -/* Find the closest colormap entry for each cell in the update box, - * given the list of candidate colors prepared by find_nearby_colors. - * Return the indexes of the closest entries in the bestcolor[] array. - * This routine uses Thomas' incremental distance calculation method to - * find the distance from a colormap entry to successive cells in the box. - */ -{ - int ic0, ic1, ic2; - int i, icolor; - register INT32 * bptr; /* pointer into bestdist[] array */ - JSAMPLE * cptr; /* pointer into bestcolor[] array */ - INT32 dist0, dist1; /* initial distance values */ - register INT32 dist2; /* current distance in inner loop */ - INT32 xx0, xx1; /* distance increments */ - register INT32 xx2; - INT32 inc0, inc1, inc2; /* initial values for increments */ - /* This array holds the distance to the nearest-so-far color for each cell */ - INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; - - /* Initialize best-distance for each cell of the update box */ - bptr = bestdist; - for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--) - *bptr++ = 0x7FFFFFFFL; - - /* For each color selected by find_nearby_colors, - * compute its distance to the center of each cell in the box. - * If that's less than best-so-far, update best distance and color number. - */ - - /* Nominal steps between cell centers ("x" in Thomas article) */ -#define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE) -#define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE) -#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) - - for (i = 0; i < numcolors; i++) { - icolor = GETJSAMPLE(colorlist[i]); - /* Compute (square of) distance from minc0/c1/c2 to this color */ - inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE; - dist0 = inc0*inc0; - inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE; - dist0 += inc1*inc1; - inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE; - dist0 += inc2*inc2; - /* Form the initial difference increments */ - inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; - inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1; - inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2; - /* Now loop over all cells in box, updating distance per Thomas method */ - bptr = bestdist; - cptr = bestcolor; - xx0 = inc0; - for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) { - dist1 = dist0; - xx1 = inc1; - for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) { - dist2 = dist1; - xx2 = inc2; - for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) { - if (dist2 < *bptr) { - *bptr = dist2; - *cptr = (JSAMPLE) icolor; - } - dist2 += xx2; - xx2 += 2 * STEP_C2 * STEP_C2; - bptr++; - cptr++; - } - dist1 += xx1; - xx1 += 2 * STEP_C1 * STEP_C1; - } - dist0 += xx0; - xx0 += 2 * STEP_C0 * STEP_C0; - } - } -} - - -LOCAL(void) -fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2) -/* Fill the inverse-colormap entries in the update box that contains */ -/* histogram cell c0/c1/c2. (Only that one cell MUST be filled, but */ -/* we can fill as many others as we wish.) */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - int minc0, minc1, minc2; /* lower left corner of update box */ - int ic0, ic1, ic2; - register JSAMPLE * cptr; /* pointer into bestcolor[] array */ - register histptr cachep; /* pointer into main cache array */ - /* This array lists the candidate colormap indexes. */ - JSAMPLE colorlist[MAXNUMCOLORS]; - int numcolors; /* number of candidate colors */ - /* This array holds the actually closest colormap index for each cell. */ - JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; - - /* Convert cell coordinates to update box ID */ - c0 >>= BOX_C0_LOG; - c1 >>= BOX_C1_LOG; - c2 >>= BOX_C2_LOG; - - /* Compute true coordinates of update box's origin corner. - * Actually we compute the coordinates of the center of the corner - * histogram cell, which are the lower bounds of the volume we care about. - */ - minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); - minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); - minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); - - /* Determine which colormap entries are close enough to be candidates - * for the nearest entry to some cell in the update box. - */ - numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist); - - /* Determine the actually nearest colors. */ - find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist, - bestcolor); - - /* Save the best color numbers (plus 1) in the main cache array */ - c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */ - c1 <<= BOX_C1_LOG; - c2 <<= BOX_C2_LOG; - cptr = bestcolor; - for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) { - for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) { - cachep = & histogram[c0+ic0][c1+ic1][c2]; - for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) { - *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1); - } - } - } -} - - -/* - * Map some rows of pixels to the output colormapped representation. - */ - -METHODDEF(void) -pass2_no_dither (j_decompress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) -/* This version performs no dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - register JSAMPROW inptr, outptr; - register histptr cachep; - register int c0, c1, c2; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - inptr = input_buf[row]; - outptr = output_buf[row]; - for (col = width; col > 0; col--) { - /* get pixel value and index into the cache */ - c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT; - c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT; - c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT; - cachep = & histogram[c0][c1][c2]; - /* If we have not seen this color before, find nearest colormap entry */ - /* and update the cache */ - if (*cachep == 0) - fill_inverse_cmap(cinfo, c0,c1,c2); - /* Now emit the colormap index for this cell */ - *outptr++ = (JSAMPLE) (*cachep - 1); - } - } -} - - -METHODDEF(void) -pass2_fs_dither (j_decompress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) -/* This version performs Floyd-Steinberg dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */ - LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */ - LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */ - register FSERRPTR errorptr; /* => fserrors[] at column before current */ - JSAMPROW inptr; /* => current input pixel */ - JSAMPROW outptr; /* => current output pixel */ - histptr cachep; - int dir; /* +1 or -1 depending on direction */ - int dir3; /* 3*dir, for advancing inptr & errorptr */ - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - JSAMPLE *range_limit = cinfo->sample_range_limit; - int *error_limit = cquantize->error_limiter; - JSAMPROW colormap0 = cinfo->colormap[0]; - JSAMPROW colormap1 = cinfo->colormap[1]; - JSAMPROW colormap2 = cinfo->colormap[2]; - SHIFT_TEMPS - - for (row = 0; row < num_rows; row++) { - inptr = input_buf[row]; - outptr = output_buf[row]; - if (cquantize->on_odd_row) { - /* work right to left in this row */ - inptr += (width-1) * 3; /* so point to rightmost pixel */ - outptr += width-1; - dir = -1; - dir3 = -3; - errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */ - cquantize->on_odd_row = FALSE; /* flip for next time */ - } else { - /* work left to right in this row */ - dir = 1; - dir3 = 3; - errorptr = cquantize->fserrors; /* => entry before first real column */ - cquantize->on_odd_row = TRUE; /* flip for next time */ - } - /* Preset error values: no error propagated to first pixel from left */ - cur0 = cur1 = cur2 = 0; - /* and no error propagated to row below yet */ - belowerr0 = belowerr1 = belowerr2 = 0; - bpreverr0 = bpreverr1 = bpreverr2 = 0; - - for (col = width; col > 0; col--) { - /* curN holds the error propagated from the previous pixel on the - * current line. Add the error propagated from the previous line - * to form the complete error correction term for this pixel, and - * round the error term (which is expressed * 16) to an integer. - * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct - * for either sign of the error value. - * Note: errorptr points to *previous* column's array entry. - */ - cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4); - cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4); - cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4); - /* Limit the error using transfer function set by init_error_limit. - * See comments with init_error_limit for rationale. - */ - cur0 = error_limit[cur0]; - cur1 = error_limit[cur1]; - cur2 = error_limit[cur2]; - /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. - * The maximum error is +- MAXJSAMPLE (or less with error limiting); - * this sets the required size of the range_limit array. - */ - cur0 += GETJSAMPLE(inptr[0]); - cur1 += GETJSAMPLE(inptr[1]); - cur2 += GETJSAMPLE(inptr[2]); - cur0 = GETJSAMPLE(range_limit[cur0]); - cur1 = GETJSAMPLE(range_limit[cur1]); - cur2 = GETJSAMPLE(range_limit[cur2]); - /* Index into the cache with adjusted pixel value */ - cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT]; - /* If we have not seen this color before, find nearest colormap */ - /* entry and update the cache */ - if (*cachep == 0) - fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT); - /* Now emit the colormap index for this cell */ - { register int pixcode = *cachep - 1; - *outptr = (JSAMPLE) pixcode; - /* Compute representation error for this pixel */ - cur0 -= GETJSAMPLE(colormap0[pixcode]); - cur1 -= GETJSAMPLE(colormap1[pixcode]); - cur2 -= GETJSAMPLE(colormap2[pixcode]); - } - /* Compute error fractions to be propagated to adjacent pixels. - * Add these into the running sums, and simultaneously shift the - * next-line error sums left by 1 column. - */ - { register LOCFSERROR bnexterr, delta; - - bnexterr = cur0; /* Process component 0 */ - delta = cur0 * 2; - cur0 += delta; /* form error * 3 */ - errorptr[0] = (FSERROR) (bpreverr0 + cur0); - cur0 += delta; /* form error * 5 */ - bpreverr0 = belowerr0 + cur0; - belowerr0 = bnexterr; - cur0 += delta; /* form error * 7 */ - bnexterr = cur1; /* Process component 1 */ - delta = cur1 * 2; - cur1 += delta; /* form error * 3 */ - errorptr[1] = (FSERROR) (bpreverr1 + cur1); - cur1 += delta; /* form error * 5 */ - bpreverr1 = belowerr1 + cur1; - belowerr1 = bnexterr; - cur1 += delta; /* form error * 7 */ - bnexterr = cur2; /* Process component 2 */ - delta = cur2 * 2; - cur2 += delta; /* form error * 3 */ - errorptr[2] = (FSERROR) (bpreverr2 + cur2); - cur2 += delta; /* form error * 5 */ - bpreverr2 = belowerr2 + cur2; - belowerr2 = bnexterr; - cur2 += delta; /* form error * 7 */ - } - /* At this point curN contains the 7/16 error value to be propagated - * to the next pixel on the current line, and all the errors for the - * next line have been shifted over. We are therefore ready to move on. - */ - inptr += dir3; /* Advance pixel pointers to next column */ - outptr += dir; - errorptr += dir3; /* advance errorptr to current column */ - } - /* Post-loop cleanup: we must unload the final error values into the - * final fserrors[] entry. Note we need not unload belowerrN because - * it is for the dummy column before or after the actual array. - */ - errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */ - errorptr[1] = (FSERROR) bpreverr1; - errorptr[2] = (FSERROR) bpreverr2; - } -} - - -/* - * Initialize the error-limiting transfer function (lookup table). - * The raw F-S error computation can potentially compute error values of up to - * +- MAXJSAMPLE. But we want the maximum correction applied to a pixel to be - * much less, otherwise obviously wrong pixels will be created. (Typical - * effects include weird fringes at color-area boundaries, isolated bright - * pixels in a dark area, etc.) The standard advice for avoiding this problem - * is to ensure that the "corners" of the color cube are allocated as output - * colors; then repeated errors in the same direction cannot cause cascading - * error buildup. However, that only prevents the error from getting - * completely out of hand; Aaron Giles reports that error limiting improves - * the results even with corner colors allocated. - * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty - * well, but the smoother transfer function used below is even better. Thanks - * to Aaron Giles for this idea. - */ - -LOCAL(void) -init_error_limit (j_decompress_ptr cinfo) -/* Allocate and fill in the error_limiter table */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - int * table; - int in, out; - - table = (int *) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * SIZEOF(int)); - table += MAXJSAMPLE; /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */ - cquantize->error_limiter = table; - -#define STEPSIZE ((MAXJSAMPLE+1)/16) - /* Map errors 1:1 up to +- MAXJSAMPLE/16 */ - out = 0; - for (in = 0; in < STEPSIZE; in++, out++) { - table[in] = out; table[-in] = -out; - } - /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */ - for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) { - table[in] = out; table[-in] = -out; - } - /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */ - for (; in <= MAXJSAMPLE; in++) { - table[in] = out; table[-in] = -out; - } -#undef STEPSIZE -} - - -/* - * Finish up at the end of each pass. - */ - -METHODDEF(void) -finish_pass1 (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - - /* Select the representative colors and fill in cinfo->colormap */ - cinfo->colormap = cquantize->sv_colormap; - select_colors(cinfo, cquantize->desired); - /* Force next pass to zero the color index table */ - cquantize->needs_zeroed = TRUE; -} - - -METHODDEF(void) -finish_pass2 (j_decompress_ptr cinfo) -{ - /* no work */ -} - - -/* - * Initialize for each processing pass. - */ - -METHODDEF(void) -start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - int i; - - /* Only F-S dithering or no dithering is supported. */ - /* If user asks for ordered dither, give him F-S. */ - if (cinfo->dither_mode != JDITHER_NONE) - cinfo->dither_mode = JDITHER_FS; - - if (is_pre_scan) { - /* Set up method pointers */ - cquantize->pub.color_quantize = prescan_quantize; - cquantize->pub.finish_pass = finish_pass1; - cquantize->needs_zeroed = TRUE; /* Always zero histogram */ - } else { - /* Set up method pointers */ - if (cinfo->dither_mode == JDITHER_FS) - cquantize->pub.color_quantize = pass2_fs_dither; - else - cquantize->pub.color_quantize = pass2_no_dither; - cquantize->pub.finish_pass = finish_pass2; - - /* Make sure color count is acceptable */ - i = cinfo->actual_number_of_colors; - if (i < 1) - ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1); - if (i > MAXNUMCOLORS) - ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); - - if (cinfo->dither_mode == JDITHER_FS) { - size_t arraysize = (size_t) ((cinfo->output_width + 2) * - (3 * SIZEOF(FSERROR))); - /* Allocate Floyd-Steinberg workspace if we didn't already. */ - if (cquantize->fserrors == NULL) - cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); - /* Initialize the propagated errors to zero. */ - jzero_far((void FAR *) cquantize->fserrors, arraysize); - /* Make the error-limit table if we didn't already. */ - if (cquantize->error_limiter == NULL) - init_error_limit(cinfo); - cquantize->on_odd_row = FALSE; - } - - } - /* Zero the histogram or inverse color map, if necessary */ - if (cquantize->needs_zeroed) { - for (i = 0; i < HIST_C0_ELEMS; i++) { - jzero_far((void FAR *) histogram[i], - HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); - } - cquantize->needs_zeroed = FALSE; - } -} - - -/* - * Switch to a new external colormap between output passes. - */ - -METHODDEF(void) -new_color_map_2_quant (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - - /* Reset the inverse color map */ - cquantize->needs_zeroed = TRUE; -} - - -/* - * Module initialization routine for 2-pass color quantization. - */ - -GLOBAL(void) -jinit_2pass_quantizer (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize; - int i; - - cquantize = (my_cquantize_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_cquantizer)); - cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; - cquantize->pub.start_pass = start_pass_2_quant; - cquantize->pub.new_color_map = new_color_map_2_quant; - cquantize->fserrors = NULL; /* flag optional arrays not allocated */ - cquantize->error_limiter = NULL; - - /* Make sure jdmaster didn't give me a case I can't handle */ - if (cinfo->out_color_components != 3) - ERREXIT(cinfo, JERR_NOTIMPL); - - /* Allocate the histogram/inverse colormap storage */ - cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF(hist2d)); - for (i = 0; i < HIST_C0_ELEMS; i++) { - cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); - } - cquantize->needs_zeroed = TRUE; /* histogram is garbage now */ - - /* Allocate storage for the completed colormap, if required. - * We do this now since it is FAR storage and may affect - * the memory manager's space calculations. - */ - if (cinfo->enable_2pass_quant) { - /* Make sure color count is acceptable */ - int desired = cinfo->desired_number_of_colors; - /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */ - if (desired < 8) - ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8); - /* Make sure colormap indexes can be represented by JSAMPLEs */ - if (desired > MAXNUMCOLORS) - ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); - cquantize->sv_colormap = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3); - cquantize->desired = desired; - } else - cquantize->sv_colormap = NULL; - - /* Only F-S dithering or no dithering is supported. */ - /* If user asks for ordered dither, give him F-S. */ - if (cinfo->dither_mode != JDITHER_NONE) - cinfo->dither_mode = JDITHER_FS; - - /* Allocate Floyd-Steinberg workspace if necessary. - * This isn't really needed until pass 2, but again it is FAR storage. - * Although we will cope with a later change in dither_mode, - * we do not promise to honor max_memory_to_use if dither_mode changes. - */ - if (cinfo->dither_mode == JDITHER_FS) { - cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR)))); - /* Might as well create the error-limiting table too. */ - init_error_limit(cinfo); - } -} - -#endif /* QUANT_2PASS_SUPPORTED */ diff --git a/src/SFML/Graphics/libjpeg/jutils.c b/src/SFML/Graphics/libjpeg/jutils.c deleted file mode 100644 index 286cda20..00000000 --- a/src/SFML/Graphics/libjpeg/jutils.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * jutils.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains tables and miscellaneous utility routines needed - * for both compression and decompression. - * Note we prefix all global names with "j" to minimize conflicts with - * a surrounding application. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element - * of a DCT block read in natural order (left to right, top to bottom). - */ - -#if 0 /* This table is not actually needed in v6a */ - -const int jpeg_zigzag_order[DCTSIZE2] = { - 0, 1, 5, 6, 14, 15, 27, 28, - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63 -}; - -#endif - -/* - * jpeg_natural_order[i] is the natural-order position of the i'th element - * of zigzag order. - * - * When reading corrupted data, the Huffman decoders could attempt - * to reference an entry beyond the end of this array (if the decoded - * zero run length reaches past the end of the block). To prevent - * wild stores without adding an inner-loop test, we put some extra - * "63"s after the real entries. This will cause the extra coefficient - * to be stored in location 63 of the block, not somewhere random. - * The worst case would be a run-length of 15, which means we need 16 - * fake entries. - */ - -const int jpeg_natural_order[DCTSIZE2+16] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 -}; - - -/* - * Arithmetic utilities - */ - -GLOBAL(long) -jdiv_round_up (long a, long b) -/* Compute a/b rounded up to next integer, ie, ceil(a/b) */ -/* Assumes a >= 0, b > 0 */ -{ - return (a + b - 1L) / b; -} - - -GLOBAL(long) -jround_up (long a, long b) -/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */ -/* Assumes a >= 0, b > 0 */ -{ - a += b - 1L; - return a - (a % b); -} - - -/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays - * and coefficient-block arrays. This won't work on 80x86 because the arrays - * are FAR and we're assuming a small-pointer memory model. However, some - * DOS compilers provide far-pointer versions of memcpy() and memset() even - * in the small-model libraries. These will be used if USE_FMEM is defined. - * Otherwise, the routines below do it the hard way. (The performance cost - * is not all that great, because these routines aren't very heavily used.) - */ - -#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ -#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) -#define FMEMZERO(target,size) MEMZERO(target,size) -#else /* 80x86 case, define if we can */ -#ifdef USE_FMEM -#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size)) -#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) -#endif -#endif - - -GLOBAL(void) -jcopy_sample_rows (JSAMPARRAY input_array, int source_row, - JSAMPARRAY output_array, int dest_row, - int num_rows, JDIMENSION num_cols) -/* Copy some rows of samples from one place to another. - * num_rows rows are copied from input_array[source_row++] - * to output_array[dest_row++]; these areas may overlap for duplication. - * The source and destination arrays must be at least as wide as num_cols. - */ -{ - register JSAMPROW inptr, outptr; -#ifdef FMEMCOPY - register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE)); -#else - register JDIMENSION count; -#endif - register int row; - - input_array += source_row; - output_array += dest_row; - - for (row = num_rows; row > 0; row--) { - inptr = *input_array++; - outptr = *output_array++; -#ifdef FMEMCOPY - FMEMCOPY(outptr, inptr, count); -#else - for (count = num_cols; count > 0; count--) - *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */ -#endif - } -} - - -GLOBAL(void) -jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, - JDIMENSION num_blocks) -/* Copy a row of coefficient blocks from one place to another. */ -{ -#ifdef FMEMCOPY - FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF))); -#else - register JCOEFPTR inptr, outptr; - register long count; - - inptr = (JCOEFPTR) input_row; - outptr = (JCOEFPTR) output_row; - for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) { - *outptr++ = *inptr++; - } -#endif -} - - -GLOBAL(void) -jzero_far (void FAR * target, size_t bytestozero) -/* Zero out a chunk of FAR memory. */ -/* This might be sample-array data, block-array data, or alloc_large data. */ -{ -#ifdef FMEMZERO - FMEMZERO(target, bytestozero); -#else - register char FAR * ptr = (char FAR *) target; - register size_t count; - - for (count = bytestozero; count > 0; count--) { - *ptr++ = 0; - } -#endif -} diff --git a/src/SFML/Graphics/libjpeg/jversion.h b/src/SFML/Graphics/libjpeg/jversion.h deleted file mode 100644 index dadd453a..00000000 --- a/src/SFML/Graphics/libjpeg/jversion.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * jversion.h - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains software version identification. - */ - - -#define JVERSION "6b 27-Mar-1998" - -#define JCOPYRIGHT "Copyright (C) 1998, Thomas G. Lane" diff --git a/src/SFML/Graphics/libpng/png.c b/src/SFML/Graphics/libpng/png.c deleted file mode 100644 index 1b6db94d..00000000 --- a/src/SFML/Graphics/libpng/png.c +++ /dev/null @@ -1,828 +0,0 @@ - -/* png.c - location for general purpose libpng functions - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - */ - -#define PNG_INTERNAL -#define PNG_NO_EXTERN -#include "png.h" - -/* Generate a compiler error if there is an old png.h in the search path. */ -typedef version_1_2_8 Your_png_h_is_not_version_1_2_8; - -/* Version information for C files. This had better match the version - * string defined in png.h. */ - -#ifdef PNG_USE_GLOBAL_ARRAYS -/* png_libpng_ver was changed to a function in version 1.0.5c */ -const char png_libpng_ver[18] = PNG_LIBPNG_VER_STRING; - -/* png_sig was changed to a function in version 1.0.5c */ -/* Place to hold the signature string for a PNG file. */ -const png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10}; - -/* Invoke global declarations for constant strings for known chunk types */ -PNG_IHDR; -PNG_IDAT; -PNG_IEND; -PNG_PLTE; -PNG_bKGD; -PNG_cHRM; -PNG_gAMA; -PNG_hIST; -PNG_iCCP; -PNG_iTXt; -PNG_oFFs; -PNG_pCAL; -PNG_sCAL; -PNG_pHYs; -PNG_sBIT; -PNG_sPLT; -PNG_sRGB; -PNG_tEXt; -PNG_tIME; -PNG_tRNS; -PNG_zTXt; - -/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - -/* start of interlace block */ -const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; - -/* offset to next interlace block */ -const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; - -/* start of interlace block in the y direction */ -const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; - -/* offset to next interlace block in the y direction */ -const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; - -/* width of interlace block (used in assembler routines only) */ -#ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW -const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; -#endif - -/* Height of interlace block. This is not currently used - if you need - * it, uncomment it here and in png.h -const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; -*/ - -/* Mask to determine which pixels are valid in a pass */ -const int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; - -/* Mask to determine which pixels to overwrite while displaying */ -const int FARDATA png_pass_dsp_mask[] - = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; - -#endif /* PNG_USE_GLOBAL_ARRAYS */ - -/* Tells libpng that we have already handled the first "num_bytes" bytes - * of the PNG file signature. If the PNG data is embedded into another - * stream we can set num_bytes = 8 so that libpng will not attempt to read - * or write any of the magic bytes before it starts on the IHDR. - */ - -void PNGAPI -png_set_sig_bytes(png_structp png_ptr, int num_bytes) -{ - png_debug(1, "in png_set_sig_bytes\n"); - if (num_bytes > 8) - png_error(png_ptr, "Too many bytes for PNG signature."); - - png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes); -} - -/* Checks whether the supplied bytes match the PNG signature. We allow - * checking less than the full 8-byte signature so that those apps that - * already read the first few bytes of a file to determine the file type - * can simply check the remaining bytes for extra assurance. Returns - * an integer less than, equal to, or greater than zero if sig is found, - * respectively, to be less than, to match, or be greater than the correct - * PNG signature (this is the same behaviour as strcmp, memcmp, etc). - */ -int PNGAPI -png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check) -{ - png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; - if (num_to_check > 8) - num_to_check = 8; - else if (num_to_check < 1) - return (0); - - if (start > 7) - return (0); - - if (start + num_to_check > 8) - num_to_check = 8 - start; - - return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check))); -} - -/* (Obsolete) function to check signature bytes. It does not allow one - * to check a partial signature. This function might be removed in the - * future - use png_sig_cmp(). Returns true (nonzero) if the file is a PNG. - */ -int PNGAPI -png_check_sig(png_bytep sig, int num) -{ - return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num)); -} - -/* Function to allocate memory for zlib and clear it to 0. */ -#ifdef PNG_1_0_X -voidpf PNGAPI -#else -voidpf /* private */ -#endif -png_zalloc(voidpf png_ptr, uInt items, uInt size) -{ - png_voidp ptr; - png_structp p=png_ptr; - png_uint_32 save_flags=p->flags; - png_uint_32 num_bytes; - - if (items > PNG_UINT_32_MAX/size) - { - png_warning (png_ptr, "Potential overflow in png_zalloc()"); - return (NULL); - } - num_bytes = (png_uint_32)items * size; - - p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; - ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes); - p->flags=save_flags; - -#if defined(PNG_1_0_X) && !defined(PNG_NO_ZALLOC_ZERO) - if (ptr == NULL) - return ((voidpf)ptr); - - if (num_bytes > (png_uint_32)0x8000L) - { - png_memset(ptr, 0, (png_size_t)0x8000L); - png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0, - (png_size_t)(num_bytes - (png_uint_32)0x8000L)); - } - else - { - png_memset(ptr, 0, (png_size_t)num_bytes); - } -#endif - return ((voidpf)ptr); -} - -/* function to free memory for zlib */ -#ifdef PNG_1_0_X -void PNGAPI -#else -void /* private */ -#endif -png_zfree(voidpf png_ptr, voidpf ptr) -{ - png_free((png_structp)png_ptr, (png_voidp)ptr); -} - -/* Reset the CRC variable to 32 bits of 1's. Care must be taken - * in case CRC is > 32 bits to leave the top bits 0. - */ -void /* PRIVATE */ -png_reset_crc(png_structp png_ptr) -{ - png_ptr->crc = crc32(0, Z_NULL, 0); -} - -/* Calculate the CRC over a section of data. We can only pass as - * much data to this routine as the largest single buffer size. We - * also check that this data will actually be used before going to the - * trouble of calculating it. - */ -void /* PRIVATE */ -png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length) -{ - int need_crc = 1; - - if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ - { - if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == - (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) - need_crc = 0; - } - else /* critical */ - { - if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) - need_crc = 0; - } - - if (need_crc) - png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length); -} - -/* Allocate the memory for an info_struct for the application. We don't - * really need the png_ptr, but it could potentially be useful in the - * future. This should be used in favour of malloc(png_sizeof(png_info)) - * and png_info_init() so that applications that want to use a shared - * libpng don't have to be recompiled if png_info changes size. - */ -png_infop PNGAPI -png_create_info_struct(png_structp png_ptr) -{ - png_infop info_ptr; - - png_debug(1, "in png_create_info_struct\n"); - if(png_ptr == NULL) return (NULL); -#ifdef PNG_USER_MEM_SUPPORTED - info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO, - png_ptr->malloc_fn, png_ptr->mem_ptr); -#else - info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); -#endif - if (info_ptr != NULL) - png_info_init_3(&info_ptr, png_sizeof(png_info)); - - return (info_ptr); -} - -/* This function frees the memory associated with a single info struct. - * Normally, one would use either png_destroy_read_struct() or - * png_destroy_write_struct() to free an info struct, but this may be - * useful for some applications. - */ -void PNGAPI -png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr) -{ - png_infop info_ptr = NULL; - - png_debug(1, "in png_destroy_info_struct\n"); - if (info_ptr_ptr != NULL) - info_ptr = *info_ptr_ptr; - - if (info_ptr != NULL) - { - png_info_destroy(png_ptr, info_ptr); - -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn, - png_ptr->mem_ptr); -#else - png_destroy_struct((png_voidp)info_ptr); -#endif - *info_ptr_ptr = NULL; - } -} - -/* Initialize the info structure. This is now an internal function (0.89) - * and applications using it are urged to use png_create_info_struct() - * instead. - */ -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -#undef png_info_init -void PNGAPI -png_info_init(png_infop info_ptr) -{ - /* We only come here via pre-1.0.12-compiled applications */ - png_info_init_3(&info_ptr, 0); -} -#endif - -void PNGAPI -png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size) -{ - png_infop info_ptr = *ptr_ptr; - - png_debug(1, "in png_info_init_3\n"); - - if(png_sizeof(png_info) > png_info_struct_size) - { - png_destroy_struct(info_ptr); - info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); - *ptr_ptr = info_ptr; - } - - /* set everything to 0 */ - png_memset(info_ptr, 0, png_sizeof (png_info)); -} - -#ifdef PNG_FREE_ME_SUPPORTED -void PNGAPI -png_data_freer(png_structp png_ptr, png_infop info_ptr, - int freer, png_uint_32 mask) -{ - png_debug(1, "in png_data_freer\n"); - if (png_ptr == NULL || info_ptr == NULL) - return; - if(freer == PNG_DESTROY_WILL_FREE_DATA) - info_ptr->free_me |= mask; - else if(freer == PNG_USER_WILL_FREE_DATA) - info_ptr->free_me &= ~mask; - else - png_warning(png_ptr, - "Unknown freer parameter in png_data_freer."); -} -#endif - -void PNGAPI -png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, - int num) -{ - png_debug(1, "in png_free_data\n"); - if (png_ptr == NULL || info_ptr == NULL) - return; - -#if defined(PNG_TEXT_SUPPORTED) -/* free text item num or (if num == -1) all text items */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) -#else -if (mask & PNG_FREE_TEXT) -#endif -{ - if (num != -1) - { - if (info_ptr->text && info_ptr->text[num].key) - { - png_free(png_ptr, info_ptr->text[num].key); - info_ptr->text[num].key = NULL; - } - } - else - { - int i; - for (i = 0; i < info_ptr->num_text; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); - png_free(png_ptr, info_ptr->text); - info_ptr->text = NULL; - info_ptr->num_text=0; - } -} -#endif - -#if defined(PNG_tRNS_SUPPORTED) -/* free any tRNS entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) -#else -if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS)) -#endif -{ - png_free(png_ptr, info_ptr->trans); - info_ptr->valid &= ~PNG_INFO_tRNS; -#ifndef PNG_FREE_ME_SUPPORTED - png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; -#endif - info_ptr->trans = NULL; -} -#endif - -#if defined(PNG_sCAL_SUPPORTED) -/* free any sCAL entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) -#else -if (mask & PNG_FREE_SCAL) -#endif -{ -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, info_ptr->scal_s_width); - png_free(png_ptr, info_ptr->scal_s_height); - info_ptr->scal_s_width = NULL; - info_ptr->scal_s_height = NULL; -#endif - info_ptr->valid &= ~PNG_INFO_sCAL; -} -#endif - -#if defined(PNG_pCAL_SUPPORTED) -/* free any pCAL entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) -#else -if (mask & PNG_FREE_PCAL) -#endif -{ - png_free(png_ptr, info_ptr->pcal_purpose); - png_free(png_ptr, info_ptr->pcal_units); - info_ptr->pcal_purpose = NULL; - info_ptr->pcal_units = NULL; - if (info_ptr->pcal_params != NULL) - { - int i; - for (i = 0; i < (int)info_ptr->pcal_nparams; i++) - { - png_free(png_ptr, info_ptr->pcal_params[i]); - info_ptr->pcal_params[i]=NULL; - } - png_free(png_ptr, info_ptr->pcal_params); - info_ptr->pcal_params = NULL; - } - info_ptr->valid &= ~PNG_INFO_pCAL; -} -#endif - -#if defined(PNG_iCCP_SUPPORTED) -/* free any iCCP entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) -#else -if (mask & PNG_FREE_ICCP) -#endif -{ - png_free(png_ptr, info_ptr->iccp_name); - png_free(png_ptr, info_ptr->iccp_profile); - info_ptr->iccp_name = NULL; - info_ptr->iccp_profile = NULL; - info_ptr->valid &= ~PNG_INFO_iCCP; -} -#endif - -#if defined(PNG_sPLT_SUPPORTED) -/* free a given sPLT entry, or (if num == -1) all sPLT entries */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) -#else -if (mask & PNG_FREE_SPLT) -#endif -{ - if (num != -1) - { - if(info_ptr->splt_palettes) - { - png_free(png_ptr, info_ptr->splt_palettes[num].name); - png_free(png_ptr, info_ptr->splt_palettes[num].entries); - info_ptr->splt_palettes[num].name = NULL; - info_ptr->splt_palettes[num].entries = NULL; - } - } - else - { - if(info_ptr->splt_palettes_num) - { - int i; - for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i); - - png_free(png_ptr, info_ptr->splt_palettes); - info_ptr->splt_palettes = NULL; - info_ptr->splt_palettes_num = 0; - } - info_ptr->valid &= ~PNG_INFO_sPLT; - } -} -#endif - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) -#else -if (mask & PNG_FREE_UNKN) -#endif -{ - if (num != -1) - { - if(info_ptr->unknown_chunks) - { - png_free(png_ptr, info_ptr->unknown_chunks[num].data); - info_ptr->unknown_chunks[num].data = NULL; - } - } - else - { - int i; - - if(info_ptr->unknown_chunks_num) - { - for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); - - png_free(png_ptr, info_ptr->unknown_chunks); - info_ptr->unknown_chunks = NULL; - info_ptr->unknown_chunks_num = 0; - } - } -} -#endif - -#if defined(PNG_hIST_SUPPORTED) -/* free any hIST entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_HIST) & info_ptr->free_me) -#else -if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST)) -#endif -{ - png_free(png_ptr, info_ptr->hist); - info_ptr->hist = NULL; - info_ptr->valid &= ~PNG_INFO_hIST; -#ifndef PNG_FREE_ME_SUPPORTED - png_ptr->flags &= ~PNG_FLAG_FREE_HIST; -#endif -} -#endif - -/* free any PLTE entry that was internally allocated */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) -#else -if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE)) -#endif -{ - png_zfree(png_ptr, info_ptr->palette); - info_ptr->palette = NULL; - info_ptr->valid &= ~PNG_INFO_PLTE; -#ifndef PNG_FREE_ME_SUPPORTED - png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; -#endif - info_ptr->num_palette = 0; -} - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -/* free any image bits attached to the info structure */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) -#else -if (mask & PNG_FREE_ROWS) -#endif -{ - if(info_ptr->row_pointers) - { - int row; - for (row = 0; row < (int)info_ptr->height; row++) - { - png_free(png_ptr, info_ptr->row_pointers[row]); - info_ptr->row_pointers[row]=NULL; - } - png_free(png_ptr, info_ptr->row_pointers); - info_ptr->row_pointers=NULL; - } - info_ptr->valid &= ~PNG_INFO_IDAT; -} -#endif - -#ifdef PNG_FREE_ME_SUPPORTED - if(num == -1) - info_ptr->free_me &= ~mask; - else - info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL); -#endif -} - -/* This is an internal routine to free any memory that the info struct is - * pointing to before re-using it or freeing the struct itself. Recall - * that png_free() checks for NULL pointers for us. - */ -void /* PRIVATE */ -png_info_destroy(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_info_destroy\n"); - - png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - if (png_ptr->num_chunk_list) - { - png_free(png_ptr, png_ptr->chunk_list); - png_ptr->chunk_list=NULL; - png_ptr->num_chunk_list=0; - } -#endif - - png_info_init_3(&info_ptr, png_sizeof(png_info)); -} - -/* This function returns a pointer to the io_ptr associated with the user - * functions. The application should free any memory associated with this - * pointer before png_write_destroy() or png_read_destroy() are called. - */ -png_voidp PNGAPI -png_get_io_ptr(png_structp png_ptr) -{ - return (png_ptr->io_ptr); -} - -#if !defined(PNG_NO_STDIO) -/* Initialize the default input/output functions for the PNG file. If you - * use your own read or write routines, you can call either png_set_read_fn() - * or png_set_write_fn() instead of png_init_io(). If you have defined - * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't - * necessarily available. - */ -void PNGAPI -png_init_io(png_structp png_ptr, png_FILE_p fp) -{ - png_debug(1, "in png_init_io\n"); - png_ptr->io_ptr = (png_voidp)fp; -} -#endif - -#if defined(PNG_TIME_RFC1123_SUPPORTED) -/* Convert the supplied time into an RFC 1123 string suitable for use in - * a "Creation Time" or other text-based time string. - */ -png_charp PNGAPI -png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime) -{ - static PNG_CONST char short_months[12][4] = - {"Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - - if (png_ptr->time_buffer == NULL) - { - png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29* - png_sizeof(char))); - } - -#if defined(_WIN32_WCE) - { - wchar_t time_buf[29]; - wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"), - ptime->day % 32, short_months[(ptime->month - 1) % 12], - ptime->year, ptime->hour % 24, ptime->minute % 60, - ptime->second % 61); - WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29, - NULL, NULL); - } -#else -#ifdef USE_FAR_KEYWORD - { - char near_time_buf[29]; - sprintf(near_time_buf, "%d %s %d %02d:%02d:%02d +0000", - ptime->day % 32, short_months[(ptime->month - 1) % 12], - ptime->year, ptime->hour % 24, ptime->minute % 60, - ptime->second % 61); - png_memcpy(png_ptr->time_buffer, near_time_buf, - 29*png_sizeof(char)); - } -#else - sprintf(png_ptr->time_buffer, "%d %s %d %02d:%02d:%02d +0000", - ptime->day % 32, short_months[(ptime->month - 1) % 12], - ptime->year, ptime->hour % 24, ptime->minute % 60, - ptime->second % 61); -#endif -#endif /* _WIN32_WCE */ - return ((png_charp)png_ptr->time_buffer); -} -#endif /* PNG_TIME_RFC1123_SUPPORTED */ - -#if 0 -/* Signature string for a PNG file. */ -png_bytep PNGAPI -png_sig_bytes(void) -{ - return ((png_bytep)"\211\120\116\107\015\012\032\012"); -} -#endif - -png_charp PNGAPI -png_get_copyright(png_structp png_ptr) -{ - if (&png_ptr != NULL) /* silence compiler warning about unused png_ptr */ - return ((png_charp) "\n libpng version 1.2.8 - December 3, 2004\n\ - Copyright (c) 1998-2004 Glenn Randers-Pehrson\n\ - Copyright (c) 1996-1997 Andreas Dilger\n\ - Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n"); - return ((png_charp) ""); -} - -/* The following return the library version as a short string in the - * format 1.0.0 through 99.99.99zz. To get the version of *.h files - * used with your application, print out PNG_LIBPNG_VER_STRING, which - * is defined in png.h. - * Note: now there is no difference between png_get_libpng_ver() and - * png_get_header_ver(). Due to the version_nn_nn_nn typedef guard, - * it is guaranteed that png.c uses the correct version of png.h. - */ -png_charp PNGAPI -png_get_libpng_ver(png_structp png_ptr) -{ - /* Version of *.c files used when building libpng */ - if (&png_ptr != NULL) /* silence compiler warning about unused png_ptr */ - return ((png_charp) PNG_LIBPNG_VER_STRING); - return ((png_charp) ""); -} - -png_charp PNGAPI -png_get_header_ver(png_structp png_ptr) -{ - /* Version of *.h files used when building libpng */ - if (&png_ptr != NULL) /* silence compiler warning about unused png_ptr */ - return ((png_charp) PNG_LIBPNG_VER_STRING); - return ((png_charp) ""); -} - -png_charp PNGAPI -png_get_header_version(png_structp png_ptr) -{ - /* Returns longer string containing both version and date */ - if (&png_ptr != NULL) /* silence compiler warning about unused png_ptr */ - return ((png_charp) PNG_HEADER_VERSION_STRING); - return ((png_charp) ""); -} - -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -int PNGAPI -png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name) -{ - /* check chunk_name and return "keep" value if it's on the list, else 0 */ - int i; - png_bytep p; - if((png_ptr == NULL && chunk_name == NULL) || png_ptr->num_chunk_list<=0) - return 0; - p=png_ptr->chunk_list+png_ptr->num_chunk_list*5-5; - for (i = png_ptr->num_chunk_list; i; i--, p-=5) - if (!png_memcmp(chunk_name, p, 4)) - return ((int)*(p+4)); - return 0; -} -#endif - -/* This function, added to libpng-1.0.6g, is untested. */ -int PNGAPI -png_reset_zstream(png_structp png_ptr) -{ - return (inflateReset(&png_ptr->zstream)); -} - -/* This function was added to libpng-1.0.7 */ -png_uint_32 PNGAPI -png_access_version_number(void) -{ - /* Version of *.c files used when building libpng */ - return((png_uint_32) PNG_LIBPNG_VER); -} - - -#if !defined(PNG_1_0_X) -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) - /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */ -/* this INTERNAL function was added to libpng 1.2.0 */ -void /* PRIVATE */ -png_init_mmx_flags (png_structp png_ptr) -{ - png_ptr->mmx_rowbytes_threshold = 0; - png_ptr->mmx_bitdepth_threshold = 0; - -# if (defined(PNG_USE_PNGVCRD) || defined(PNG_USE_PNGGCCRD)) - - png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_COMPILED; - - if (png_mmx_support() > 0) { - png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU -# ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW - | PNG_ASM_FLAG_MMX_READ_COMBINE_ROW -# endif -# ifdef PNG_HAVE_ASSEMBLER_READ_INTERLACE - | PNG_ASM_FLAG_MMX_READ_INTERLACE -# endif -# ifndef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW - ; -# else - | PNG_ASM_FLAG_MMX_READ_FILTER_SUB - | PNG_ASM_FLAG_MMX_READ_FILTER_UP - | PNG_ASM_FLAG_MMX_READ_FILTER_AVG - | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; - - png_ptr->mmx_rowbytes_threshold = PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT; - png_ptr->mmx_bitdepth_threshold = PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT; -# endif - } else { - png_ptr->asm_flags &= ~( PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU - | PNG_MMX_READ_FLAGS - | PNG_MMX_WRITE_FLAGS ); - } - -# else /* !((PNGVCRD || PNGGCCRD) && PNG_ASSEMBLER_CODE_SUPPORTED)) */ - - /* clear all MMX flags; no support is compiled in */ - png_ptr->asm_flags &= ~( PNG_MMX_FLAGS ); - -# endif /* ?(PNGVCRD || PNGGCCRD) */ -} - -#endif /* !(PNG_ASSEMBLER_CODE_SUPPORTED) */ - -/* this function was added to libpng 1.2.0 */ -#if !defined(PNG_USE_PNGGCCRD) && \ - !(defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_USE_PNGVCRD)) -int PNGAPI -png_mmx_support(void) -{ - return -1; -} -#endif -#endif /* PNG_1_0_X */ - -#ifdef PNG_SIZE_T -/* Added at libpng version 1.2.6 */ - PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); -png_size_t PNGAPI -png_convert_size(size_t size) -{ - if (size > (png_size_t)-1) - PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */ - return ((png_size_t)size); -} -#endif /* PNG_SIZE_T */ diff --git a/src/SFML/Graphics/libpng/pngerror.c b/src/SFML/Graphics/libpng/pngerror.c deleted file mode 100644 index b06f55e0..00000000 --- a/src/SFML/Graphics/libpng/pngerror.c +++ /dev/null @@ -1,295 +0,0 @@ - -/* pngerror.c - stub functions for i/o and memory allocation - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This file provides a location for all error handling. Users who - * need special error handling are expected to write replacement functions - * and use png_set_error_fn() to use those functions. See the instructions - * at each function. - */ - -#define PNG_INTERNAL -#include "png.h" - -static void /* PRIVATE */ -png_default_error PNGARG((png_structp png_ptr, - png_const_charp error_message)); -static void /* PRIVATE */ -png_default_warning PNGARG((png_structp png_ptr, - png_const_charp warning_message)); - -/* This function is called whenever there is a fatal error. This function - * should not be changed. If there is a need to handle errors differently, - * you should supply a replacement error function and use png_set_error_fn() - * to replace the error function at run-time. - */ -void PNGAPI -png_error(png_structp png_ptr, png_const_charp error_message) -{ -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - char msg[16]; - if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) - { - if (*error_message == '#') - { - int offset; - for (offset=1; offset<15; offset++) - if (*(error_message+offset) == ' ') - break; - if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) - { - int i; - for (i=0; iflags&PNG_FLAG_STRIP_ERROR_TEXT) - { - msg[0]='0'; - msg[1]='\0'; - error_message=msg; - } - } - } -#endif - if (png_ptr != NULL && png_ptr->error_fn != NULL) - (*(png_ptr->error_fn))(png_ptr, error_message); - - /* If the custom handler doesn't exist, or if it returns, - use the default handler, which will not return. */ - png_default_error(png_ptr, error_message); -} - -/* This function is called whenever there is a non-fatal error. This function - * should not be changed. If there is a need to handle warnings differently, - * you should supply a replacement warning function and use - * png_set_error_fn() to replace the warning function at run-time. - */ -void PNGAPI -png_warning(png_structp png_ptr, png_const_charp warning_message) -{ - int offset = 0; -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) -#endif - { - if (*warning_message == '#') - { - for (offset=1; offset<15; offset++) - if (*(warning_message+offset) == ' ') - break; - } - } - if (png_ptr != NULL && png_ptr->warning_fn != NULL) - (*(png_ptr->warning_fn))(png_ptr, warning_message+offset); - else - png_default_warning(png_ptr, warning_message+offset); -} - -/* These utilities are used internally to build an error message that relates - * to the current chunk. The chunk name comes from png_ptr->chunk_name, - * this is used to prefix the message. The message is limited in length - * to 63 bytes, the name characters are output as hex digits wrapped in [] - * if the character is invalid. - */ -#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) -static PNG_CONST char png_digit[16] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F' -}; - -static void /* PRIVATE */ -png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp - error_message) -{ - int iout = 0, iin = 0; - - while (iin < 4) - { - int c = png_ptr->chunk_name[iin++]; - if (isnonalpha(c)) - { - buffer[iout++] = '['; - buffer[iout++] = png_digit[(c & 0xf0) >> 4]; - buffer[iout++] = png_digit[c & 0x0f]; - buffer[iout++] = ']'; - } - else - { - buffer[iout++] = (png_byte)c; - } - } - - if (error_message == NULL) - buffer[iout] = 0; - else - { - buffer[iout++] = ':'; - buffer[iout++] = ' '; - png_strncpy(buffer+iout, error_message, 63); - buffer[iout+63] = 0; - } -} - -void PNGAPI -png_chunk_error(png_structp png_ptr, png_const_charp error_message) -{ - char msg[18+64]; - png_format_buffer(png_ptr, msg, error_message); - png_error(png_ptr, msg); -} - -void PNGAPI -png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) -{ - char msg[18+64]; - png_format_buffer(png_ptr, msg, warning_message); - png_warning(png_ptr, msg); -} - -/* This is the default error handling function. Note that replacements for - * this function MUST NOT RETURN, or the program will likely crash. This - * function is used by default, or if the program supplies NULL for the - * error function pointer in png_set_error_fn(). - */ -static void /* PRIVATE */ -png_default_error(png_structp png_ptr, png_const_charp error_message) -{ -#ifndef PNG_NO_CONSOLE_IO -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - if (*error_message == '#') - { - int offset; - char error_number[16]; - for (offset=0; offset<15; offset++) - { - error_number[offset] = *(error_message+offset+1); - if (*(error_message+offset) == ' ') - break; - } - if((offset > 1) && (offset < 15)) - { - error_number[offset-1]='\0'; - fprintf(stderr, "libpng error no. %s: %s\n", error_number, - error_message+offset); - } - else - fprintf(stderr, "libpng error: %s, offset=%d\n", error_message,offset); - } - else -#endif - fprintf(stderr, "libpng error: %s\n", error_message); -#endif - -#ifdef PNG_SETJMP_SUPPORTED -# ifdef USE_FAR_KEYWORD - { - jmp_buf jmpbuf; - png_memcpy(jmpbuf,png_ptr->jmpbuf,png_sizeof(jmp_buf)); - longjmp(jmpbuf, 1); - } -# else - longjmp(png_ptr->jmpbuf, 1); -# endif -#else - /* make compiler happy */ ; - if (png_ptr) - PNG_ABORT(); -#endif -#ifdef PNG_NO_CONSOLE_IO - /* make compiler happy */ ; - if (&error_message != NULL) - return; -#endif -} - -/* This function is called when there is a warning, but the library thinks - * it can continue anyway. Replacement functions don't have to do anything - * here if you don't want them to. In the default configuration, png_ptr is - * not used, but it is passed in case it may be useful. - */ -static void /* PRIVATE */ -png_default_warning(png_structp png_ptr, png_const_charp warning_message) -{ -#ifndef PNG_NO_CONSOLE_IO -# ifdef PNG_ERROR_NUMBERS_SUPPORTED - if (*warning_message == '#') - { - int offset; - char warning_number[16]; - for (offset=0; offset<15; offset++) - { - warning_number[offset]=*(warning_message+offset+1); - if (*(warning_message+offset) == ' ') - break; - } - if((offset > 1) && (offset < 15)) - { - warning_number[offset-1]='\0'; - fprintf(stderr, "libpng warning no. %s: %s\n", warning_number, - warning_message+offset); - } - else - fprintf(stderr, "libpng warning: %s\n", warning_message); - } - else -# endif - fprintf(stderr, "libpng warning: %s\n", warning_message); -#else - /* make compiler happy */ ; - if (warning_message) - return; -#endif - /* make compiler happy */ ; - if (png_ptr) - return; -} - -/* This function is called when the application wants to use another method - * of handling errors and warnings. Note that the error function MUST NOT - * return to the calling routine or serious problems will occur. The return - * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1) - */ -void PNGAPI -png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warning_fn) -{ - png_ptr->error_ptr = error_ptr; - png_ptr->error_fn = error_fn; - png_ptr->warning_fn = warning_fn; -} - - -/* This function returns a pointer to the error_ptr associated with the user - * functions. The application should free any memory associated with this - * pointer before png_write_destroy and png_read_destroy are called. - */ -png_voidp PNGAPI -png_get_error_ptr(png_structp png_ptr) -{ - return ((png_voidp)png_ptr->error_ptr); -} - - -#ifdef PNG_ERROR_NUMBERS_SUPPORTED -void PNGAPI -png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode) -{ - if(png_ptr != NULL) - { - png_ptr->flags &= - ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); - } -} -#endif diff --git a/src/SFML/Graphics/libpng/pnggccrd.c b/src/SFML/Graphics/libpng/pnggccrd.c deleted file mode 100644 index c7a3e8bd..00000000 --- a/src/SFML/Graphics/libpng/pnggccrd.c +++ /dev/null @@ -1,5408 +0,0 @@ -/* pnggccrd.c - mixed C/assembler version of utilities to read a PNG file - * - * For Intel x86 CPU (Pentium-MMX or later) and GNU C compiler. - * - * See http://www.intel.com/drg/pentiumII/appnotes/916/916.htm - * and http://www.intel.com/drg/pentiumII/appnotes/923/923.htm - * for Intel's performance analysis of the MMX vs. non-MMX code. - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * Copyright (c) 1998, Intel Corporation - * - * Based on MSVC code contributed by Nirav Chhatrapati, Intel Corp., 1998. - * Interface to libpng contributed by Gilles Vollant, 1999. - * GNU C port by Greg Roelofs, 1999-2001. - * - * Lines 2350-4300 converted in place with intel2gas 1.3.1: - * - * intel2gas -mdI pnggccrd.c.partially-msvc -o pnggccrd.c - * - * and then cleaned up by hand. See http://hermes.terminal.at/intel2gas/ . - * - * NOTE: A sufficiently recent version of GNU as (or as.exe under DOS/Windows) - * is required to assemble the newer MMX instructions such as movq. - * For djgpp, see - * - * ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bnu281b.zip - * - * (or a later version in the same directory). For Linux, check your - * distribution's web site(s) or try these links: - * - * http://rufus.w3.org/linux/RPM/binutils.html - * http://www.debian.org/Packages/stable/devel/binutils.html - * ftp://ftp.slackware.com/pub/linux/slackware/slackware/slakware/d1/ - * binutils.tgz - * - * For other platforms, see the main GNU site: - * - * ftp://ftp.gnu.org/pub/gnu/binutils/ - * - * Version 2.5.2l.15 is definitely too old... - */ - -/* - * TEMPORARY PORTING NOTES AND CHANGELOG (mostly by Greg Roelofs) - * ===================================== - * - * 19991006: - * - fixed sign error in post-MMX cleanup code (16- & 32-bit cases) - * - * 19991007: - * - additional optimizations (possible or definite): - * x [DONE] write MMX code for 64-bit case (pixel_bytes == 8) [not tested] - * - write MMX code for 48-bit case (pixel_bytes == 6) - * - figure out what's up with 24-bit case (pixel_bytes == 3): - * why subtract 8 from width_mmx in the pass 4/5 case? - * (only width_mmx case) (near line 1606) - * x [DONE] replace pixel_bytes within each block with the true - * constant value (or are compilers smart enough to do that?) - * - rewrite all MMX interlacing code so it's aligned with - * the *beginning* of the row buffer, not the end. This - * would not only allow one to eliminate half of the memory - * writes for odd passes (that is, pass == odd), it may also - * eliminate some unaligned-data-access exceptions (assuming - * there's a penalty for not aligning 64-bit accesses on - * 64-bit boundaries). The only catch is that the "leftover" - * pixel(s) at the end of the row would have to be saved, - * but there are enough unused MMX registers in every case, - * so this is not a problem. A further benefit is that the - * post-MMX cleanup code (C code) in at least some of the - * cases could be done within the assembler block. - * x [DONE] the "v3 v2 v1 v0 v7 v6 v5 v4" comments are confusing, - * inconsistent, and don't match the MMX Programmer's Reference - * Manual conventions anyway. They should be changed to - * "b7 b6 b5 b4 b3 b2 b1 b0," where b0 indicates the byte that - * was lowest in memory (e.g., corresponding to a left pixel) - * and b7 is the byte that was highest (e.g., a right pixel). - * - * 19991016: - * - Brennan's Guide notwithstanding, gcc under Linux does *not* - * want globals prefixed by underscores when referencing them-- - * i.e., if the variable is const4, then refer to it as const4, - * not _const4. This seems to be a djgpp-specific requirement. - * Also, such variables apparently *must* be declared outside - * of functions; neither static nor automatic variables work if - * defined within the scope of a single function, but both - * static and truly global (multi-module) variables work fine. - * - * 19991023: - * - fixed png_combine_row() non-MMX replication bug (odd passes only?) - * - switched from string-concatenation-with-macros to cleaner method of - * renaming global variables for djgpp--i.e., always use prefixes in - * inlined assembler code (== strings) and conditionally rename the - * variables, not the other way around. Hence _const4, _mask8_0, etc. - * - * 19991024: - * - fixed mmxsupport()/png_do_read_interlace() first-row bug - * This one was severely weird: even though mmxsupport() doesn't touch - * ebx (where "row" pointer was stored), it nevertheless managed to zero - * the register (even in static/non-fPIC code--see below), which in turn - * caused png_do_read_interlace() to return prematurely on the first row of - * interlaced images (i.e., without expanding the interlaced pixels). - * Inspection of the generated assembly code didn't turn up any clues, - * although it did point at a minor optimization (i.e., get rid of - * mmx_supported_local variable and just use eax). Possibly the CPUID - * instruction is more destructive than it looks? (Not yet checked.) - * - "info gcc" was next to useless, so compared fPIC and non-fPIC assembly - * listings... Apparently register spillage has to do with ebx, since - * it's used to index the global offset table. Commenting it out of the - * input-reg lists in png_combine_row() eliminated compiler barfage, so - * ifdef'd with __PIC__ macro: if defined, use a global for unmask - * - * 19991107: - * - verified CPUID clobberage: 12-char string constant ("GenuineIntel", - * "AuthenticAMD", etc.) placed in ebx:ecx:edx. Still need to polish. - * - * 19991120: - * - made "diff" variable (now "_dif") global to simplify conversion of - * filtering routines (running out of regs, sigh). "diff" is still used - * in interlacing routines, however. - * - fixed up both versions of mmxsupport() (ORIG_THAT_USED_TO_CLOBBER_EBX - * macro determines which is used); original not yet tested. - * - * 20000213: - * - when compiling with gcc, be sure to use -fomit-frame-pointer - * - * 20000319: - * - fixed a register-name typo in png_do_read_interlace(), default (MMX) case, - * pass == 4 or 5, that caused visible corruption of interlaced images - * - * 20000623: - * - Various problems were reported with gcc 2.95.2 in the Cygwin environment, - * many of the form "forbidden register 0 (ax) was spilled for class AREG." - * This is explained at http://gcc.gnu.org/fom_serv/cache/23.html, and - * Chuck Wilson supplied a patch involving dummy output registers. See - * http://sourceforge.net/bugs/?func=detailbug&bug_id=108741&group_id=5624 - * for the original (anonymous) SourceForge bug report. - * - * 20000706: - * - Chuck Wilson passed along these remaining gcc 2.95.2 errors: - * pnggccrd.c: In function `png_combine_row': - * pnggccrd.c:525: more than 10 operands in `asm' - * pnggccrd.c:669: more than 10 operands in `asm' - * pnggccrd.c:828: more than 10 operands in `asm' - * pnggccrd.c:994: more than 10 operands in `asm' - * pnggccrd.c:1177: more than 10 operands in `asm' - * They are all the same problem and can be worked around by using the - * global _unmask variable unconditionally, not just in the -fPIC case. - * Reportedly earlier versions of gcc also have the problem with more than - * 10 operands; they just don't report it. Much strangeness ensues, etc. - * - * 20000729: - * - enabled png_read_filter_row_mmx_up() (shortest remaining unconverted - * MMX routine); began converting png_read_filter_row_mmx_sub() - * - to finish remaining sections: - * - clean up indentation and comments - * - preload local variables - * - add output and input regs (order of former determines numerical - * mapping of latter) - * - avoid all usage of ebx (including bx, bh, bl) register [20000823] - * - remove "$" from addressing of Shift and Mask variables [20000823] - * - * 20000731: - * - global union vars causing segfaults in png_read_filter_row_mmx_sub()? - * - * 20000822: - * - ARGH, stupid png_read_filter_row_mmx_sub() segfault only happens with - * shared-library (-fPIC) version! Code works just fine as part of static - * library. Damn damn damn damn damn, should have tested that sooner. - * ebx is getting clobbered again (explicitly this time); need to save it - * on stack or rewrite asm code to avoid using it altogether. Blargh! - * - * 20000823: - * - first section was trickiest; all remaining sections have ebx -> edx now. - * (-fPIC works again.) Also added missing underscores to various Shift* - * and *Mask* globals and got rid of leading "$" signs. - * - * 20000826: - * - added visual separators to help navigate microscopic printed copies - * (http://pobox.com/~newt/code/gpr-latest.zip, mode 10); started working - * on png_read_filter_row_mmx_avg() - * - * 20000828: - * - finished png_read_filter_row_mmx_avg(): only Paeth left! (930 lines...) - * What the hell, did png_read_filter_row_mmx_paeth(), too. Comments not - * cleaned up/shortened in either routine, but functionality is complete - * and seems to be working fine. - * - * 20000829: - * - ahhh, figured out last(?) bit of gcc/gas asm-fu: if register is listed - * as an input reg (with dummy output variables, etc.), then it *cannot* - * also appear in the clobber list or gcc 2.95.2 will barf. The solution - * is simple enough... - * - * 20000914: - * - bug in png_read_filter_row_mmx_avg(): 16-bit grayscale not handled - * correctly (but 48-bit RGB just fine) - * - * 20000916: - * - fixed bug in png_read_filter_row_mmx_avg(), bpp == 2 case; three errors: - * - "_ShiftBpp.use = 24;" should have been "_ShiftBpp.use = 16;" - * - "_ShiftRem.use = 40;" should have been "_ShiftRem.use = 48;" - * - "psllq _ShiftRem, %%mm2" should have been "psrlq _ShiftRem, %%mm2" - * - * 20010101: - * - added new png_init_mmx_flags() function (here only because it needs to - * call mmxsupport(), which should probably become global png_mmxsupport()); - * modified other MMX routines to run conditionally (png_ptr->asm_flags) - * - * 20010103: - * - renamed mmxsupport() to png_mmx_support(), with auto-set of mmx_supported, - * and made it public; moved png_init_mmx_flags() to png.c as internal func - * - * 20010104: - * - removed dependency on png_read_filter_row_c() (C code already duplicated - * within MMX version of png_read_filter_row()) so no longer necessary to - * compile it into pngrutil.o - * - * 20010310: - * - fixed buffer-overrun bug in png_combine_row() C code (non-MMX) - * - * 20020304: - * - eliminated incorrect use of width_mmx in pixel_bytes == 8 case - * - * 20040724: - * - more tinkering with clobber list at lines 4529 and 5033, to get - * it to compile on gcc-3.4. - * - * STILL TO DO: - * - test png_do_read_interlace() 64-bit case (pixel_bytes == 8) - * - write MMX code for 48-bit case (pixel_bytes == 6) - * - figure out what's up with 24-bit case (pixel_bytes == 3): - * why subtract 8 from width_mmx in the pass 4/5 case? - * (only width_mmx case) (near line 1606) - * - rewrite all MMX interlacing code so it's aligned with beginning - * of the row buffer, not the end (see 19991007 for details) - * x pick one version of mmxsupport() and get rid of the other - * - add error messages to any remaining bogus default cases - * - enable pixel_depth == 8 cases in png_read_filter_row()? (test speed) - * x add support for runtime enable/disable/query of various MMX routines - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_USE_PNGGCCRD) - -int PNGAPI png_mmx_support(void); - -#ifdef PNG_USE_LOCAL_ARRAYS -static const int FARDATA png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; -static const int FARDATA png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -static const int FARDATA png_pass_width[7] = {8, 4, 4, 2, 2, 1, 1}; -#endif - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -/* djgpp, Win32, and Cygwin add their own underscores to global variables, - * so define them without: */ -#if defined(__DJGPP__) || defined(WIN32) || defined(__CYGWIN__) -# define _mmx_supported mmx_supported -# define _const4 const4 -# define _const6 const6 -# define _mask8_0 mask8_0 -# define _mask16_1 mask16_1 -# define _mask16_0 mask16_0 -# define _mask24_2 mask24_2 -# define _mask24_1 mask24_1 -# define _mask24_0 mask24_0 -# define _mask32_3 mask32_3 -# define _mask32_2 mask32_2 -# define _mask32_1 mask32_1 -# define _mask32_0 mask32_0 -# define _mask48_5 mask48_5 -# define _mask48_4 mask48_4 -# define _mask48_3 mask48_3 -# define _mask48_2 mask48_2 -# define _mask48_1 mask48_1 -# define _mask48_0 mask48_0 -# define _LBCarryMask LBCarryMask -# define _HBClearMask HBClearMask -# define _ActiveMask ActiveMask -# define _ActiveMask2 ActiveMask2 -# define _ActiveMaskEnd ActiveMaskEnd -# define _ShiftBpp ShiftBpp -# define _ShiftRem ShiftRem -#ifdef PNG_THREAD_UNSAFE_OK -# define _unmask unmask -# define _FullLength FullLength -# define _MMXLength MMXLength -# define _dif dif -# define _patemp patemp -# define _pbtemp pbtemp -# define _pctemp pctemp -#endif -#endif - - -/* These constants are used in the inlined MMX assembly code. - Ignore gcc's "At top level: defined but not used" warnings. */ - -/* GRR 20000706: originally _unmask was needed only when compiling with -fPIC, - * since that case uses the %ebx register for indexing the Global Offset Table - * and there were no other registers available. But gcc 2.95 and later emit - * "more than 10 operands in `asm'" errors when %ebx is used to preload unmask - * in the non-PIC case, so we'll just use the global unconditionally now. - */ -#ifdef PNG_THREAD_UNSAFE_OK -static int _unmask; -#endif - -static unsigned long long _mask8_0 = 0x0102040810204080LL; - -static unsigned long long _mask16_1 = 0x0101020204040808LL; -static unsigned long long _mask16_0 = 0x1010202040408080LL; - -static unsigned long long _mask24_2 = 0x0101010202020404LL; -static unsigned long long _mask24_1 = 0x0408080810101020LL; -static unsigned long long _mask24_0 = 0x2020404040808080LL; - -static unsigned long long _mask32_3 = 0x0101010102020202LL; -static unsigned long long _mask32_2 = 0x0404040408080808LL; -static unsigned long long _mask32_1 = 0x1010101020202020LL; -static unsigned long long _mask32_0 = 0x4040404080808080LL; - -static unsigned long long _mask48_5 = 0x0101010101010202LL; -static unsigned long long _mask48_4 = 0x0202020204040404LL; -static unsigned long long _mask48_3 = 0x0404080808080808LL; -static unsigned long long _mask48_2 = 0x1010101010102020LL; -static unsigned long long _mask48_1 = 0x2020202040404040LL; -static unsigned long long _mask48_0 = 0x4040808080808080LL; - -static unsigned long long _const4 = 0x0000000000FFFFFFLL; -//static unsigned long long _const5 = 0x000000FFFFFF0000LL; // NOT USED -static unsigned long long _const6 = 0x00000000000000FFLL; - -// These are used in the row-filter routines and should/would be local -// variables if not for gcc addressing limitations. -// WARNING: Their presence probably defeats the thread safety of libpng. - -#ifdef PNG_THREAD_UNSAFE_OK -static png_uint_32 _FullLength; -static png_uint_32 _MMXLength; -static int _dif; -static int _patemp; // temp variables for Paeth routine -static int _pbtemp; -static int _pctemp; -#endif - -void /* PRIVATE */ -png_squelch_warnings(void) -{ -#ifdef PNG_THREAD_UNSAFE_OK - _dif = _dif; - _patemp = _patemp; - _pbtemp = _pbtemp; - _pctemp = _pctemp; - _MMXLength = _MMXLength; -#endif - _const4 = _const4; - _const6 = _const6; - _mask8_0 = _mask8_0; - _mask16_1 = _mask16_1; - _mask16_0 = _mask16_0; - _mask24_2 = _mask24_2; - _mask24_1 = _mask24_1; - _mask24_0 = _mask24_0; - _mask32_3 = _mask32_3; - _mask32_2 = _mask32_2; - _mask32_1 = _mask32_1; - _mask32_0 = _mask32_0; - _mask48_5 = _mask48_5; - _mask48_4 = _mask48_4; - _mask48_3 = _mask48_3; - _mask48_2 = _mask48_2; - _mask48_1 = _mask48_1; - _mask48_0 = _mask48_0; -} -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - - -static int _mmx_supported = 2; - -/*===========================================================================*/ -/* */ -/* P N G _ C O M B I N E _ R O W */ -/* */ -/*===========================================================================*/ - -#if defined(PNG_HAVE_ASSEMBLER_COMBINE_ROW) - -#define BPP2 2 -#define BPP3 3 /* bytes per pixel (a.k.a. pixel_bytes) */ -#define BPP4 4 -#define BPP6 6 /* (defined only to help avoid cut-and-paste errors) */ -#define BPP8 8 - -/* Combines the row recently read in with the previous row. - This routine takes care of alpha and transparency if requested. - This routine also handles the two methods of progressive display - of interlaced images, depending on the mask value. - The mask value describes which pixels are to be combined with - the row. The pattern always repeats every 8 pixels, so just 8 - bits are needed. A one indicates the pixel is to be combined; a - zero indicates the pixel is to be skipped. This is in addition - to any alpha or transparency value associated with the pixel. - If you want all pixels to be combined, pass 0xff (255) in mask. */ - -/* Use this routine for the x86 platform - it uses a faster MMX routine - if the machine supports MMX. */ - -void /* PRIVATE */ -png_combine_row(png_structp png_ptr, png_bytep row, int mask) -{ - png_debug(1, "in png_combine_row (pnggccrd.c)\n"); - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) - if (_mmx_supported == 2) { -#if !defined(PNG_1_0_X) - /* this should have happened in png_init_mmx_flags() already */ - png_warning(png_ptr, "asm_flags may not have been initialized"); -#endif - png_mmx_support(); - } -#endif - - if (mask == 0xff) - { - png_debug(2,"mask == 0xff: doing single png_memcpy()\n"); - png_memcpy(row, png_ptr->row_buf + 1, - (png_size_t)PNG_ROWBYTES(png_ptr->row_info.pixel_depth,png_ptr->width)); - } - else /* (png_combine_row() is never called with mask == 0) */ - { - switch (png_ptr->row_info.pixel_depth) - { - case 1: /* png_ptr->row_info.pixel_depth */ - { - png_bytep sp; - png_bytep dp; - int s_inc, s_start, s_end; - int m; - int shift; - png_uint_32 i; - - sp = png_ptr->row_buf + 1; - dp = row; - m = 0x80; -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 7; - s_inc = 1; - } - else -#endif - { - s_start = 7; - s_end = 0; - s_inc = -1; - } - - shift = s_start; - - for (i = 0; i < png_ptr->width; i++) - { - if (m & mask) - { - int value; - - value = (*sp >> shift) & 0x1; - *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - - case 2: /* png_ptr->row_info.pixel_depth */ - { - png_bytep sp; - png_bytep dp; - int s_start, s_end, s_inc; - int m; - int shift; - png_uint_32 i; - int value; - - sp = png_ptr->row_buf + 1; - dp = row; - m = 0x80; -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 6; - s_inc = 2; - } - else -#endif - { - s_start = 6; - s_end = 0; - s_inc = -2; - } - - shift = s_start; - - for (i = 0; i < png_ptr->width; i++) - { - if (m & mask) - { - value = (*sp >> shift) & 0x3; - *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - - case 4: /* png_ptr->row_info.pixel_depth */ - { - png_bytep sp; - png_bytep dp; - int s_start, s_end, s_inc; - int m; - int shift; - png_uint_32 i; - int value; - - sp = png_ptr->row_buf + 1; - dp = row; - m = 0x80; -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 4; - s_inc = 4; - } - else -#endif - { - s_start = 4; - s_end = 0; - s_inc = -4; - } - shift = s_start; - - for (i = 0; i < png_ptr->width; i++) - { - if (m & mask) - { - value = (*sp >> shift) & 0xf; - *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - - case 8: /* png_ptr->row_info.pixel_depth */ - { - png_bytep srcptr; - png_bytep dstptr; - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && _mmx_supported */ ) -#else - if (_mmx_supported) -#endif - { - png_uint_32 len; - int diff; - int dummy_value_a; // fix 'forbidden register spilled' error - int dummy_value_d; - int dummy_value_c; - int dummy_value_S; - int dummy_value_D; - _unmask = ~mask; // global variable for -fPIC version - srcptr = png_ptr->row_buf + 1; - dstptr = row; - len = png_ptr->width &~7; // reduce to multiple of 8 - diff = (int) (png_ptr->width & 7); // amount lost - - __asm__ __volatile__ ( - "movd _unmask, %%mm7 \n\t" // load bit pattern - "psubb %%mm6, %%mm6 \n\t" // zero mm6 - "punpcklbw %%mm7, %%mm7 \n\t" - "punpcklwd %%mm7, %%mm7 \n\t" - "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks - - "movq _mask8_0, %%mm0 \n\t" - "pand %%mm7, %%mm0 \n\t" // nonzero if keep byte - "pcmpeqb %%mm6, %%mm0 \n\t" // zeros->1s, v versa - -// preload "movl len, %%ecx \n\t" // load length of line -// preload "movl srcptr, %%esi \n\t" // load source -// preload "movl dstptr, %%edi \n\t" // load dest - - "cmpl $0, %%ecx \n\t" // len == 0 ? - "je mainloop8end \n\t" - - "mainloop8: \n\t" - "movq (%%esi), %%mm4 \n\t" // *srcptr - "pand %%mm0, %%mm4 \n\t" - "movq %%mm0, %%mm6 \n\t" - "pandn (%%edi), %%mm6 \n\t" // *dstptr - "por %%mm6, %%mm4 \n\t" - "movq %%mm4, (%%edi) \n\t" - "addl $8, %%esi \n\t" // inc by 8 bytes processed - "addl $8, %%edi \n\t" - "subl $8, %%ecx \n\t" // dec by 8 pixels processed - "ja mainloop8 \n\t" - - "mainloop8end: \n\t" -// preload "movl diff, %%ecx \n\t" // (diff is in eax) - "movl %%eax, %%ecx \n\t" - "cmpl $0, %%ecx \n\t" - "jz end8 \n\t" -// preload "movl mask, %%edx \n\t" - "sall $24, %%edx \n\t" // make low byte, high byte - - "secondloop8: \n\t" - "sall %%edx \n\t" // move high bit to CF - "jnc skip8 \n\t" // if CF = 0 - "movb (%%esi), %%al \n\t" - "movb %%al, (%%edi) \n\t" - - "skip8: \n\t" - "incl %%esi \n\t" - "incl %%edi \n\t" - "decl %%ecx \n\t" - "jnz secondloop8 \n\t" - - "end8: \n\t" - "EMMS \n\t" // DONE - - : "=a" (dummy_value_a), // output regs (dummy) - "=d" (dummy_value_d), - "=c" (dummy_value_c), - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "3" (srcptr), // esi // input regs - "4" (dstptr), // edi - "0" (diff), // eax -// was (unmask) "b" RESERVED // ebx // Global Offset Table idx - "2" (len), // ecx - "1" (mask) // edx - -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm4", "%mm6", "%mm7" // clobber list -#endif - ); - } - else /* mmx _not supported - Use modified C routine */ -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - register png_uint_32 i; - png_uint_32 initial_val = png_pass_start[png_ptr->pass]; - /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ - register int stride = png_pass_inc[png_ptr->pass]; - /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ - register int rep_bytes = png_pass_width[png_ptr->pass]; - /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ - png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ - int diff = (int) (png_ptr->width & 7); /* amount lost */ - register png_uint_32 final_val = len; /* GRR bugfix */ - - srcptr = png_ptr->row_buf + 1 + initial_val; - dstptr = row + initial_val; - - for (i = initial_val; i < final_val; i += stride) - { - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - if (diff) /* number of leftover pixels: 3 for pngtest */ - { - final_val+=diff /* *BPP1 */ ; - for (; i < final_val; i += stride) - { - if (rep_bytes > (int)(final_val-i)) - rep_bytes = (int)(final_val-i); - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - } - - } /* end of else (_mmx_supported) */ - - break; - } /* end 8 bpp */ - - case 16: /* png_ptr->row_info.pixel_depth */ - { - png_bytep srcptr; - png_bytep dstptr; - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && _mmx_supported */ ) -#else - if (_mmx_supported) -#endif - { - png_uint_32 len; - int diff; - int dummy_value_a; // fix 'forbidden register spilled' error - int dummy_value_d; - int dummy_value_c; - int dummy_value_S; - int dummy_value_D; - _unmask = ~mask; // global variable for -fPIC version - srcptr = png_ptr->row_buf + 1; - dstptr = row; - len = png_ptr->width &~7; // reduce to multiple of 8 - diff = (int) (png_ptr->width & 7); // amount lost // - - __asm__ __volatile__ ( - "movd _unmask, %%mm7 \n\t" // load bit pattern - "psubb %%mm6, %%mm6 \n\t" // zero mm6 - "punpcklbw %%mm7, %%mm7 \n\t" - "punpcklwd %%mm7, %%mm7 \n\t" - "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks - - "movq _mask16_0, %%mm0 \n\t" - "movq _mask16_1, %%mm1 \n\t" - - "pand %%mm7, %%mm0 \n\t" - "pand %%mm7, %%mm1 \n\t" - - "pcmpeqb %%mm6, %%mm0 \n\t" - "pcmpeqb %%mm6, %%mm1 \n\t" - -// preload "movl len, %%ecx \n\t" // load length of line -// preload "movl srcptr, %%esi \n\t" // load source -// preload "movl dstptr, %%edi \n\t" // load dest - - "cmpl $0, %%ecx \n\t" - "jz mainloop16end \n\t" - - "mainloop16: \n\t" - "movq (%%esi), %%mm4 \n\t" - "pand %%mm0, %%mm4 \n\t" - "movq %%mm0, %%mm6 \n\t" - "movq (%%edi), %%mm7 \n\t" - "pandn %%mm7, %%mm6 \n\t" - "por %%mm6, %%mm4 \n\t" - "movq %%mm4, (%%edi) \n\t" - - "movq 8(%%esi), %%mm5 \n\t" - "pand %%mm1, %%mm5 \n\t" - "movq %%mm1, %%mm7 \n\t" - "movq 8(%%edi), %%mm6 \n\t" - "pandn %%mm6, %%mm7 \n\t" - "por %%mm7, %%mm5 \n\t" - "movq %%mm5, 8(%%edi) \n\t" - - "addl $16, %%esi \n\t" // inc by 16 bytes processed - "addl $16, %%edi \n\t" - "subl $8, %%ecx \n\t" // dec by 8 pixels processed - "ja mainloop16 \n\t" - - "mainloop16end: \n\t" -// preload "movl diff, %%ecx \n\t" // (diff is in eax) - "movl %%eax, %%ecx \n\t" - "cmpl $0, %%ecx \n\t" - "jz end16 \n\t" -// preload "movl mask, %%edx \n\t" - "sall $24, %%edx \n\t" // make low byte, high byte - - "secondloop16: \n\t" - "sall %%edx \n\t" // move high bit to CF - "jnc skip16 \n\t" // if CF = 0 - "movw (%%esi), %%ax \n\t" - "movw %%ax, (%%edi) \n\t" - - "skip16: \n\t" - "addl $2, %%esi \n\t" - "addl $2, %%edi \n\t" - "decl %%ecx \n\t" - "jnz secondloop16 \n\t" - - "end16: \n\t" - "EMMS \n\t" // DONE - - : "=a" (dummy_value_a), // output regs (dummy) - "=c" (dummy_value_c), - "=d" (dummy_value_d), - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "0" (diff), // eax // input regs -// was (unmask) " " RESERVED // ebx // Global Offset Table idx - "1" (len), // ecx - "2" (mask), // edx - "3" (srcptr), // esi - "4" (dstptr) // edi - -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1", "%mm4" // clobber list - , "%mm5", "%mm6", "%mm7" -#endif - ); - } - else /* mmx _not supported - Use modified C routine */ -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - register png_uint_32 i; - png_uint_32 initial_val = BPP2 * png_pass_start[png_ptr->pass]; - /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ - register int stride = BPP2 * png_pass_inc[png_ptr->pass]; - /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ - register int rep_bytes = BPP2 * png_pass_width[png_ptr->pass]; - /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ - png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ - int diff = (int) (png_ptr->width & 7); /* amount lost */ - register png_uint_32 final_val = BPP2 * len; /* GRR bugfix */ - - srcptr = png_ptr->row_buf + 1 + initial_val; - dstptr = row + initial_val; - - for (i = initial_val; i < final_val; i += stride) - { - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - if (diff) /* number of leftover pixels: 3 for pngtest */ - { - final_val+=diff*BPP2; - for (; i < final_val; i += stride) - { - if (rep_bytes > (int)(final_val-i)) - rep_bytes = (int)(final_val-i); - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - } - } /* end of else (_mmx_supported) */ - - break; - } /* end 16 bpp */ - - case 24: /* png_ptr->row_info.pixel_depth */ - { - png_bytep srcptr; - png_bytep dstptr; - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && _mmx_supported */ ) -#else - if (_mmx_supported) -#endif - { - png_uint_32 len; - int diff; - int dummy_value_a; // fix 'forbidden register spilled' error - int dummy_value_d; - int dummy_value_c; - int dummy_value_S; - int dummy_value_D; - _unmask = ~mask; // global variable for -fPIC version - srcptr = png_ptr->row_buf + 1; - dstptr = row; - len = png_ptr->width &~7; // reduce to multiple of 8 - diff = (int) (png_ptr->width & 7); // amount lost // - - __asm__ __volatile__ ( - "movd _unmask, %%mm7 \n\t" // load bit pattern - "psubb %%mm6, %%mm6 \n\t" // zero mm6 - "punpcklbw %%mm7, %%mm7 \n\t" - "punpcklwd %%mm7, %%mm7 \n\t" - "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks - - "movq _mask24_0, %%mm0 \n\t" - "movq _mask24_1, %%mm1 \n\t" - "movq _mask24_2, %%mm2 \n\t" - - "pand %%mm7, %%mm0 \n\t" - "pand %%mm7, %%mm1 \n\t" - "pand %%mm7, %%mm2 \n\t" - - "pcmpeqb %%mm6, %%mm0 \n\t" - "pcmpeqb %%mm6, %%mm1 \n\t" - "pcmpeqb %%mm6, %%mm2 \n\t" - -// preload "movl len, %%ecx \n\t" // load length of line -// preload "movl srcptr, %%esi \n\t" // load source -// preload "movl dstptr, %%edi \n\t" // load dest - - "cmpl $0, %%ecx \n\t" - "jz mainloop24end \n\t" - - "mainloop24: \n\t" - "movq (%%esi), %%mm4 \n\t" - "pand %%mm0, %%mm4 \n\t" - "movq %%mm0, %%mm6 \n\t" - "movq (%%edi), %%mm7 \n\t" - "pandn %%mm7, %%mm6 \n\t" - "por %%mm6, %%mm4 \n\t" - "movq %%mm4, (%%edi) \n\t" - - "movq 8(%%esi), %%mm5 \n\t" - "pand %%mm1, %%mm5 \n\t" - "movq %%mm1, %%mm7 \n\t" - "movq 8(%%edi), %%mm6 \n\t" - "pandn %%mm6, %%mm7 \n\t" - "por %%mm7, %%mm5 \n\t" - "movq %%mm5, 8(%%edi) \n\t" - - "movq 16(%%esi), %%mm6 \n\t" - "pand %%mm2, %%mm6 \n\t" - "movq %%mm2, %%mm4 \n\t" - "movq 16(%%edi), %%mm7 \n\t" - "pandn %%mm7, %%mm4 \n\t" - "por %%mm4, %%mm6 \n\t" - "movq %%mm6, 16(%%edi) \n\t" - - "addl $24, %%esi \n\t" // inc by 24 bytes processed - "addl $24, %%edi \n\t" - "subl $8, %%ecx \n\t" // dec by 8 pixels processed - - "ja mainloop24 \n\t" - - "mainloop24end: \n\t" -// preload "movl diff, %%ecx \n\t" // (diff is in eax) - "movl %%eax, %%ecx \n\t" - "cmpl $0, %%ecx \n\t" - "jz end24 \n\t" -// preload "movl mask, %%edx \n\t" - "sall $24, %%edx \n\t" // make low byte, high byte - - "secondloop24: \n\t" - "sall %%edx \n\t" // move high bit to CF - "jnc skip24 \n\t" // if CF = 0 - "movw (%%esi), %%ax \n\t" - "movw %%ax, (%%edi) \n\t" - "xorl %%eax, %%eax \n\t" - "movb 2(%%esi), %%al \n\t" - "movb %%al, 2(%%edi) \n\t" - - "skip24: \n\t" - "addl $3, %%esi \n\t" - "addl $3, %%edi \n\t" - "decl %%ecx \n\t" - "jnz secondloop24 \n\t" - - "end24: \n\t" - "EMMS \n\t" // DONE - - : "=a" (dummy_value_a), // output regs (dummy) - "=d" (dummy_value_d), - "=c" (dummy_value_c), - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "3" (srcptr), // esi // input regs - "4" (dstptr), // edi - "0" (diff), // eax -// was (unmask) "b" RESERVED // ebx // Global Offset Table idx - "2" (len), // ecx - "1" (mask) // edx - -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1", "%mm2" // clobber list - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - else /* mmx _not supported - Use modified C routine */ -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - register png_uint_32 i; - png_uint_32 initial_val = BPP3 * png_pass_start[png_ptr->pass]; - /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ - register int stride = BPP3 * png_pass_inc[png_ptr->pass]; - /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ - register int rep_bytes = BPP3 * png_pass_width[png_ptr->pass]; - /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ - png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ - int diff = (int) (png_ptr->width & 7); /* amount lost */ - register png_uint_32 final_val = BPP3 * len; /* GRR bugfix */ - - srcptr = png_ptr->row_buf + 1 + initial_val; - dstptr = row + initial_val; - - for (i = initial_val; i < final_val; i += stride) - { - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - if (diff) /* number of leftover pixels: 3 for pngtest */ - { - final_val+=diff*BPP3; - for (; i < final_val; i += stride) - { - if (rep_bytes > (int)(final_val-i)) - rep_bytes = (int)(final_val-i); - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - } - } /* end of else (_mmx_supported) */ - - break; - } /* end 24 bpp */ - - case 32: /* png_ptr->row_info.pixel_depth */ - { - png_bytep srcptr; - png_bytep dstptr; - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && _mmx_supported */ ) -#else - if (_mmx_supported) -#endif - { - png_uint_32 len; - int diff; - int dummy_value_a; // fix 'forbidden register spilled' error - int dummy_value_d; - int dummy_value_c; - int dummy_value_S; - int dummy_value_D; - _unmask = ~mask; // global variable for -fPIC version - srcptr = png_ptr->row_buf + 1; - dstptr = row; - len = png_ptr->width &~7; // reduce to multiple of 8 - diff = (int) (png_ptr->width & 7); // amount lost // - - __asm__ __volatile__ ( - "movd _unmask, %%mm7 \n\t" // load bit pattern - "psubb %%mm6, %%mm6 \n\t" // zero mm6 - "punpcklbw %%mm7, %%mm7 \n\t" - "punpcklwd %%mm7, %%mm7 \n\t" - "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks - - "movq _mask32_0, %%mm0 \n\t" - "movq _mask32_1, %%mm1 \n\t" - "movq _mask32_2, %%mm2 \n\t" - "movq _mask32_3, %%mm3 \n\t" - - "pand %%mm7, %%mm0 \n\t" - "pand %%mm7, %%mm1 \n\t" - "pand %%mm7, %%mm2 \n\t" - "pand %%mm7, %%mm3 \n\t" - - "pcmpeqb %%mm6, %%mm0 \n\t" - "pcmpeqb %%mm6, %%mm1 \n\t" - "pcmpeqb %%mm6, %%mm2 \n\t" - "pcmpeqb %%mm6, %%mm3 \n\t" - -// preload "movl len, %%ecx \n\t" // load length of line -// preload "movl srcptr, %%esi \n\t" // load source -// preload "movl dstptr, %%edi \n\t" // load dest - - "cmpl $0, %%ecx \n\t" // lcr - "jz mainloop32end \n\t" - - "mainloop32: \n\t" - "movq (%%esi), %%mm4 \n\t" - "pand %%mm0, %%mm4 \n\t" - "movq %%mm0, %%mm6 \n\t" - "movq (%%edi), %%mm7 \n\t" - "pandn %%mm7, %%mm6 \n\t" - "por %%mm6, %%mm4 \n\t" - "movq %%mm4, (%%edi) \n\t" - - "movq 8(%%esi), %%mm5 \n\t" - "pand %%mm1, %%mm5 \n\t" - "movq %%mm1, %%mm7 \n\t" - "movq 8(%%edi), %%mm6 \n\t" - "pandn %%mm6, %%mm7 \n\t" - "por %%mm7, %%mm5 \n\t" - "movq %%mm5, 8(%%edi) \n\t" - - "movq 16(%%esi), %%mm6 \n\t" - "pand %%mm2, %%mm6 \n\t" - "movq %%mm2, %%mm4 \n\t" - "movq 16(%%edi), %%mm7 \n\t" - "pandn %%mm7, %%mm4 \n\t" - "por %%mm4, %%mm6 \n\t" - "movq %%mm6, 16(%%edi) \n\t" - - "movq 24(%%esi), %%mm7 \n\t" - "pand %%mm3, %%mm7 \n\t" - "movq %%mm3, %%mm5 \n\t" - "movq 24(%%edi), %%mm4 \n\t" - "pandn %%mm4, %%mm5 \n\t" - "por %%mm5, %%mm7 \n\t" - "movq %%mm7, 24(%%edi) \n\t" - - "addl $32, %%esi \n\t" // inc by 32 bytes processed - "addl $32, %%edi \n\t" - "subl $8, %%ecx \n\t" // dec by 8 pixels processed - "ja mainloop32 \n\t" - - "mainloop32end: \n\t" -// preload "movl diff, %%ecx \n\t" // (diff is in eax) - "movl %%eax, %%ecx \n\t" - "cmpl $0, %%ecx \n\t" - "jz end32 \n\t" -// preload "movl mask, %%edx \n\t" - "sall $24, %%edx \n\t" // low byte => high byte - - "secondloop32: \n\t" - "sall %%edx \n\t" // move high bit to CF - "jnc skip32 \n\t" // if CF = 0 - "movl (%%esi), %%eax \n\t" - "movl %%eax, (%%edi) \n\t" - - "skip32: \n\t" - "addl $4, %%esi \n\t" - "addl $4, %%edi \n\t" - "decl %%ecx \n\t" - "jnz secondloop32 \n\t" - - "end32: \n\t" - "EMMS \n\t" // DONE - - : "=a" (dummy_value_a), // output regs (dummy) - "=d" (dummy_value_d), - "=c" (dummy_value_c), - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "3" (srcptr), // esi // input regs - "4" (dstptr), // edi - "0" (diff), // eax -// was (unmask) "b" RESERVED // ebx // Global Offset Table idx - "2" (len), // ecx - "1" (mask) // edx - -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1", "%mm2", "%mm3" // clobber list - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - else /* mmx _not supported - Use modified C routine */ -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - register png_uint_32 i; - png_uint_32 initial_val = BPP4 * png_pass_start[png_ptr->pass]; - /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ - register int stride = BPP4 * png_pass_inc[png_ptr->pass]; - /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ - register int rep_bytes = BPP4 * png_pass_width[png_ptr->pass]; - /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ - png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ - int diff = (int) (png_ptr->width & 7); /* amount lost */ - register png_uint_32 final_val = BPP4 * len; /* GRR bugfix */ - - srcptr = png_ptr->row_buf + 1 + initial_val; - dstptr = row + initial_val; - - for (i = initial_val; i < final_val; i += stride) - { - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - if (diff) /* number of leftover pixels: 3 for pngtest */ - { - final_val+=diff*BPP4; - for (; i < final_val; i += stride) - { - if (rep_bytes > (int)(final_val-i)) - rep_bytes = (int)(final_val-i); - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - } - } /* end of else (_mmx_supported) */ - - break; - } /* end 32 bpp */ - - case 48: /* png_ptr->row_info.pixel_depth */ - { - png_bytep srcptr; - png_bytep dstptr; - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && _mmx_supported */ ) -#else - if (_mmx_supported) -#endif - { - png_uint_32 len; - int diff; - int dummy_value_a; // fix 'forbidden register spilled' error - int dummy_value_d; - int dummy_value_c; - int dummy_value_S; - int dummy_value_D; - _unmask = ~mask; // global variable for -fPIC version - srcptr = png_ptr->row_buf + 1; - dstptr = row; - len = png_ptr->width &~7; // reduce to multiple of 8 - diff = (int) (png_ptr->width & 7); // amount lost // - - __asm__ __volatile__ ( - "movd _unmask, %%mm7 \n\t" // load bit pattern - "psubb %%mm6, %%mm6 \n\t" // zero mm6 - "punpcklbw %%mm7, %%mm7 \n\t" - "punpcklwd %%mm7, %%mm7 \n\t" - "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks - - "movq _mask48_0, %%mm0 \n\t" - "movq _mask48_1, %%mm1 \n\t" - "movq _mask48_2, %%mm2 \n\t" - "movq _mask48_3, %%mm3 \n\t" - "movq _mask48_4, %%mm4 \n\t" - "movq _mask48_5, %%mm5 \n\t" - - "pand %%mm7, %%mm0 \n\t" - "pand %%mm7, %%mm1 \n\t" - "pand %%mm7, %%mm2 \n\t" - "pand %%mm7, %%mm3 \n\t" - "pand %%mm7, %%mm4 \n\t" - "pand %%mm7, %%mm5 \n\t" - - "pcmpeqb %%mm6, %%mm0 \n\t" - "pcmpeqb %%mm6, %%mm1 \n\t" - "pcmpeqb %%mm6, %%mm2 \n\t" - "pcmpeqb %%mm6, %%mm3 \n\t" - "pcmpeqb %%mm6, %%mm4 \n\t" - "pcmpeqb %%mm6, %%mm5 \n\t" - -// preload "movl len, %%ecx \n\t" // load length of line -// preload "movl srcptr, %%esi \n\t" // load source -// preload "movl dstptr, %%edi \n\t" // load dest - - "cmpl $0, %%ecx \n\t" - "jz mainloop48end \n\t" - - "mainloop48: \n\t" - "movq (%%esi), %%mm7 \n\t" - "pand %%mm0, %%mm7 \n\t" - "movq %%mm0, %%mm6 \n\t" - "pandn (%%edi), %%mm6 \n\t" - "por %%mm6, %%mm7 \n\t" - "movq %%mm7, (%%edi) \n\t" - - "movq 8(%%esi), %%mm6 \n\t" - "pand %%mm1, %%mm6 \n\t" - "movq %%mm1, %%mm7 \n\t" - "pandn 8(%%edi), %%mm7 \n\t" - "por %%mm7, %%mm6 \n\t" - "movq %%mm6, 8(%%edi) \n\t" - - "movq 16(%%esi), %%mm6 \n\t" - "pand %%mm2, %%mm6 \n\t" - "movq %%mm2, %%mm7 \n\t" - "pandn 16(%%edi), %%mm7 \n\t" - "por %%mm7, %%mm6 \n\t" - "movq %%mm6, 16(%%edi) \n\t" - - "movq 24(%%esi), %%mm7 \n\t" - "pand %%mm3, %%mm7 \n\t" - "movq %%mm3, %%mm6 \n\t" - "pandn 24(%%edi), %%mm6 \n\t" - "por %%mm6, %%mm7 \n\t" - "movq %%mm7, 24(%%edi) \n\t" - - "movq 32(%%esi), %%mm6 \n\t" - "pand %%mm4, %%mm6 \n\t" - "movq %%mm4, %%mm7 \n\t" - "pandn 32(%%edi), %%mm7 \n\t" - "por %%mm7, %%mm6 \n\t" - "movq %%mm6, 32(%%edi) \n\t" - - "movq 40(%%esi), %%mm7 \n\t" - "pand %%mm5, %%mm7 \n\t" - "movq %%mm5, %%mm6 \n\t" - "pandn 40(%%edi), %%mm6 \n\t" - "por %%mm6, %%mm7 \n\t" - "movq %%mm7, 40(%%edi) \n\t" - - "addl $48, %%esi \n\t" // inc by 48 bytes processed - "addl $48, %%edi \n\t" - "subl $8, %%ecx \n\t" // dec by 8 pixels processed - - "ja mainloop48 \n\t" - - "mainloop48end: \n\t" -// preload "movl diff, %%ecx \n\t" // (diff is in eax) - "movl %%eax, %%ecx \n\t" - "cmpl $0, %%ecx \n\t" - "jz end48 \n\t" -// preload "movl mask, %%edx \n\t" - "sall $24, %%edx \n\t" // make low byte, high byte - - "secondloop48: \n\t" - "sall %%edx \n\t" // move high bit to CF - "jnc skip48 \n\t" // if CF = 0 - "movl (%%esi), %%eax \n\t" - "movl %%eax, (%%edi) \n\t" - - "skip48: \n\t" - "addl $4, %%esi \n\t" - "addl $4, %%edi \n\t" - "decl %%ecx \n\t" - "jnz secondloop48 \n\t" - - "end48: \n\t" - "EMMS \n\t" // DONE - - : "=a" (dummy_value_a), // output regs (dummy) - "=d" (dummy_value_d), - "=c" (dummy_value_c), - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "3" (srcptr), // esi // input regs - "4" (dstptr), // edi - "0" (diff), // eax -// was (unmask) "b" RESERVED // ebx // Global Offset Table idx - "2" (len), // ecx - "1" (mask) // edx - -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1", "%mm2", "%mm3" // clobber list - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - else /* mmx _not supported - Use modified C routine */ -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - register png_uint_32 i; - png_uint_32 initial_val = BPP6 * png_pass_start[png_ptr->pass]; - /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ - register int stride = BPP6 * png_pass_inc[png_ptr->pass]; - /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ - register int rep_bytes = BPP6 * png_pass_width[png_ptr->pass]; - /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ - png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ - int diff = (int) (png_ptr->width & 7); /* amount lost */ - register png_uint_32 final_val = BPP6 * len; /* GRR bugfix */ - - srcptr = png_ptr->row_buf + 1 + initial_val; - dstptr = row + initial_val; - - for (i = initial_val; i < final_val; i += stride) - { - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - if (diff) /* number of leftover pixels: 3 for pngtest */ - { - final_val+=diff*BPP6; - for (; i < final_val; i += stride) - { - if (rep_bytes > (int)(final_val-i)) - rep_bytes = (int)(final_val-i); - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - } - } /* end of else (_mmx_supported) */ - - break; - } /* end 48 bpp */ - - case 64: /* png_ptr->row_info.pixel_depth */ - { - png_bytep srcptr; - png_bytep dstptr; - register png_uint_32 i; - png_uint_32 initial_val = BPP8 * png_pass_start[png_ptr->pass]; - /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ - register int stride = BPP8 * png_pass_inc[png_ptr->pass]; - /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ - register int rep_bytes = BPP8 * png_pass_width[png_ptr->pass]; - /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ - png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ - int diff = (int) (png_ptr->width & 7); /* amount lost */ - register png_uint_32 final_val = BPP8 * len; /* GRR bugfix */ - - srcptr = png_ptr->row_buf + 1 + initial_val; - dstptr = row + initial_val; - - for (i = initial_val; i < final_val; i += stride) - { - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - if (diff) /* number of leftover pixels: 3 for pngtest */ - { - final_val+=diff*BPP8; - for (; i < final_val; i += stride) - { - if (rep_bytes > (int)(final_val-i)) - rep_bytes = (int)(final_val-i); - png_memcpy(dstptr, srcptr, rep_bytes); - srcptr += stride; - dstptr += stride; - } - } - - break; - } /* end 64 bpp */ - - default: /* png_ptr->row_info.pixel_depth != 1,2,4,8,16,24,32,48,64 */ - { - /* this should never happen */ - png_warning(png_ptr, "Invalid row_info.pixel_depth in pnggccrd"); - break; - } - } /* end switch (png_ptr->row_info.pixel_depth) */ - - } /* end if (non-trivial mask) */ - -} /* end png_combine_row() */ - -#endif /* PNG_HAVE_ASSEMBLER_COMBINE_ROW */ - - - - -/*===========================================================================*/ -/* */ -/* P N G _ D O _ R E A D _ I N T E R L A C E */ -/* */ -/*===========================================================================*/ - -#if defined(PNG_READ_INTERLACING_SUPPORTED) -#if defined(PNG_HAVE_ASSEMBLER_READ_INTERLACE) - -/* png_do_read_interlace() is called after any 16-bit to 8-bit conversion - * has taken place. [GRR: what other steps come before and/or after?] - */ - -void /* PRIVATE */ -png_do_read_interlace(png_structp png_ptr) -{ - png_row_infop row_info = &(png_ptr->row_info); - png_bytep row = png_ptr->row_buf + 1; - int pass = png_ptr->pass; -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - png_uint_32 transformations = png_ptr->transformations; -#endif - - png_debug(1, "in png_do_read_interlace (pnggccrd.c)\n"); - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) - if (_mmx_supported == 2) { -#if !defined(PNG_1_0_X) - /* this should have happened in png_init_mmx_flags() already */ - png_warning(png_ptr, "asm_flags may not have been initialized"); -#endif - png_mmx_support(); - } -#endif - - if (row != NULL && row_info != NULL) - { - png_uint_32 final_width; - - final_width = row_info->width * png_pass_inc[pass]; - - switch (row_info->pixel_depth) - { - case 1: - { - png_bytep sp, dp; - int sshift, dshift; - int s_start, s_end, s_inc; - png_byte v; - png_uint_32 i; - int j; - - sp = row + (png_size_t)((row_info->width - 1) >> 3); - dp = row + (png_size_t)((final_width - 1) >> 3); -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (transformations & PNG_PACKSWAP) - { - sshift = (int)((row_info->width + 7) & 7); - dshift = (int)((final_width + 7) & 7); - s_start = 7; - s_end = 0; - s_inc = -1; - } - else -#endif - { - sshift = 7 - (int)((row_info->width + 7) & 7); - dshift = 7 - (int)((final_width + 7) & 7); - s_start = 0; - s_end = 7; - s_inc = 1; - } - - for (i = row_info->width; i; i--) - { - v = (png_byte)((*sp >> sshift) & 0x1); - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - else - dshift += s_inc; - } - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - else - sshift += s_inc; - } - break; - } - - case 2: - { - png_bytep sp, dp; - int sshift, dshift; - int s_start, s_end, s_inc; - png_uint_32 i; - - sp = row + (png_size_t)((row_info->width - 1) >> 2); - dp = row + (png_size_t)((final_width - 1) >> 2); -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (transformations & PNG_PACKSWAP) - { - sshift = (png_size_t)(((row_info->width + 3) & 3) << 1); - dshift = (png_size_t)(((final_width + 3) & 3) << 1); - s_start = 6; - s_end = 0; - s_inc = -2; - } - else -#endif - { - sshift = (png_size_t)((3 - ((row_info->width + 3) & 3)) << 1); - dshift = (png_size_t)((3 - ((final_width + 3) & 3)) << 1); - s_start = 0; - s_end = 6; - s_inc = 2; - } - - for (i = row_info->width; i; i--) - { - png_byte v; - int j; - - v = (png_byte)((*sp >> sshift) & 0x3); - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - else - dshift += s_inc; - } - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - else - sshift += s_inc; - } - break; - } - - case 4: - { - png_bytep sp, dp; - int sshift, dshift; - int s_start, s_end, s_inc; - png_uint_32 i; - - sp = row + (png_size_t)((row_info->width - 1) >> 1); - dp = row + (png_size_t)((final_width - 1) >> 1); -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (transformations & PNG_PACKSWAP) - { - sshift = (png_size_t)(((row_info->width + 1) & 1) << 2); - dshift = (png_size_t)(((final_width + 1) & 1) << 2); - s_start = 4; - s_end = 0; - s_inc = -4; - } - else -#endif - { - sshift = (png_size_t)((1 - ((row_info->width + 1) & 1)) << 2); - dshift = (png_size_t)((1 - ((final_width + 1) & 1)) << 2); - s_start = 0; - s_end = 4; - s_inc = 4; - } - - for (i = row_info->width; i; i--) - { - png_byte v; - int j; - - v = (png_byte)((*sp >> sshift) & 0xf); - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - else - dshift += s_inc; - } - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - else - sshift += s_inc; - } - break; - } - - /*====================================================================*/ - - default: /* 8-bit or larger (this is where the routine is modified) */ - { -#if 0 -// static unsigned long long _const4 = 0x0000000000FFFFFFLL; no good -// static unsigned long long const4 = 0x0000000000FFFFFFLL; no good -// unsigned long long _const4 = 0x0000000000FFFFFFLL; no good -// unsigned long long const4 = 0x0000000000FFFFFFLL; no good -#endif - png_bytep sptr, dp; - png_uint_32 i; - png_size_t pixel_bytes; - int width = (int)row_info->width; - - pixel_bytes = (row_info->pixel_depth >> 3); - - /* point sptr at the last pixel in the pre-expanded row: */ - sptr = row + (width - 1) * pixel_bytes; - - /* point dp at the last pixel position in the expanded row: */ - dp = row + (final_width - 1) * pixel_bytes; - - /* New code by Nirav Chhatrapati - Intel Corporation */ - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_INTERLACE) - /* && _mmx_supported */ ) -#else - if (_mmx_supported) -#endif - { - //-------------------------------------------------------------- - if (pixel_bytes == 3) - { - if (((pass == 0) || (pass == 1)) && width) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $21, %%edi \n\t" - // (png_pass_inc[pass] - 1)*pixel_bytes - - ".loop3_pass0: \n\t" - "movd (%%esi), %%mm0 \n\t" // x x x x x 2 1 0 - "pand _const4, %%mm0 \n\t" // z z z z z 2 1 0 - "movq %%mm0, %%mm1 \n\t" // z z z z z 2 1 0 - "psllq $16, %%mm0 \n\t" // z z z 2 1 0 z z - "movq %%mm0, %%mm2 \n\t" // z z z 2 1 0 z z - "psllq $24, %%mm0 \n\t" // 2 1 0 z z z z z - "psrlq $8, %%mm1 \n\t" // z z z z z z 2 1 - "por %%mm2, %%mm0 \n\t" // 2 1 0 2 1 0 z z - "por %%mm1, %%mm0 \n\t" // 2 1 0 2 1 0 2 1 - "movq %%mm0, %%mm3 \n\t" // 2 1 0 2 1 0 2 1 - "psllq $16, %%mm0 \n\t" // 0 2 1 0 2 1 z z - "movq %%mm3, %%mm4 \n\t" // 2 1 0 2 1 0 2 1 - "punpckhdq %%mm0, %%mm3 \n\t" // 0 2 1 0 2 1 0 2 - "movq %%mm4, 16(%%edi) \n\t" - "psrlq $32, %%mm0 \n\t" // z z z z 0 2 1 0 - "movq %%mm3, 8(%%edi) \n\t" - "punpckldq %%mm4, %%mm0 \n\t" // 1 0 2 1 0 2 1 0 - "subl $3, %%esi \n\t" - "movq %%mm0, (%%edi) \n\t" - "subl $24, %%edi \n\t" - "decl %%ecx \n\t" - "jnz .loop3_pass0 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width), // ecx - "rim" (_const4) // %1(?) (0x0000000000FFFFFFLL) - -#if 0 /* %mm0, ..., %mm4 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1", "%mm2" // clobber list - , "%mm3", "%mm4" -#endif - ); - } - else if (((pass == 2) || (pass == 3)) && width) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $9, %%edi \n\t" - // (png_pass_inc[pass] - 1)*pixel_bytes - - ".loop3_pass2: \n\t" - "movd (%%esi), %%mm0 \n\t" // x x x x x 2 1 0 - "pand _const4, %%mm0 \n\t" // z z z z z 2 1 0 - "movq %%mm0, %%mm1 \n\t" // z z z z z 2 1 0 - "psllq $16, %%mm0 \n\t" // z z z 2 1 0 z z - "movq %%mm0, %%mm2 \n\t" // z z z 2 1 0 z z - "psllq $24, %%mm0 \n\t" // 2 1 0 z z z z z - "psrlq $8, %%mm1 \n\t" // z z z z z z 2 1 - "por %%mm2, %%mm0 \n\t" // 2 1 0 2 1 0 z z - "por %%mm1, %%mm0 \n\t" // 2 1 0 2 1 0 2 1 - "movq %%mm0, 4(%%edi) \n\t" - "psrlq $16, %%mm0 \n\t" // z z 2 1 0 2 1 0 - "subl $3, %%esi \n\t" - "movd %%mm0, (%%edi) \n\t" - "subl $12, %%edi \n\t" - "decl %%ecx \n\t" - "jnz .loop3_pass2 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width), // ecx - "rim" (_const4) // (0x0000000000FFFFFFLL) - -#if 0 /* %mm0, ..., %mm2 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1", "%mm2" // clobber list -#endif - ); - } - else if (width) /* && ((pass == 4) || (pass == 5)) */ - { - int width_mmx = ((width >> 1) << 1) - 8; // GRR: huh? - if (width_mmx < 0) - width_mmx = 0; - width -= width_mmx; // 8 or 9 pix, 24 or 27 bytes - if (width_mmx) - { - // png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; - // sptr points at last pixel in pre-expanded row - // dp points at last pixel position in expanded row - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $3, %%esi \n\t" - "subl $9, %%edi \n\t" - // (png_pass_inc[pass] + 1)*pixel_bytes - - ".loop3_pass4: \n\t" - "movq (%%esi), %%mm0 \n\t" // x x 5 4 3 2 1 0 - "movq %%mm0, %%mm1 \n\t" // x x 5 4 3 2 1 0 - "movq %%mm0, %%mm2 \n\t" // x x 5 4 3 2 1 0 - "psllq $24, %%mm0 \n\t" // 4 3 2 1 0 z z z - "pand _const4, %%mm1 \n\t" // z z z z z 2 1 0 - "psrlq $24, %%mm2 \n\t" // z z z x x 5 4 3 - "por %%mm1, %%mm0 \n\t" // 4 3 2 1 0 2 1 0 - "movq %%mm2, %%mm3 \n\t" // z z z x x 5 4 3 - "psllq $8, %%mm2 \n\t" // z z x x 5 4 3 z - "movq %%mm0, (%%edi) \n\t" - "psrlq $16, %%mm3 \n\t" // z z z z z x x 5 - "pand _const6, %%mm3 \n\t" // z z z z z z z 5 - "por %%mm3, %%mm2 \n\t" // z z x x 5 4 3 5 - "subl $6, %%esi \n\t" - "movd %%mm2, 8(%%edi) \n\t" - "subl $12, %%edi \n\t" - "subl $2, %%ecx \n\t" - "jnz .loop3_pass4 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx), // ecx - "rim" (_const4), // 0x0000000000FFFFFFLL - "rim" (_const6) // 0x00000000000000FFLL - -#if 0 /* %mm0, ..., %mm3 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1" // clobber list - , "%mm2", "%mm3" -#endif - ); - } - - sptr -= width_mmx*3; - dp -= width_mmx*6; - for (i = width; i; i--) - { - png_byte v[8]; - int j; - - png_memcpy(v, sptr, 3); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, 3); - dp -= 3; - } - sptr -= 3; - } - } - } /* end of pixel_bytes == 3 */ - - //-------------------------------------------------------------- - else if (pixel_bytes == 1) - { - if (((pass == 0) || (pass == 1)) && width) - { - int width_mmx = ((width >> 2) << 2); - width -= width_mmx; // 0-3 pixels => 0-3 bytes - if (width_mmx) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $3, %%esi \n\t" - "subl $31, %%edi \n\t" - - ".loop1_pass0: \n\t" - "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 - "movq %%mm0, %%mm1 \n\t" // x x x x 3 2 1 0 - "punpcklbw %%mm0, %%mm0 \n\t" // 3 3 2 2 1 1 0 0 - "movq %%mm0, %%mm2 \n\t" // 3 3 2 2 1 1 0 0 - "punpcklwd %%mm0, %%mm0 \n\t" // 1 1 1 1 0 0 0 0 - "movq %%mm0, %%mm3 \n\t" // 1 1 1 1 0 0 0 0 - "punpckldq %%mm0, %%mm0 \n\t" // 0 0 0 0 0 0 0 0 - "punpckhdq %%mm3, %%mm3 \n\t" // 1 1 1 1 1 1 1 1 - "movq %%mm0, (%%edi) \n\t" - "punpckhwd %%mm2, %%mm2 \n\t" // 3 3 3 3 2 2 2 2 - "movq %%mm3, 8(%%edi) \n\t" - "movq %%mm2, %%mm4 \n\t" // 3 3 3 3 2 2 2 2 - "punpckldq %%mm2, %%mm2 \n\t" // 2 2 2 2 2 2 2 2 - "punpckhdq %%mm4, %%mm4 \n\t" // 3 3 3 3 3 3 3 3 - "movq %%mm2, 16(%%edi) \n\t" - "subl $4, %%esi \n\t" - "movq %%mm4, 24(%%edi) \n\t" - "subl $32, %%edi \n\t" - "subl $4, %%ecx \n\t" - "jnz .loop1_pass0 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx) // ecx - -#if 0 /* %mm0, ..., %mm4 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1", "%mm2" // clobber list - , "%mm3", "%mm4" -#endif - ); - } - - sptr -= width_mmx; - dp -= width_mmx*8; - for (i = width; i; i--) - { - int j; - - /* I simplified this part in version 1.0.4e - * here and in several other instances where - * pixel_bytes == 1 -- GR-P - * - * Original code: - * - * png_byte v[8]; - * png_memcpy(v, sptr, pixel_bytes); - * for (j = 0; j < png_pass_inc[pass]; j++) - * { - * png_memcpy(dp, v, pixel_bytes); - * dp -= pixel_bytes; - * } - * sptr -= pixel_bytes; - * - * Replacement code is in the next three lines: - */ - - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp-- = *sptr; - } - --sptr; - } - } - else if (((pass == 2) || (pass == 3)) && width) - { - int width_mmx = ((width >> 2) << 2); - width -= width_mmx; // 0-3 pixels => 0-3 bytes - if (width_mmx) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $3, %%esi \n\t" - "subl $15, %%edi \n\t" - - ".loop1_pass2: \n\t" - "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 - "punpcklbw %%mm0, %%mm0 \n\t" // 3 3 2 2 1 1 0 0 - "movq %%mm0, %%mm1 \n\t" // 3 3 2 2 1 1 0 0 - "punpcklwd %%mm0, %%mm0 \n\t" // 1 1 1 1 0 0 0 0 - "punpckhwd %%mm1, %%mm1 \n\t" // 3 3 3 3 2 2 2 2 - "movq %%mm0, (%%edi) \n\t" - "subl $4, %%esi \n\t" - "movq %%mm1, 8(%%edi) \n\t" - "subl $16, %%edi \n\t" - "subl $4, %%ecx \n\t" - "jnz .loop1_pass2 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx) // ecx - -#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1" // clobber list -#endif - ); - } - - sptr -= width_mmx; - dp -= width_mmx*4; - for (i = width; i; i--) - { - int j; - - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp-- = *sptr; - } - --sptr; - } - } - else if (width) /* && ((pass == 4) || (pass == 5)) */ - { - int width_mmx = ((width >> 3) << 3); - width -= width_mmx; // 0-3 pixels => 0-3 bytes - if (width_mmx) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $7, %%esi \n\t" - "subl $15, %%edi \n\t" - - ".loop1_pass4: \n\t" - "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 - "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0 - "punpcklbw %%mm0, %%mm0 \n\t" // 3 3 2 2 1 1 0 0 - "punpckhbw %%mm1, %%mm1 \n\t" // 7 7 6 6 5 5 4 4 - "movq %%mm1, 8(%%edi) \n\t" - "subl $8, %%esi \n\t" - "movq %%mm0, (%%edi) \n\t" - "subl $16, %%edi \n\t" - "subl $8, %%ecx \n\t" - "jnz .loop1_pass4 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (none) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx) // ecx - -#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1" // clobber list -#endif - ); - } - - sptr -= width_mmx; - dp -= width_mmx*2; - for (i = width; i; i--) - { - int j; - - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp-- = *sptr; - } - --sptr; - } - } - } /* end of pixel_bytes == 1 */ - - //-------------------------------------------------------------- - else if (pixel_bytes == 2) - { - if (((pass == 0) || (pass == 1)) && width) - { - int width_mmx = ((width >> 1) << 1); - width -= width_mmx; // 0,1 pixels => 0,2 bytes - if (width_mmx) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $2, %%esi \n\t" - "subl $30, %%edi \n\t" - - ".loop2_pass0: \n\t" - "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 - "punpcklwd %%mm0, %%mm0 \n\t" // 3 2 3 2 1 0 1 0 - "movq %%mm0, %%mm1 \n\t" // 3 2 3 2 1 0 1 0 - "punpckldq %%mm0, %%mm0 \n\t" // 1 0 1 0 1 0 1 0 - "punpckhdq %%mm1, %%mm1 \n\t" // 3 2 3 2 3 2 3 2 - "movq %%mm0, (%%edi) \n\t" - "movq %%mm0, 8(%%edi) \n\t" - "movq %%mm1, 16(%%edi) \n\t" - "subl $4, %%esi \n\t" - "movq %%mm1, 24(%%edi) \n\t" - "subl $32, %%edi \n\t" - "subl $2, %%ecx \n\t" - "jnz .loop2_pass0 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx) // ecx - -#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1" // clobber list -#endif - ); - } - - sptr -= (width_mmx*2 - 2); // sign fixed - dp -= (width_mmx*16 - 2); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 2; - png_memcpy(v, sptr, 2); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 2; - png_memcpy(dp, v, 2); - } - } - } - else if (((pass == 2) || (pass == 3)) && width) - { - int width_mmx = ((width >> 1) << 1) ; - width -= width_mmx; // 0,1 pixels => 0,2 bytes - if (width_mmx) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $2, %%esi \n\t" - "subl $14, %%edi \n\t" - - ".loop2_pass2: \n\t" - "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 - "punpcklwd %%mm0, %%mm0 \n\t" // 3 2 3 2 1 0 1 0 - "movq %%mm0, %%mm1 \n\t" // 3 2 3 2 1 0 1 0 - "punpckldq %%mm0, %%mm0 \n\t" // 1 0 1 0 1 0 1 0 - "punpckhdq %%mm1, %%mm1 \n\t" // 3 2 3 2 3 2 3 2 - "movq %%mm0, (%%edi) \n\t" - "subl $4, %%esi \n\t" - "movq %%mm1, 8(%%edi) \n\t" - "subl $16, %%edi \n\t" - "subl $2, %%ecx \n\t" - "jnz .loop2_pass2 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx) // ecx - -#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1" // clobber list -#endif - ); - } - - sptr -= (width_mmx*2 - 2); // sign fixed - dp -= (width_mmx*8 - 2); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 2; - png_memcpy(v, sptr, 2); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 2; - png_memcpy(dp, v, 2); - } - } - } - else if (width) // pass == 4 or 5 - { - int width_mmx = ((width >> 1) << 1) ; - width -= width_mmx; // 0,1 pixels => 0,2 bytes - if (width_mmx) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $2, %%esi \n\t" - "subl $6, %%edi \n\t" - - ".loop2_pass4: \n\t" - "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 - "punpcklwd %%mm0, %%mm0 \n\t" // 3 2 3 2 1 0 1 0 - "subl $4, %%esi \n\t" - "movq %%mm0, (%%edi) \n\t" - "subl $8, %%edi \n\t" - "subl $2, %%ecx \n\t" - "jnz .loop2_pass4 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx) // ecx - -#if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0" // clobber list -#endif - ); - } - - sptr -= (width_mmx*2 - 2); // sign fixed - dp -= (width_mmx*4 - 2); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 2; - png_memcpy(v, sptr, 2); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 2; - png_memcpy(dp, v, 2); - } - } - } - } /* end of pixel_bytes == 2 */ - - //-------------------------------------------------------------- - else if (pixel_bytes == 4) - { - if (((pass == 0) || (pass == 1)) && width) - { - int width_mmx = ((width >> 1) << 1); - width -= width_mmx; // 0,1 pixels => 0,4 bytes - if (width_mmx) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $4, %%esi \n\t" - "subl $60, %%edi \n\t" - - ".loop4_pass0: \n\t" - "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 - "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0 - "punpckldq %%mm0, %%mm0 \n\t" // 3 2 1 0 3 2 1 0 - "punpckhdq %%mm1, %%mm1 \n\t" // 7 6 5 4 7 6 5 4 - "movq %%mm0, (%%edi) \n\t" - "movq %%mm0, 8(%%edi) \n\t" - "movq %%mm0, 16(%%edi) \n\t" - "movq %%mm0, 24(%%edi) \n\t" - "movq %%mm1, 32(%%edi) \n\t" - "movq %%mm1, 40(%%edi) \n\t" - "movq %%mm1, 48(%%edi) \n\t" - "subl $8, %%esi \n\t" - "movq %%mm1, 56(%%edi) \n\t" - "subl $64, %%edi \n\t" - "subl $2, %%ecx \n\t" - "jnz .loop4_pass0 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx) // ecx - -#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1" // clobber list -#endif - ); - } - - sptr -= (width_mmx*4 - 4); // sign fixed - dp -= (width_mmx*32 - 4); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 4; - png_memcpy(v, sptr, 4); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 4; - png_memcpy(dp, v, 4); - } - } - } - else if (((pass == 2) || (pass == 3)) && width) - { - int width_mmx = ((width >> 1) << 1); - width -= width_mmx; // 0,1 pixels => 0,4 bytes - if (width_mmx) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $4, %%esi \n\t" - "subl $28, %%edi \n\t" - - ".loop4_pass2: \n\t" - "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 - "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0 - "punpckldq %%mm0, %%mm0 \n\t" // 3 2 1 0 3 2 1 0 - "punpckhdq %%mm1, %%mm1 \n\t" // 7 6 5 4 7 6 5 4 - "movq %%mm0, (%%edi) \n\t" - "movq %%mm0, 8(%%edi) \n\t" - "movq %%mm1, 16(%%edi) \n\t" - "movq %%mm1, 24(%%edi) \n\t" - "subl $8, %%esi \n\t" - "subl $32, %%edi \n\t" - "subl $2, %%ecx \n\t" - "jnz .loop4_pass2 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx) // ecx - -#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1" // clobber list -#endif - ); - } - - sptr -= (width_mmx*4 - 4); // sign fixed - dp -= (width_mmx*16 - 4); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 4; - png_memcpy(v, sptr, 4); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 4; - png_memcpy(dp, v, 4); - } - } - } - else if (width) // pass == 4 or 5 - { - int width_mmx = ((width >> 1) << 1) ; - width -= width_mmx; // 0,1 pixels => 0,4 bytes - if (width_mmx) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $4, %%esi \n\t" - "subl $12, %%edi \n\t" - - ".loop4_pass4: \n\t" - "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 - "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0 - "punpckldq %%mm0, %%mm0 \n\t" // 3 2 1 0 3 2 1 0 - "punpckhdq %%mm1, %%mm1 \n\t" // 7 6 5 4 7 6 5 4 - "movq %%mm0, (%%edi) \n\t" - "subl $8, %%esi \n\t" - "movq %%mm1, 8(%%edi) \n\t" - "subl $16, %%edi \n\t" - "subl $2, %%ecx \n\t" - "jnz .loop4_pass4 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width_mmx) // ecx - -#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0", "%mm1" // clobber list -#endif - ); - } - - sptr -= (width_mmx*4 - 4); // sign fixed - dp -= (width_mmx*8 - 4); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 4; - png_memcpy(v, sptr, 4); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 4; - png_memcpy(dp, v, 4); - } - } - } - } /* end of pixel_bytes == 4 */ - - //-------------------------------------------------------------- - else if (pixel_bytes == 8) - { -// GRR TEST: should work, but needs testing (special 64-bit version of rpng2?) - // GRR NOTE: no need to combine passes here! - if (((pass == 0) || (pass == 1)) && width) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - // source is 8-byte RRGGBBAA - // dest is 64-byte RRGGBBAA RRGGBBAA RRGGBBAA RRGGBBAA ... - __asm__ __volatile__ ( - "subl $56, %%edi \n\t" // start of last block - - ".loop8_pass0: \n\t" - "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 - "movq %%mm0, (%%edi) \n\t" - "movq %%mm0, 8(%%edi) \n\t" - "movq %%mm0, 16(%%edi) \n\t" - "movq %%mm0, 24(%%edi) \n\t" - "movq %%mm0, 32(%%edi) \n\t" - "movq %%mm0, 40(%%edi) \n\t" - "movq %%mm0, 48(%%edi) \n\t" - "subl $8, %%esi \n\t" - "movq %%mm0, 56(%%edi) \n\t" - "subl $64, %%edi \n\t" - "decl %%ecx \n\t" - "jnz .loop8_pass0 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width) // ecx - -#if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0" // clobber list -#endif - ); - } - else if (((pass == 2) || (pass == 3)) && width) - { - // source is 8-byte RRGGBBAA - // dest is 32-byte RRGGBBAA RRGGBBAA RRGGBBAA RRGGBBAA - // (recall that expansion is _in place_: sptr and dp - // both point at locations within same row buffer) - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $24, %%edi \n\t" // start of last block - - ".loop8_pass2: \n\t" - "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 - "movq %%mm0, (%%edi) \n\t" - "movq %%mm0, 8(%%edi) \n\t" - "movq %%mm0, 16(%%edi) \n\t" - "subl $8, %%esi \n\t" - "movq %%mm0, 24(%%edi) \n\t" - "subl $32, %%edi \n\t" - "decl %%ecx \n\t" - "jnz .loop8_pass2 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width) // ecx - -#if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0" // clobber list -#endif - ); - } - } - else if (width) // pass == 4 or 5 - { - // source is 8-byte RRGGBBAA - // dest is 16-byte RRGGBBAA RRGGBBAA - { - int dummy_value_c; // fix 'forbidden register spilled' - int dummy_value_S; - int dummy_value_D; - - __asm__ __volatile__ ( - "subl $8, %%edi \n\t" // start of last block - - ".loop8_pass4: \n\t" - "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 - "movq %%mm0, (%%edi) \n\t" - "subl $8, %%esi \n\t" - "movq %%mm0, 8(%%edi) \n\t" - "subl $16, %%edi \n\t" - "decl %%ecx \n\t" - "jnz .loop8_pass4 \n\t" - "EMMS \n\t" // DONE - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "1" (sptr), // esi // input regs - "2" (dp), // edi - "0" (width) // ecx - -#if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */ - : "%mm0" // clobber list -#endif - ); - } - } - - } /* end of pixel_bytes == 8 */ - - //-------------------------------------------------------------- - else if (pixel_bytes == 6) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, 6); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, 6); - dp -= 6; - } - sptr -= 6; - } - } /* end of pixel_bytes == 6 */ - - //-------------------------------------------------------------- - else - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, pixel_bytes); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - sptr-= pixel_bytes; - } - } - } // end of _mmx_supported ======================================== - - else /* MMX not supported: use modified C code - takes advantage - * of inlining of png_memcpy for a constant */ - /* GRR 19991007: does it? or should pixel_bytes in each - * block be replaced with immediate value (e.g., 1)? */ - /* GRR 19991017: replaced with constants in each case */ -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - if (pixel_bytes == 1) - { - for (i = width; i; i--) - { - int j; - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp-- = *sptr; - } - --sptr; - } - } - else if (pixel_bytes == 3) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, 3); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, 3); - dp -= 3; - } - sptr -= 3; - } - } - else if (pixel_bytes == 2) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, 2); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, 2); - dp -= 2; - } - sptr -= 2; - } - } - else if (pixel_bytes == 4) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, 4); - for (j = 0; j < png_pass_inc[pass]; j++) - { -#ifdef PNG_DEBUG - if (dp < row || dp+3 > row+png_ptr->row_buf_size) - { - printf("dp out of bounds: row=%d, dp=%d, rp=%d\n", - row, dp, row+png_ptr->row_buf_size); - printf("row_buf=%d\n",png_ptr->row_buf_size); - } -#endif - png_memcpy(dp, v, 4); - dp -= 4; - } - sptr -= 4; - } - } - else if (pixel_bytes == 6) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, 6); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, 6); - dp -= 6; - } - sptr -= 6; - } - } - else if (pixel_bytes == 8) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, 8); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, 8); - dp -= 8; - } - sptr -= 8; - } - } - else /* GRR: should never be reached */ - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, pixel_bytes); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - sptr -= pixel_bytes; - } - } - - } /* end if (MMX not supported) */ - break; - } - } /* end switch (row_info->pixel_depth) */ - - row_info->width = final_width; - - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,final_width); - } - -} /* end png_do_read_interlace() */ - -#endif /* PNG_HAVE_ASSEMBLER_READ_INTERLACE */ -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - - - -#if defined(PNG_HAVE_ASSEMBLER_READ_FILTER_ROW) -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) - -// These variables are utilized in the functions below. They are declared -// globally here to ensure alignment on 8-byte boundaries. - -union uAll { - long long use; - double align; -} _LBCarryMask = {0x0101010101010101LL}, - _HBClearMask = {0x7f7f7f7f7f7f7f7fLL}, - _ActiveMask, _ActiveMask2, _ActiveMaskEnd, _ShiftBpp, _ShiftRem; - -#ifdef PNG_THREAD_UNSAFE_OK -//===========================================================================// -// // -// P N G _ R E A D _ F I L T E R _ R O W _ M M X _ A V G // -// // -//===========================================================================// - -// Optimized code for PNG Average filter decoder - -static void /* PRIVATE */ -png_read_filter_row_mmx_avg(png_row_infop row_info, png_bytep row, - png_bytep prev_row) -{ - int bpp; - int dummy_value_c; // fix 'forbidden register 2 (cx) was spilled' error - int dummy_value_S; - int dummy_value_D; - - bpp = (row_info->pixel_depth + 7) >> 3; // get # bytes per pixel - _FullLength = row_info->rowbytes; // # of bytes to filter - - __asm__ __volatile__ ( - // initialize address pointers and offset -#ifdef __PIC__ - "pushl %%ebx \n\t" // save index to Global Offset Table -#endif -//pre "movl row, %%edi \n\t" // edi: Avg(x) - "xorl %%ebx, %%ebx \n\t" // ebx: x - "movl %%edi, %%edx \n\t" -//pre "movl prev_row, %%esi \n\t" // esi: Prior(x) -//pre "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) - "subl %%ecx, %%edx \n\t" // edx: Raw(x-bpp) - - "xorl %%eax,%%eax \n\t" - - // Compute the Raw value for the first bpp bytes - // Raw(x) = Avg(x) + (Prior(x)/2) - "avg_rlp: \n\t" - "movb (%%esi,%%ebx,),%%al \n\t" // load al with Prior(x) - "incl %%ebx \n\t" - "shrb %%al \n\t" // divide by 2 - "addb -1(%%edi,%%ebx,),%%al \n\t" // add Avg(x); -1 to offset inc ebx -//pre "cmpl bpp, %%ebx \n\t" // (bpp is preloaded into ecx) - "cmpl %%ecx, %%ebx \n\t" - "movb %%al,-1(%%edi,%%ebx,) \n\t" // write Raw(x); -1 to offset inc ebx - "jb avg_rlp \n\t" // mov does not affect flags - - // get # of bytes to alignment - "movl %%edi, _dif \n\t" // take start of row - "addl %%ebx, _dif \n\t" // add bpp - "addl $0xf, _dif \n\t" // add 7+8 to incr past alignment bdry - "andl $0xfffffff8, _dif \n\t" // mask to alignment boundary - "subl %%edi, _dif \n\t" // subtract from start => value ebx at - "jz avg_go \n\t" // alignment - - // fix alignment - // Compute the Raw value for the bytes up to the alignment boundary - // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) - "xorl %%ecx, %%ecx \n\t" - - "avg_lp1: \n\t" - "xorl %%eax, %%eax \n\t" - "movb (%%esi,%%ebx,), %%cl \n\t" // load cl with Prior(x) - "movb (%%edx,%%ebx,), %%al \n\t" // load al with Raw(x-bpp) - "addw %%cx, %%ax \n\t" - "incl %%ebx \n\t" - "shrw %%ax \n\t" // divide by 2 - "addb -1(%%edi,%%ebx,), %%al \n\t" // add Avg(x); -1 to offset inc ebx - "cmpl _dif, %%ebx \n\t" // check if at alignment boundary - "movb %%al, -1(%%edi,%%ebx,) \n\t" // write Raw(x); -1 to offset inc ebx - "jb avg_lp1 \n\t" // repeat until at alignment boundary - - "avg_go: \n\t" - "movl _FullLength, %%eax \n\t" - "movl %%eax, %%ecx \n\t" - "subl %%ebx, %%eax \n\t" // subtract alignment fix - "andl $0x00000007, %%eax \n\t" // calc bytes over mult of 8 - "subl %%eax, %%ecx \n\t" // drop over bytes from original length - "movl %%ecx, _MMXLength \n\t" -#ifdef __PIC__ - "popl %%ebx \n\t" // restore index to Global Offset Table -#endif - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "0" (bpp), // ecx // input regs - "1" (prev_row), // esi - "2" (row) // edi - - : "%eax", "%edx" // clobber list -#ifndef __PIC__ - , "%ebx" -#endif - // GRR: INCLUDE "memory" as clobbered? (_dif, _MMXLength) - // (seems to work fine without...) - ); - - // now do the math for the rest of the row - switch (bpp) - { - case 3: - { - _ActiveMask.use = 0x0000000000ffffffLL; - _ShiftBpp.use = 24; // == 3 * 8 - _ShiftRem.use = 40; // == 64 - 24 - - __asm__ __volatile__ ( - // re-init address pointers and offset - "movq _ActiveMask, %%mm7 \n\t" - "movl _dif, %%ecx \n\t" // ecx: x = offset to - "movq _LBCarryMask, %%mm5 \n\t" // alignment boundary -// preload "movl row, %%edi \n\t" // edi: Avg(x) - "movq _HBClearMask, %%mm4 \n\t" -// preload "movl prev_row, %%esi \n\t" // esi: Prior(x) - - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes - // (correct pos. in loop below) - "avg_3lp: \n\t" - "movq (%%edi,%%ecx,), %%mm0 \n\t" // load mm0 with Avg(x) - "movq %%mm5, %%mm3 \n\t" - "psrlq _ShiftRem, %%mm2 \n\t" // correct position Raw(x-bpp) - // data - "movq (%%esi,%%ecx,), %%mm1 \n\t" // load mm1 with Prior(x) - "movq %%mm7, %%mm6 \n\t" - "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte - "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 - "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for - // each byte - // add 1st active group (Raw(x-bpp)/2) to average with LBCarry - "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting - // LBCarrys - "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte - // where both - // lsb's were == 1 (only valid for active group) - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) - // for each byte - "pand %%mm6, %%mm2 \n\t" // leave only Active Group 1 - // bytes to add to Avg - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to - // Avg for each Active - // byte - // add 2nd active group (Raw(x-bpp)/2) to average with _LBCarry - "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover - // bytes 3-5 - "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 - "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly - "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting - // LBCarrys - "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte - // where both - // lsb's were == 1 (only valid for active group) - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) - // for each byte - "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 - // bytes to add to Avg - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to - // Avg for each Active - // byte - - // add 3rd active group (Raw(x-bpp)/2) to average with _LBCarry - "psllq _ShiftBpp, %%mm6 \n\t" // shift mm6 mask to cover last - // two - // bytes - "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 - "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly - // Data only needs to be shifted once here to - // get the correct x-bpp offset. - "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting - // LBCarrys - "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte - // where both - // lsb's were == 1 (only valid for active group) - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) - // for each byte - "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 - // bytes to add to Avg - "addl $8, %%ecx \n\t" - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to - // Avg for each Active - // byte - // now ready to write back to memory - "movq %%mm0, -8(%%edi,%%ecx,) \n\t" - // move updated Raw(x) to use as Raw(x-bpp) for next loop - "cmpl _MMXLength, %%ecx \n\t" - "movq %%mm0, %%mm2 \n\t" // mov updated Raw(x) to mm2 - "jb avg_3lp \n\t" - - : "=S" (dummy_value_S), // output regs (dummy) - "=D" (dummy_value_D) - - : "0" (prev_row), // esi // input regs - "1" (row) // edi - - : "%ecx" // clobber list -#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3" - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - break; // end 3 bpp - - case 6: - case 4: - //case 7: // who wrote this? PNG doesn't support 5 or 7 bytes/pixel - //case 5: // GRR BOGUS - { - _ActiveMask.use = 0xffffffffffffffffLL; // use shift below to clear - // appropriate inactive bytes - _ShiftBpp.use = bpp << 3; - _ShiftRem.use = 64 - _ShiftBpp.use; - - __asm__ __volatile__ ( - "movq _HBClearMask, %%mm4 \n\t" - - // re-init address pointers and offset - "movl _dif, %%ecx \n\t" // ecx: x = offset to - // alignment boundary - - // load _ActiveMask and clear all bytes except for 1st active group - "movq _ActiveMask, %%mm7 \n\t" -// preload "movl row, %%edi \n\t" // edi: Avg(x) - "psrlq _ShiftRem, %%mm7 \n\t" -// preload "movl prev_row, %%esi \n\t" // esi: Prior(x) - "movq %%mm7, %%mm6 \n\t" - "movq _LBCarryMask, %%mm5 \n\t" - "psllq _ShiftBpp, %%mm6 \n\t" // create mask for 2nd active - // group - - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes - // (we correct pos. in loop below) - "avg_4lp: \n\t" - "movq (%%edi,%%ecx,), %%mm0 \n\t" - "psrlq _ShiftRem, %%mm2 \n\t" // shift data to pos. correctly - "movq (%%esi,%%ecx,), %%mm1 \n\t" - // add (Prev_row/2) to average - "movq %%mm5, %%mm3 \n\t" - "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte - "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 - "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for - // each byte - // add 1st active group (Raw(x-bpp)/2) to average with _LBCarry - "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting - // LBCarrys - "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte - // where both - // lsb's were == 1 (only valid for active group) - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) - // for each byte - "pand %%mm7, %%mm2 \n\t" // leave only Active Group 1 - // bytes to add to Avg - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to Avg - // for each Active - // byte - // add 2nd active group (Raw(x-bpp)/2) to average with _LBCarry - "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 - "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly - "addl $8, %%ecx \n\t" - "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting - // LBCarrys - "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte - // where both - // lsb's were == 1 (only valid for active group) - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) - // for each byte - "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 - // bytes to add to Avg - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to - // Avg for each Active - // byte - "cmpl _MMXLength, %%ecx \n\t" - // now ready to write back to memory - "movq %%mm0, -8(%%edi,%%ecx,) \n\t" - // prep Raw(x-bpp) for next loop - "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 - "jb avg_4lp \n\t" - - : "=S" (dummy_value_S), // output regs (dummy) - "=D" (dummy_value_D) - - : "0" (prev_row), // esi // input regs - "1" (row) // edi - - : "%ecx" // clobber list -#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3" - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - break; // end 4,6 bpp - - case 2: - { - _ActiveMask.use = 0x000000000000ffffLL; - _ShiftBpp.use = 16; // == 2 * 8 - _ShiftRem.use = 48; // == 64 - 16 - - __asm__ __volatile__ ( - // load _ActiveMask - "movq _ActiveMask, %%mm7 \n\t" - // re-init address pointers and offset - "movl _dif, %%ecx \n\t" // ecx: x = offset to alignment - // boundary - "movq _LBCarryMask, %%mm5 \n\t" -// preload "movl row, %%edi \n\t" // edi: Avg(x) - "movq _HBClearMask, %%mm4 \n\t" -// preload "movl prev_row, %%esi \n\t" // esi: Prior(x) - - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes - // (we correct pos. in loop below) - "avg_2lp: \n\t" - "movq (%%edi,%%ecx,), %%mm0 \n\t" - "psrlq _ShiftRem, %%mm2 \n\t" // shift data to pos. correctly - "movq (%%esi,%%ecx,), %%mm1 \n\t" // (GRR BUGFIX: was psllq) - // add (Prev_row/2) to average - "movq %%mm5, %%mm3 \n\t" - "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte - "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 - "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each - // byte - "movq %%mm7, %%mm6 \n\t" - "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for - // each byte - - // add 1st active group (Raw(x-bpp)/2) to average with _LBCarry - "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting - // LBCarrys - "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte - // where both - // lsb's were == 1 (only valid - // for active group) - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) - // for each byte - "pand %%mm6, %%mm2 \n\t" // leave only Active Group 1 - // bytes to add to Avg - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to Avg - // for each Active byte - - // add 2nd active group (Raw(x-bpp)/2) to average with _LBCarry - "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover - // bytes 2 & 3 - "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 - "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly - "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting - // LBCarrys - "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte - // where both - // lsb's were == 1 (only valid - // for active group) - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) - // for each byte - "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 - // bytes to add to Avg - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to - // Avg for each Active byte - - // add 3rd active group (Raw(x-bpp)/2) to average with _LBCarry - "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover - // bytes 4 & 5 - "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 - "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly - "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting - // LBCarrys - "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte - // where both lsb's were == 1 - // (only valid for active group) - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) - // for each byte - "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 - // bytes to add to Avg - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to - // Avg for each Active byte - - // add 4th active group (Raw(x-bpp)/2) to average with _LBCarry - "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover - // bytes 6 & 7 - "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 - "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly - "addl $8, %%ecx \n\t" - "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting - // LBCarrys - "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte - // where both - // lsb's were == 1 (only valid - // for active group) - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) - // for each byte - "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 - // bytes to add to Avg - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to - // Avg for each Active byte - - "cmpl _MMXLength, %%ecx \n\t" - // now ready to write back to memory - "movq %%mm0, -8(%%edi,%%ecx,) \n\t" - // prep Raw(x-bpp) for next loop - "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 - "jb avg_2lp \n\t" - - : "=S" (dummy_value_S), // output regs (dummy) - "=D" (dummy_value_D) - - : "0" (prev_row), // esi // input regs - "1" (row) // edi - - : "%ecx" // clobber list -#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3" - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - break; // end 2 bpp - - case 1: - { - __asm__ __volatile__ ( - // re-init address pointers and offset -#ifdef __PIC__ - "pushl %%ebx \n\t" // save Global Offset Table index -#endif - "movl _dif, %%ebx \n\t" // ebx: x = offset to alignment - // boundary -// preload "movl row, %%edi \n\t" // edi: Avg(x) - "cmpl _FullLength, %%ebx \n\t" // test if offset at end of array - "jnb avg_1end \n\t" - // do Paeth decode for remaining bytes -// preload "movl prev_row, %%esi \n\t" // esi: Prior(x) - "movl %%edi, %%edx \n\t" -// preload "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) - "subl %%ecx, %%edx \n\t" // edx: Raw(x-bpp) - "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx - // in loop below - "avg_1lp: \n\t" - // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) - "xorl %%eax, %%eax \n\t" - "movb (%%esi,%%ebx,), %%cl \n\t" // load cl with Prior(x) - "movb (%%edx,%%ebx,), %%al \n\t" // load al with Raw(x-bpp) - "addw %%cx, %%ax \n\t" - "incl %%ebx \n\t" - "shrw %%ax \n\t" // divide by 2 - "addb -1(%%edi,%%ebx,), %%al \n\t" // add Avg(x); -1 to offset - // inc ebx - "cmpl _FullLength, %%ebx \n\t" // check if at end of array - "movb %%al, -1(%%edi,%%ebx,) \n\t" // write back Raw(x); - // mov does not affect flags; -1 to offset inc ebx - "jb avg_1lp \n\t" - - "avg_1end: \n\t" -#ifdef __PIC__ - "popl %%ebx \n\t" // Global Offset Table index -#endif - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "0" (bpp), // ecx // input regs - "1" (prev_row), // esi - "2" (row) // edi - - : "%eax", "%edx" // clobber list -#ifndef __PIC__ - , "%ebx" -#endif - ); - } - return; // end 1 bpp - - case 8: - { - __asm__ __volatile__ ( - // re-init address pointers and offset - "movl _dif, %%ecx \n\t" // ecx: x == offset to alignment - "movq _LBCarryMask, %%mm5 \n\t" // boundary -// preload "movl row, %%edi \n\t" // edi: Avg(x) - "movq _HBClearMask, %%mm4 \n\t" -// preload "movl prev_row, %%esi \n\t" // esi: Prior(x) - - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes - // (NO NEED to correct pos. in loop below) - - "avg_8lp: \n\t" - "movq (%%edi,%%ecx,), %%mm0 \n\t" - "movq %%mm5, %%mm3 \n\t" - "movq (%%esi,%%ecx,), %%mm1 \n\t" - "addl $8, %%ecx \n\t" - "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte - "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 - "pand %%mm2, %%mm3 \n\t" // get LBCarrys for each byte - // where both lsb's were == 1 - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7, each byte - "paddb %%mm3, %%mm0 \n\t" // add LBCarrys to Avg, each byte - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7, each byte - "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg, each - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) to Avg for each - "cmpl _MMXLength, %%ecx \n\t" - "movq %%mm0, -8(%%edi,%%ecx,) \n\t" - "movq %%mm0, %%mm2 \n\t" // reuse as Raw(x-bpp) - "jb avg_8lp \n\t" - - : "=S" (dummy_value_S), // output regs (dummy) - "=D" (dummy_value_D) - - : "0" (prev_row), // esi // input regs - "1" (row) // edi - - : "%ecx" // clobber list -#if 0 /* %mm0, ..., %mm5 not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2" - , "%mm3", "%mm4", "%mm5" -#endif - ); - } - break; // end 8 bpp - - default: // bpp greater than 8 (!= 1,2,3,4,[5],6,[7],8) - { - -#ifdef PNG_DEBUG - // GRR: PRINT ERROR HERE: SHOULD NEVER BE REACHED - png_debug(1, - "Internal logic error in pnggccrd (png_read_filter_row_mmx_avg())\n"); -#endif - -#if 0 - __asm__ __volatile__ ( - "movq _LBCarryMask, %%mm5 \n\t" - // re-init address pointers and offset - "movl _dif, %%ebx \n\t" // ebx: x = offset to - // alignment boundary - "movl row, %%edi \n\t" // edi: Avg(x) - "movq _HBClearMask, %%mm4 \n\t" - "movl %%edi, %%edx \n\t" - "movl prev_row, %%esi \n\t" // esi: Prior(x) - "subl bpp, %%edx \n\t" // edx: Raw(x-bpp) - "avg_Alp: \n\t" - "movq (%%edi,%%ebx,), %%mm0 \n\t" - "movq %%mm5, %%mm3 \n\t" - "movq (%%esi,%%ebx,), %%mm1 \n\t" - "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte - "movq (%%edx,%%ebx,), %%mm2 \n\t" - "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 - "pand %%mm2, %%mm3 \n\t" // get LBCarrys for each byte - // where both lsb's were == 1 - "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 - "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm3, %%mm0 \n\t" // add LBCarrys to Avg for each - // byte - "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each - // byte - "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for - // each byte - "addl $8, %%ebx \n\t" - "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) to Avg for each - // byte - "cmpl _MMXLength, %%ebx \n\t" - "movq %%mm0, -8(%%edi,%%ebx,) \n\t" - "jb avg_Alp \n\t" - - : // FIXASM: output regs/vars go here, e.g.: "=m" (memory_var) - - : // FIXASM: input regs, e.g.: "c" (count), "S" (src), "D" (dest) - - : "%ebx", "%edx", "%edi", "%esi" // CHECKASM: clobber list - ); -#endif /* 0 - NEVER REACHED */ - } - break; - - } // end switch (bpp) - - __asm__ __volatile__ ( - // MMX acceleration complete; now do clean-up - // check if any remaining bytes left to decode -#ifdef __PIC__ - "pushl %%ebx \n\t" // save index to Global Offset Table -#endif - "movl _MMXLength, %%ebx \n\t" // ebx: x == offset bytes after MMX -//pre "movl row, %%edi \n\t" // edi: Avg(x) - "cmpl _FullLength, %%ebx \n\t" // test if offset at end of array - "jnb avg_end \n\t" - - // do Avg decode for remaining bytes -//pre "movl prev_row, %%esi \n\t" // esi: Prior(x) - "movl %%edi, %%edx \n\t" -//pre "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) - "subl %%ecx, %%edx \n\t" // edx: Raw(x-bpp) - "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx below - - "avg_lp2: \n\t" - // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) - "xorl %%eax, %%eax \n\t" - "movb (%%esi,%%ebx,), %%cl \n\t" // load cl with Prior(x) - "movb (%%edx,%%ebx,), %%al \n\t" // load al with Raw(x-bpp) - "addw %%cx, %%ax \n\t" - "incl %%ebx \n\t" - "shrw %%ax \n\t" // divide by 2 - "addb -1(%%edi,%%ebx,), %%al \n\t" // add Avg(x); -1 to offset inc ebx - "cmpl _FullLength, %%ebx \n\t" // check if at end of array - "movb %%al, -1(%%edi,%%ebx,) \n\t" // write back Raw(x) [mov does not - "jb avg_lp2 \n\t" // affect flags; -1 to offset inc ebx] - - "avg_end: \n\t" - "EMMS \n\t" // end MMX; prep for poss. FP instrs. -#ifdef __PIC__ - "popl %%ebx \n\t" // restore index to Global Offset Table -#endif - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "0" (bpp), // ecx // input regs - "1" (prev_row), // esi - "2" (row) // edi - - : "%eax", "%edx" // clobber list -#ifndef __PIC__ - , "%ebx" -#endif - ); - -} /* end png_read_filter_row_mmx_avg() */ -#endif - - - -#ifdef PNG_THREAD_UNSAFE_OK -//===========================================================================// -// // -// P N G _ R E A D _ F I L T E R _ R O W _ M M X _ P A E T H // -// // -//===========================================================================// - -// Optimized code for PNG Paeth filter decoder - -static void /* PRIVATE */ -png_read_filter_row_mmx_paeth(png_row_infop row_info, png_bytep row, - png_bytep prev_row) -{ - int bpp; - int dummy_value_c; // fix 'forbidden register 2 (cx) was spilled' error - int dummy_value_S; - int dummy_value_D; - - bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel - _FullLength = row_info->rowbytes; // # of bytes to filter - - __asm__ __volatile__ ( -#ifdef __PIC__ - "pushl %%ebx \n\t" // save index to Global Offset Table -#endif - "xorl %%ebx, %%ebx \n\t" // ebx: x offset -//pre "movl row, %%edi \n\t" - "xorl %%edx, %%edx \n\t" // edx: x-bpp offset -//pre "movl prev_row, %%esi \n\t" - "xorl %%eax, %%eax \n\t" - - // Compute the Raw value for the first bpp bytes - // Note: the formula works out to be always - // Paeth(x) = Raw(x) + Prior(x) where x < bpp - "paeth_rlp: \n\t" - "movb (%%edi,%%ebx,), %%al \n\t" - "addb (%%esi,%%ebx,), %%al \n\t" - "incl %%ebx \n\t" -//pre "cmpl bpp, %%ebx \n\t" (bpp is preloaded into ecx) - "cmpl %%ecx, %%ebx \n\t" - "movb %%al, -1(%%edi,%%ebx,) \n\t" - "jb paeth_rlp \n\t" - // get # of bytes to alignment - "movl %%edi, _dif \n\t" // take start of row - "addl %%ebx, _dif \n\t" // add bpp - "xorl %%ecx, %%ecx \n\t" - "addl $0xf, _dif \n\t" // add 7 + 8 to incr past alignment - // boundary - "andl $0xfffffff8, _dif \n\t" // mask to alignment boundary - "subl %%edi, _dif \n\t" // subtract from start ==> value ebx - // at alignment - "jz paeth_go \n\t" - // fix alignment - - "paeth_lp1: \n\t" - "xorl %%eax, %%eax \n\t" - // pav = p - a = (a + b - c) - a = b - c - "movb (%%esi,%%ebx,), %%al \n\t" // load Prior(x) into al - "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl - "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) - "movl %%eax, _patemp \n\t" // Save pav for later use - "xorl %%eax, %%eax \n\t" - // pbv = p - b = (a + b - c) - b = a - c - "movb (%%edi,%%edx,), %%al \n\t" // load Raw(x-bpp) into al - "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) - "movl %%eax, %%ecx \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "addl _patemp, %%eax \n\t" // pcv = pav + pbv - // pc = abs(pcv) - "testl $0x80000000, %%eax \n\t" - "jz paeth_pca \n\t" - "negl %%eax \n\t" // reverse sign of neg values - - "paeth_pca: \n\t" - "movl %%eax, _pctemp \n\t" // save pc for later use - // pb = abs(pbv) - "testl $0x80000000, %%ecx \n\t" - "jz paeth_pba \n\t" - "negl %%ecx \n\t" // reverse sign of neg values - - "paeth_pba: \n\t" - "movl %%ecx, _pbtemp \n\t" // save pb for later use - // pa = abs(pav) - "movl _patemp, %%eax \n\t" - "testl $0x80000000, %%eax \n\t" - "jz paeth_paa \n\t" - "negl %%eax \n\t" // reverse sign of neg values - - "paeth_paa: \n\t" - "movl %%eax, _patemp \n\t" // save pa for later use - // test if pa <= pb - "cmpl %%ecx, %%eax \n\t" - "jna paeth_abb \n\t" - // pa > pb; now test if pb <= pc - "cmpl _pctemp, %%ecx \n\t" - "jna paeth_bbc \n\t" - // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl - "jmp paeth_paeth \n\t" - - "paeth_bbc: \n\t" - // pb <= pc; Raw(x) = Paeth(x) + Prior(x) - "movb (%%esi,%%ebx,), %%cl \n\t" // load Prior(x) into cl - "jmp paeth_paeth \n\t" - - "paeth_abb: \n\t" - // pa <= pb; now test if pa <= pc - "cmpl _pctemp, %%eax \n\t" - "jna paeth_abc \n\t" - // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl - "jmp paeth_paeth \n\t" - - "paeth_abc: \n\t" - // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) - "movb (%%edi,%%edx,), %%cl \n\t" // load Raw(x-bpp) into cl - - "paeth_paeth: \n\t" - "incl %%ebx \n\t" - "incl %%edx \n\t" - // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 - "addb %%cl, -1(%%edi,%%ebx,) \n\t" - "cmpl _dif, %%ebx \n\t" - "jb paeth_lp1 \n\t" - - "paeth_go: \n\t" - "movl _FullLength, %%ecx \n\t" - "movl %%ecx, %%eax \n\t" - "subl %%ebx, %%eax \n\t" // subtract alignment fix - "andl $0x00000007, %%eax \n\t" // calc bytes over mult of 8 - "subl %%eax, %%ecx \n\t" // drop over bytes from original length - "movl %%ecx, _MMXLength \n\t" -#ifdef __PIC__ - "popl %%ebx \n\t" // restore index to Global Offset Table -#endif - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "0" (bpp), // ecx // input regs - "1" (prev_row), // esi - "2" (row) // edi - - : "%eax", "%edx" // clobber list -#ifndef __PIC__ - , "%ebx" -#endif - ); - - // now do the math for the rest of the row - switch (bpp) - { - case 3: - { - _ActiveMask.use = 0x0000000000ffffffLL; - _ActiveMaskEnd.use = 0xffff000000000000LL; - _ShiftBpp.use = 24; // == bpp(3) * 8 - _ShiftRem.use = 40; // == 64 - 24 - - __asm__ __volatile__ ( - "movl _dif, %%ecx \n\t" -// preload "movl row, %%edi \n\t" -// preload "movl prev_row, %%esi \n\t" - "pxor %%mm0, %%mm0 \n\t" - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%ecx,), %%mm1 \n\t" - "paeth_3lp: \n\t" - "psrlq _ShiftRem, %%mm1 \n\t" // shift last 3 bytes to 1st - // 3 bytes - "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) - "punpcklbw %%mm0, %%mm1 \n\t" // unpack High bytes of a - "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // prep c=Prior(x-bpp) bytes - "punpcklbw %%mm0, %%mm2 \n\t" // unpack High bytes of b - "psrlq _ShiftRem, %%mm3 \n\t" // shift last 3 bytes to 1st - // 3 bytes - // pav = p - a = (a + b - c) - a = b - c - "movq %%mm2, %%mm4 \n\t" - "punpcklbw %%mm0, %%mm3 \n\t" // unpack High bytes of c - // pbv = p - b = (a + b - c) - b = a - c - "movq %%mm1, %%mm5 \n\t" - "psubw %%mm3, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "movq %%mm4, %%mm6 \n\t" - "psubw %%mm3, %%mm5 \n\t" - - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 - "paddw %%mm5, %%mm6 \n\t" - "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 - "psubw %%mm0, %%mm4 \n\t" - "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm7, %%mm5 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 - "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm7, %%mm5 \n\t" - "psubw %%mm0, %%mm6 \n\t" - // test pa <= pb - "movq %%mm4, %%mm7 \n\t" - "psubw %%mm0, %%mm6 \n\t" - "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? - "movq %%mm7, %%mm0 \n\t" - // use mm7 mask to merge pa & pb - "pand %%mm7, %%mm5 \n\t" - // use mm0 mask copy to merge a & b - "pand %%mm0, %%mm2 \n\t" - "pandn %%mm4, %%mm7 \n\t" - "pandn %%mm1, %%mm0 \n\t" - "paddw %%mm5, %%mm7 \n\t" - "paddw %%mm2, %%mm0 \n\t" - // test ((pa <= pb)? pa:pb) <= pc - "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? - "pxor %%mm1, %%mm1 \n\t" - "pand %%mm7, %%mm3 \n\t" - "pandn %%mm0, %%mm7 \n\t" - "paddw %%mm3, %%mm7 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "packuswb %%mm1, %%mm7 \n\t" - "movq (%%esi,%%ecx,), %%mm3 \n\t" // load c=Prior(x-bpp) - "pand _ActiveMask, %%mm7 \n\t" - "movq %%mm3, %%mm2 \n\t" // load b=Prior(x) step 1 - "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x) - "punpcklbw %%mm0, %%mm3 \n\t" // unpack High bytes of c - "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value - "movq %%mm7, %%mm1 \n\t" // now mm1 will be used as - // Raw(x-bpp) - // now do Paeth for 2nd set of bytes (3-5) - "psrlq _ShiftBpp, %%mm2 \n\t" // load b=Prior(x) step 2 - "punpcklbw %%mm0, %%mm1 \n\t" // unpack High bytes of a - "pxor %%mm7, %%mm7 \n\t" - "punpcklbw %%mm0, %%mm2 \n\t" // unpack High bytes of b - // pbv = p - b = (a + b - c) - b = a - c - "movq %%mm1, %%mm5 \n\t" - // pav = p - a = (a + b - c) - a = b - c - "movq %%mm2, %%mm4 \n\t" - "psubw %%mm3, %%mm5 \n\t" - "psubw %%mm3, %%mm4 \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = - // pav + pbv = pbv + pav - "movq %%mm5, %%mm6 \n\t" - "paddw %%mm4, %%mm6 \n\t" - - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - "pcmpgtw %%mm5, %%mm0 \n\t" // create mask pbv bytes < 0 - "pcmpgtw %%mm4, %%mm7 \n\t" // create mask pav bytes < 0 - "pand %%mm5, %%mm0 \n\t" // only pbv bytes < 0 in mm0 - "pand %%mm4, %%mm7 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm0, %%mm5 \n\t" - "psubw %%mm7, %%mm4 \n\t" - "psubw %%mm0, %%mm5 \n\t" - "psubw %%mm7, %%mm4 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 - "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm0, %%mm6 \n\t" - // test pa <= pb - "movq %%mm4, %%mm7 \n\t" - "psubw %%mm0, %%mm6 \n\t" - "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? - "movq %%mm7, %%mm0 \n\t" - // use mm7 mask to merge pa & pb - "pand %%mm7, %%mm5 \n\t" - // use mm0 mask copy to merge a & b - "pand %%mm0, %%mm2 \n\t" - "pandn %%mm4, %%mm7 \n\t" - "pandn %%mm1, %%mm0 \n\t" - "paddw %%mm5, %%mm7 \n\t" - "paddw %%mm2, %%mm0 \n\t" - // test ((pa <= pb)? pa:pb) <= pc - "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? - "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) - "pand %%mm7, %%mm3 \n\t" - "pandn %%mm0, %%mm7 \n\t" - "pxor %%mm1, %%mm1 \n\t" - "paddw %%mm3, %%mm7 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "packuswb %%mm1, %%mm7 \n\t" - "movq %%mm2, %%mm3 \n\t" // load c=Prior(x-bpp) step 1 - "pand _ActiveMask, %%mm7 \n\t" - "punpckhbw %%mm0, %%mm2 \n\t" // unpack High bytes of b - "psllq _ShiftBpp, %%mm7 \n\t" // shift bytes to 2nd group of - // 3 bytes - // pav = p - a = (a + b - c) - a = b - c - "movq %%mm2, %%mm4 \n\t" - "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x) - "psllq _ShiftBpp, %%mm3 \n\t" // load c=Prior(x-bpp) step 2 - "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value - "movq %%mm7, %%mm1 \n\t" - "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c - "psllq _ShiftBpp, %%mm1 \n\t" // shift bytes - // now mm1 will be used as Raw(x-bpp) - // now do Paeth for 3rd, and final, set of bytes (6-7) - "pxor %%mm7, %%mm7 \n\t" - "punpckhbw %%mm0, %%mm1 \n\t" // unpack High bytes of a - "psubw %%mm3, %%mm4 \n\t" - // pbv = p - b = (a + b - c) - b = a - c - "movq %%mm1, %%mm5 \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "movq %%mm4, %%mm6 \n\t" - "psubw %%mm3, %%mm5 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "paddw %%mm5, %%mm6 \n\t" - - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 - "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 - "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm7, %%mm5 \n\t" - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm7, %%mm5 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 - "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm0, %%mm6 \n\t" - // test pa <= pb - "movq %%mm4, %%mm7 \n\t" - "psubw %%mm0, %%mm6 \n\t" - "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? - "movq %%mm7, %%mm0 \n\t" - // use mm0 mask copy to merge a & b - "pand %%mm0, %%mm2 \n\t" - // use mm7 mask to merge pa & pb - "pand %%mm7, %%mm5 \n\t" - "pandn %%mm1, %%mm0 \n\t" - "pandn %%mm4, %%mm7 \n\t" - "paddw %%mm2, %%mm0 \n\t" - "paddw %%mm5, %%mm7 \n\t" - // test ((pa <= pb)? pa:pb) <= pc - "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? - "pand %%mm7, %%mm3 \n\t" - "pandn %%mm0, %%mm7 \n\t" - "paddw %%mm3, %%mm7 \n\t" - "pxor %%mm1, %%mm1 \n\t" - "packuswb %%mm7, %%mm1 \n\t" - // step ecx to next set of 8 bytes and repeat loop til done - "addl $8, %%ecx \n\t" - "pand _ActiveMaskEnd, %%mm1 \n\t" - "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add Paeth predictor with - // Raw(x) - - "cmpl _MMXLength, %%ecx \n\t" - "pxor %%mm0, %%mm0 \n\t" // pxor does not affect flags - "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value - // mm1 will be used as Raw(x-bpp) next loop - // mm3 ready to be used as Prior(x-bpp) next loop - "jb paeth_3lp \n\t" - - : "=S" (dummy_value_S), // output regs (dummy) - "=D" (dummy_value_D) - - : "0" (prev_row), // esi // input regs - "1" (row) // edi - - : "%ecx" // clobber list -#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3" - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - break; // end 3 bpp - - case 6: - //case 7: // GRR BOGUS - //case 5: // GRR BOGUS - { - _ActiveMask.use = 0x00000000ffffffffLL; - _ActiveMask2.use = 0xffffffff00000000LL; - _ShiftBpp.use = bpp << 3; // == bpp * 8 - _ShiftRem.use = 64 - _ShiftBpp.use; - - __asm__ __volatile__ ( - "movl _dif, %%ecx \n\t" -// preload "movl row, %%edi \n\t" -// preload "movl prev_row, %%esi \n\t" - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%ecx,), %%mm1 \n\t" - "pxor %%mm0, %%mm0 \n\t" - - "paeth_6lp: \n\t" - // must shift to position Raw(x-bpp) data - "psrlq _ShiftRem, %%mm1 \n\t" - // do first set of 4 bytes - "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes - "punpcklbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a - "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) - "punpcklbw %%mm0, %%mm2 \n\t" // unpack Low bytes of b - // must shift to position Prior(x-bpp) data - "psrlq _ShiftRem, %%mm3 \n\t" - // pav = p - a = (a + b - c) - a = b - c - "movq %%mm2, %%mm4 \n\t" - "punpcklbw %%mm0, %%mm3 \n\t" // unpack Low bytes of c - // pbv = p - b = (a + b - c) - b = a - c - "movq %%mm1, %%mm5 \n\t" - "psubw %%mm3, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "movq %%mm4, %%mm6 \n\t" - "psubw %%mm3, %%mm5 \n\t" - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 - "paddw %%mm5, %%mm6 \n\t" - "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 - "psubw %%mm0, %%mm4 \n\t" - "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm7, %%mm5 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 - "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm7, %%mm5 \n\t" - "psubw %%mm0, %%mm6 \n\t" - // test pa <= pb - "movq %%mm4, %%mm7 \n\t" - "psubw %%mm0, %%mm6 \n\t" - "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? - "movq %%mm7, %%mm0 \n\t" - // use mm7 mask to merge pa & pb - "pand %%mm7, %%mm5 \n\t" - // use mm0 mask copy to merge a & b - "pand %%mm0, %%mm2 \n\t" - "pandn %%mm4, %%mm7 \n\t" - "pandn %%mm1, %%mm0 \n\t" - "paddw %%mm5, %%mm7 \n\t" - "paddw %%mm2, %%mm0 \n\t" - // test ((pa <= pb)? pa:pb) <= pc - "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? - "pxor %%mm1, %%mm1 \n\t" - "pand %%mm7, %%mm3 \n\t" - "pandn %%mm0, %%mm7 \n\t" - "paddw %%mm3, %%mm7 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "packuswb %%mm1, %%mm7 \n\t" - "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // load c=Prior(x-bpp) - "pand _ActiveMask, %%mm7 \n\t" - "psrlq _ShiftRem, %%mm3 \n\t" - "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) step 1 - "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor and Raw(x) - "movq %%mm2, %%mm6 \n\t" - "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value - "movq -8(%%edi,%%ecx,), %%mm1 \n\t" - "psllq _ShiftBpp, %%mm6 \n\t" - "movq %%mm7, %%mm5 \n\t" - "psrlq _ShiftRem, %%mm1 \n\t" - "por %%mm6, %%mm3 \n\t" - "psllq _ShiftBpp, %%mm5 \n\t" - "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c - "por %%mm5, %%mm1 \n\t" - // do second set of 4 bytes - "punpckhbw %%mm0, %%mm2 \n\t" // unpack High bytes of b - "punpckhbw %%mm0, %%mm1 \n\t" // unpack High bytes of a - // pav = p - a = (a + b - c) - a = b - c - "movq %%mm2, %%mm4 \n\t" - // pbv = p - b = (a + b - c) - b = a - c - "movq %%mm1, %%mm5 \n\t" - "psubw %%mm3, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "movq %%mm4, %%mm6 \n\t" - "psubw %%mm3, %%mm5 \n\t" - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 - "paddw %%mm5, %%mm6 \n\t" - "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 - "psubw %%mm0, %%mm4 \n\t" - "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm7, %%mm5 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 - "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm7, %%mm5 \n\t" - "psubw %%mm0, %%mm6 \n\t" - // test pa <= pb - "movq %%mm4, %%mm7 \n\t" - "psubw %%mm0, %%mm6 \n\t" - "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? - "movq %%mm7, %%mm0 \n\t" - // use mm7 mask to merge pa & pb - "pand %%mm7, %%mm5 \n\t" - // use mm0 mask copy to merge a & b - "pand %%mm0, %%mm2 \n\t" - "pandn %%mm4, %%mm7 \n\t" - "pandn %%mm1, %%mm0 \n\t" - "paddw %%mm5, %%mm7 \n\t" - "paddw %%mm2, %%mm0 \n\t" - // test ((pa <= pb)? pa:pb) <= pc - "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? - "pxor %%mm1, %%mm1 \n\t" - "pand %%mm7, %%mm3 \n\t" - "pandn %%mm0, %%mm7 \n\t" - "pxor %%mm1, %%mm1 \n\t" - "paddw %%mm3, %%mm7 \n\t" - "pxor %%mm0, %%mm0 \n\t" - // step ecx to next set of 8 bytes and repeat loop til done - "addl $8, %%ecx \n\t" - "packuswb %%mm7, %%mm1 \n\t" - "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add Paeth predictor with Raw(x) - "cmpl _MMXLength, %%ecx \n\t" - "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value - // mm1 will be used as Raw(x-bpp) next loop - "jb paeth_6lp \n\t" - - : "=S" (dummy_value_S), // output regs (dummy) - "=D" (dummy_value_D) - - : "0" (prev_row), // esi // input regs - "1" (row) // edi - - : "%ecx" // clobber list -#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3" - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - break; // end 6 bpp - - case 4: - { - _ActiveMask.use = 0x00000000ffffffffLL; - - __asm__ __volatile__ ( - "movl _dif, %%ecx \n\t" -// preload "movl row, %%edi \n\t" -// preload "movl prev_row, %%esi \n\t" - "pxor %%mm0, %%mm0 \n\t" - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%ecx,), %%mm1 \n\t" // only time should need to read - // a=Raw(x-bpp) bytes - "paeth_4lp: \n\t" - // do first set of 4 bytes - "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes - "punpckhbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a - "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) - "punpcklbw %%mm0, %%mm2 \n\t" // unpack High bytes of b - // pav = p - a = (a + b - c) - a = b - c - "movq %%mm2, %%mm4 \n\t" - "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c - // pbv = p - b = (a + b - c) - b = a - c - "movq %%mm1, %%mm5 \n\t" - "psubw %%mm3, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "movq %%mm4, %%mm6 \n\t" - "psubw %%mm3, %%mm5 \n\t" - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 - "paddw %%mm5, %%mm6 \n\t" - "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 - "psubw %%mm0, %%mm4 \n\t" - "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm7, %%mm5 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 - "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm7, %%mm5 \n\t" - "psubw %%mm0, %%mm6 \n\t" - // test pa <= pb - "movq %%mm4, %%mm7 \n\t" - "psubw %%mm0, %%mm6 \n\t" - "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? - "movq %%mm7, %%mm0 \n\t" - // use mm7 mask to merge pa & pb - "pand %%mm7, %%mm5 \n\t" - // use mm0 mask copy to merge a & b - "pand %%mm0, %%mm2 \n\t" - "pandn %%mm4, %%mm7 \n\t" - "pandn %%mm1, %%mm0 \n\t" - "paddw %%mm5, %%mm7 \n\t" - "paddw %%mm2, %%mm0 \n\t" - // test ((pa <= pb)? pa:pb) <= pc - "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? - "pxor %%mm1, %%mm1 \n\t" - "pand %%mm7, %%mm3 \n\t" - "pandn %%mm0, %%mm7 \n\t" - "paddw %%mm3, %%mm7 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "packuswb %%mm1, %%mm7 \n\t" - "movq (%%esi,%%ecx,), %%mm3 \n\t" // load c=Prior(x-bpp) - "pand _ActiveMask, %%mm7 \n\t" - "movq %%mm3, %%mm2 \n\t" // load b=Prior(x) step 1 - "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x) - "punpcklbw %%mm0, %%mm3 \n\t" // unpack High bytes of c - "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value - "movq %%mm7, %%mm1 \n\t" // now mm1 will be used as Raw(x-bpp) - // do second set of 4 bytes - "punpckhbw %%mm0, %%mm2 \n\t" // unpack Low bytes of b - "punpcklbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a - // pav = p - a = (a + b - c) - a = b - c - "movq %%mm2, %%mm4 \n\t" - // pbv = p - b = (a + b - c) - b = a - c - "movq %%mm1, %%mm5 \n\t" - "psubw %%mm3, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "movq %%mm4, %%mm6 \n\t" - "psubw %%mm3, %%mm5 \n\t" - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 - "paddw %%mm5, %%mm6 \n\t" - "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 - "psubw %%mm0, %%mm4 \n\t" - "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm7, %%mm5 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 - "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm7, %%mm5 \n\t" - "psubw %%mm0, %%mm6 \n\t" - // test pa <= pb - "movq %%mm4, %%mm7 \n\t" - "psubw %%mm0, %%mm6 \n\t" - "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? - "movq %%mm7, %%mm0 \n\t" - // use mm7 mask to merge pa & pb - "pand %%mm7, %%mm5 \n\t" - // use mm0 mask copy to merge a & b - "pand %%mm0, %%mm2 \n\t" - "pandn %%mm4, %%mm7 \n\t" - "pandn %%mm1, %%mm0 \n\t" - "paddw %%mm5, %%mm7 \n\t" - "paddw %%mm2, %%mm0 \n\t" - // test ((pa <= pb)? pa:pb) <= pc - "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? - "pxor %%mm1, %%mm1 \n\t" - "pand %%mm7, %%mm3 \n\t" - "pandn %%mm0, %%mm7 \n\t" - "pxor %%mm1, %%mm1 \n\t" - "paddw %%mm3, %%mm7 \n\t" - "pxor %%mm0, %%mm0 \n\t" - // step ecx to next set of 8 bytes and repeat loop til done - "addl $8, %%ecx \n\t" - "packuswb %%mm7, %%mm1 \n\t" - "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add predictor with Raw(x) - "cmpl _MMXLength, %%ecx \n\t" - "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value - // mm1 will be used as Raw(x-bpp) next loop - "jb paeth_4lp \n\t" - - : "=S" (dummy_value_S), // output regs (dummy) - "=D" (dummy_value_D) - - : "0" (prev_row), // esi // input regs - "1" (row) // edi - - : "%ecx" // clobber list -#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3" - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - break; // end 4 bpp - - case 8: // bpp == 8 - { - _ActiveMask.use = 0x00000000ffffffffLL; - - __asm__ __volatile__ ( - "movl _dif, %%ecx \n\t" -// preload "movl row, %%edi \n\t" -// preload "movl prev_row, %%esi \n\t" - "pxor %%mm0, %%mm0 \n\t" - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%ecx,), %%mm1 \n\t" // only time should need to read - // a=Raw(x-bpp) bytes - "paeth_8lp: \n\t" - // do first set of 4 bytes - "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes - "punpcklbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a - "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) - "punpcklbw %%mm0, %%mm2 \n\t" // unpack Low bytes of b - // pav = p - a = (a + b - c) - a = b - c - "movq %%mm2, %%mm4 \n\t" - "punpcklbw %%mm0, %%mm3 \n\t" // unpack Low bytes of c - // pbv = p - b = (a + b - c) - b = a - c - "movq %%mm1, %%mm5 \n\t" - "psubw %%mm3, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "movq %%mm4, %%mm6 \n\t" - "psubw %%mm3, %%mm5 \n\t" - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 - "paddw %%mm5, %%mm6 \n\t" - "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 - "psubw %%mm0, %%mm4 \n\t" - "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm7, %%mm5 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 - "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm7, %%mm5 \n\t" - "psubw %%mm0, %%mm6 \n\t" - // test pa <= pb - "movq %%mm4, %%mm7 \n\t" - "psubw %%mm0, %%mm6 \n\t" - "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? - "movq %%mm7, %%mm0 \n\t" - // use mm7 mask to merge pa & pb - "pand %%mm7, %%mm5 \n\t" - // use mm0 mask copy to merge a & b - "pand %%mm0, %%mm2 \n\t" - "pandn %%mm4, %%mm7 \n\t" - "pandn %%mm1, %%mm0 \n\t" - "paddw %%mm5, %%mm7 \n\t" - "paddw %%mm2, %%mm0 \n\t" - // test ((pa <= pb)? pa:pb) <= pc - "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? - "pxor %%mm1, %%mm1 \n\t" - "pand %%mm7, %%mm3 \n\t" - "pandn %%mm0, %%mm7 \n\t" - "paddw %%mm3, %%mm7 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "packuswb %%mm1, %%mm7 \n\t" - "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes - "pand _ActiveMask, %%mm7 \n\t" - "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) - "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x) - "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c - "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value - "movq -8(%%edi,%%ecx,), %%mm1 \n\t" // read a=Raw(x-bpp) bytes - - // do second set of 4 bytes - "punpckhbw %%mm0, %%mm2 \n\t" // unpack High bytes of b - "punpckhbw %%mm0, %%mm1 \n\t" // unpack High bytes of a - // pav = p - a = (a + b - c) - a = b - c - "movq %%mm2, %%mm4 \n\t" - // pbv = p - b = (a + b - c) - b = a - c - "movq %%mm1, %%mm5 \n\t" - "psubw %%mm3, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "movq %%mm4, %%mm6 \n\t" - "psubw %%mm3, %%mm5 \n\t" - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 - "paddw %%mm5, %%mm6 \n\t" - "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 - "psubw %%mm0, %%mm4 \n\t" - "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm7, %%mm5 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 - "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 - "psubw %%mm7, %%mm5 \n\t" - "psubw %%mm0, %%mm6 \n\t" - // test pa <= pb - "movq %%mm4, %%mm7 \n\t" - "psubw %%mm0, %%mm6 \n\t" - "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? - "movq %%mm7, %%mm0 \n\t" - // use mm7 mask to merge pa & pb - "pand %%mm7, %%mm5 \n\t" - // use mm0 mask copy to merge a & b - "pand %%mm0, %%mm2 \n\t" - "pandn %%mm4, %%mm7 \n\t" - "pandn %%mm1, %%mm0 \n\t" - "paddw %%mm5, %%mm7 \n\t" - "paddw %%mm2, %%mm0 \n\t" - // test ((pa <= pb)? pa:pb) <= pc - "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? - "pxor %%mm1, %%mm1 \n\t" - "pand %%mm7, %%mm3 \n\t" - "pandn %%mm0, %%mm7 \n\t" - "pxor %%mm1, %%mm1 \n\t" - "paddw %%mm3, %%mm7 \n\t" - "pxor %%mm0, %%mm0 \n\t" - // step ecx to next set of 8 bytes and repeat loop til done - "addl $8, %%ecx \n\t" - "packuswb %%mm7, %%mm1 \n\t" - "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add Paeth predictor with Raw(x) - "cmpl _MMXLength, %%ecx \n\t" - "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value - // mm1 will be used as Raw(x-bpp) next loop - "jb paeth_8lp \n\t" - - : "=S" (dummy_value_S), // output regs (dummy) - "=D" (dummy_value_D) - - : "0" (prev_row), // esi // input regs - "1" (row) // edi - - : "%ecx" // clobber list -#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3" - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - break; // end 8 bpp - - case 1: // bpp = 1 - case 2: // bpp = 2 - default: // bpp > 8 - { - __asm__ __volatile__ ( -#ifdef __PIC__ - "pushl %%ebx \n\t" // save Global Offset Table index -#endif - "movl _dif, %%ebx \n\t" - "cmpl _FullLength, %%ebx \n\t" - "jnb paeth_dend \n\t" - -// preload "movl row, %%edi \n\t" -// preload "movl prev_row, %%esi \n\t" - // do Paeth decode for remaining bytes - "movl %%ebx, %%edx \n\t" -// preload "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) - "subl %%ecx, %%edx \n\t" // edx = ebx - bpp - "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx - - "paeth_dlp: \n\t" - "xorl %%eax, %%eax \n\t" - // pav = p - a = (a + b - c) - a = b - c - "movb (%%esi,%%ebx,), %%al \n\t" // load Prior(x) into al - "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl - "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) - "movl %%eax, _patemp \n\t" // Save pav for later use - "xorl %%eax, %%eax \n\t" - // pbv = p - b = (a + b - c) - b = a - c - "movb (%%edi,%%edx,), %%al \n\t" // load Raw(x-bpp) into al - "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) - "movl %%eax, %%ecx \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "addl _patemp, %%eax \n\t" // pcv = pav + pbv - // pc = abs(pcv) - "testl $0x80000000, %%eax \n\t" - "jz paeth_dpca \n\t" - "negl %%eax \n\t" // reverse sign of neg values - - "paeth_dpca: \n\t" - "movl %%eax, _pctemp \n\t" // save pc for later use - // pb = abs(pbv) - "testl $0x80000000, %%ecx \n\t" - "jz paeth_dpba \n\t" - "negl %%ecx \n\t" // reverse sign of neg values - - "paeth_dpba: \n\t" - "movl %%ecx, _pbtemp \n\t" // save pb for later use - // pa = abs(pav) - "movl _patemp, %%eax \n\t" - "testl $0x80000000, %%eax \n\t" - "jz paeth_dpaa \n\t" - "negl %%eax \n\t" // reverse sign of neg values - - "paeth_dpaa: \n\t" - "movl %%eax, _patemp \n\t" // save pa for later use - // test if pa <= pb - "cmpl %%ecx, %%eax \n\t" - "jna paeth_dabb \n\t" - // pa > pb; now test if pb <= pc - "cmpl _pctemp, %%ecx \n\t" - "jna paeth_dbbc \n\t" - // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl - "jmp paeth_dpaeth \n\t" - - "paeth_dbbc: \n\t" - // pb <= pc; Raw(x) = Paeth(x) + Prior(x) - "movb (%%esi,%%ebx,), %%cl \n\t" // load Prior(x) into cl - "jmp paeth_dpaeth \n\t" - - "paeth_dabb: \n\t" - // pa <= pb; now test if pa <= pc - "cmpl _pctemp, %%eax \n\t" - "jna paeth_dabc \n\t" - // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl - "jmp paeth_dpaeth \n\t" - - "paeth_dabc: \n\t" - // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) - "movb (%%edi,%%edx,), %%cl \n\t" // load Raw(x-bpp) into cl - - "paeth_dpaeth: \n\t" - "incl %%ebx \n\t" - "incl %%edx \n\t" - // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 - "addb %%cl, -1(%%edi,%%ebx,) \n\t" - "cmpl _FullLength, %%ebx \n\t" - "jb paeth_dlp \n\t" - - "paeth_dend: \n\t" -#ifdef __PIC__ - "popl %%ebx \n\t" // index to Global Offset Table -#endif - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "0" (bpp), // ecx // input regs - "1" (prev_row), // esi - "2" (row) // edi - - : "%eax", "%edx" // clobber list -#ifndef __PIC__ - , "%ebx" -#endif - ); - } - return; // No need to go further with this one - - } // end switch (bpp) - - __asm__ __volatile__ ( - // MMX acceleration complete; now do clean-up - // check if any remaining bytes left to decode -#ifdef __PIC__ - "pushl %%ebx \n\t" // save index to Global Offset Table -#endif - "movl _MMXLength, %%ebx \n\t" - "cmpl _FullLength, %%ebx \n\t" - "jnb paeth_end \n\t" -//pre "movl row, %%edi \n\t" -//pre "movl prev_row, %%esi \n\t" - // do Paeth decode for remaining bytes - "movl %%ebx, %%edx \n\t" -//pre "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) - "subl %%ecx, %%edx \n\t" // edx = ebx - bpp - "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx below - - "paeth_lp2: \n\t" - "xorl %%eax, %%eax \n\t" - // pav = p - a = (a + b - c) - a = b - c - "movb (%%esi,%%ebx,), %%al \n\t" // load Prior(x) into al - "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl - "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) - "movl %%eax, _patemp \n\t" // Save pav for later use - "xorl %%eax, %%eax \n\t" - // pbv = p - b = (a + b - c) - b = a - c - "movb (%%edi,%%edx,), %%al \n\t" // load Raw(x-bpp) into al - "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) - "movl %%eax, %%ecx \n\t" - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - "addl _patemp, %%eax \n\t" // pcv = pav + pbv - // pc = abs(pcv) - "testl $0x80000000, %%eax \n\t" - "jz paeth_pca2 \n\t" - "negl %%eax \n\t" // reverse sign of neg values - - "paeth_pca2: \n\t" - "movl %%eax, _pctemp \n\t" // save pc for later use - // pb = abs(pbv) - "testl $0x80000000, %%ecx \n\t" - "jz paeth_pba2 \n\t" - "negl %%ecx \n\t" // reverse sign of neg values - - "paeth_pba2: \n\t" - "movl %%ecx, _pbtemp \n\t" // save pb for later use - // pa = abs(pav) - "movl _patemp, %%eax \n\t" - "testl $0x80000000, %%eax \n\t" - "jz paeth_paa2 \n\t" - "negl %%eax \n\t" // reverse sign of neg values - - "paeth_paa2: \n\t" - "movl %%eax, _patemp \n\t" // save pa for later use - // test if pa <= pb - "cmpl %%ecx, %%eax \n\t" - "jna paeth_abb2 \n\t" - // pa > pb; now test if pb <= pc - "cmpl _pctemp, %%ecx \n\t" - "jna paeth_bbc2 \n\t" - // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl - "jmp paeth_paeth2 \n\t" - - "paeth_bbc2: \n\t" - // pb <= pc; Raw(x) = Paeth(x) + Prior(x) - "movb (%%esi,%%ebx,), %%cl \n\t" // load Prior(x) into cl - "jmp paeth_paeth2 \n\t" - - "paeth_abb2: \n\t" - // pa <= pb; now test if pa <= pc - "cmpl _pctemp, %%eax \n\t" - "jna paeth_abc2 \n\t" - // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl - "jmp paeth_paeth2 \n\t" - - "paeth_abc2: \n\t" - // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) - "movb (%%edi,%%edx,), %%cl \n\t" // load Raw(x-bpp) into cl - - "paeth_paeth2: \n\t" - "incl %%ebx \n\t" - "incl %%edx \n\t" - // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 - "addb %%cl, -1(%%edi,%%ebx,) \n\t" - "cmpl _FullLength, %%ebx \n\t" - "jb paeth_lp2 \n\t" - - "paeth_end: \n\t" - "EMMS \n\t" // end MMX; prep for poss. FP instrs. -#ifdef __PIC__ - "popl %%ebx \n\t" // restore index to Global Offset Table -#endif - - : "=c" (dummy_value_c), // output regs (dummy) - "=S" (dummy_value_S), - "=D" (dummy_value_D) - - : "0" (bpp), // ecx // input regs - "1" (prev_row), // esi - "2" (row) // edi - - : "%eax", "%edx" // clobber list (no input regs!) -#ifndef __PIC__ - , "%ebx" -#endif - ); - -} /* end png_read_filter_row_mmx_paeth() */ -#endif - - - - -#ifdef PNG_THREAD_UNSAFE_OK -//===========================================================================// -// // -// P N G _ R E A D _ F I L T E R _ R O W _ M M X _ S U B // -// // -//===========================================================================// - -// Optimized code for PNG Sub filter decoder - -static void /* PRIVATE */ -png_read_filter_row_mmx_sub(png_row_infop row_info, png_bytep row) -{ - int bpp; - int dummy_value_a; - int dummy_value_D; - - bpp = (row_info->pixel_depth + 7) >> 3; // calc number of bytes per pixel - _FullLength = row_info->rowbytes - bpp; // number of bytes to filter - - __asm__ __volatile__ ( -//pre "movl row, %%edi \n\t" - "movl %%edi, %%esi \n\t" // lp = row -//pre "movl bpp, %%eax \n\t" - "addl %%eax, %%edi \n\t" // rp = row + bpp -//irr "xorl %%eax, %%eax \n\t" - // get # of bytes to alignment - "movl %%edi, _dif \n\t" // take start of row - "addl $0xf, _dif \n\t" // add 7 + 8 to incr past - // alignment boundary - "xorl %%ecx, %%ecx \n\t" - "andl $0xfffffff8, _dif \n\t" // mask to alignment boundary - "subl %%edi, _dif \n\t" // subtract from start ==> value - "jz sub_go \n\t" // ecx at alignment - - "sub_lp1: \n\t" // fix alignment - "movb (%%esi,%%ecx,), %%al \n\t" - "addb %%al, (%%edi,%%ecx,) \n\t" - "incl %%ecx \n\t" - "cmpl _dif, %%ecx \n\t" - "jb sub_lp1 \n\t" - - "sub_go: \n\t" - "movl _FullLength, %%eax \n\t" - "movl %%eax, %%edx \n\t" - "subl %%ecx, %%edx \n\t" // subtract alignment fix - "andl $0x00000007, %%edx \n\t" // calc bytes over mult of 8 - "subl %%edx, %%eax \n\t" // drop over bytes from length - "movl %%eax, _MMXLength \n\t" - - : "=a" (dummy_value_a), // 0 // output regs (dummy) - "=D" (dummy_value_D) // 1 - - : "0" (bpp), // eax // input regs - "1" (row) // edi - - : "%esi", "%ecx", "%edx" // clobber list - -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3" - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - - // now do the math for the rest of the row - switch (bpp) - { - case 3: - { - _ActiveMask.use = 0x0000ffffff000000LL; - _ShiftBpp.use = 24; // == 3 * 8 - _ShiftRem.use = 40; // == 64 - 24 - - __asm__ __volatile__ ( -// preload "movl row, %%edi \n\t" - "movq _ActiveMask, %%mm7 \n\t" // load _ActiveMask for 2nd - // active byte group - "movl %%edi, %%esi \n\t" // lp = row -// preload "movl bpp, %%eax \n\t" - "addl %%eax, %%edi \n\t" // rp = row + bpp - "movq %%mm7, %%mm6 \n\t" - "movl _dif, %%edx \n\t" - "psllq _ShiftBpp, %%mm6 \n\t" // move mask in mm6 to cover - // 3rd active byte group - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%edx,), %%mm1 \n\t" - - "sub_3lp: \n\t" // shift data for adding first - "psrlq _ShiftRem, %%mm1 \n\t" // bpp bytes (no need for mask; - // shift clears inactive bytes) - // add 1st active group - "movq (%%edi,%%edx,), %%mm0 \n\t" - "paddb %%mm1, %%mm0 \n\t" - - // add 2nd active group - "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 - "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly - "pand %%mm7, %%mm1 \n\t" // mask to use 2nd active group - "paddb %%mm1, %%mm0 \n\t" - - // add 3rd active group - "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 - "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly - "pand %%mm6, %%mm1 \n\t" // mask to use 3rd active group - "addl $8, %%edx \n\t" - "paddb %%mm1, %%mm0 \n\t" - - "cmpl _MMXLength, %%edx \n\t" - "movq %%mm0, -8(%%edi,%%edx,) \n\t" // write updated Raws to array - "movq %%mm0, %%mm1 \n\t" // prep 1st add at top of loop - "jb sub_3lp \n\t" - - : "=a" (dummy_value_a), // 0 // output regs (dummy) - "=D" (dummy_value_D) // 1 - - : "0" (bpp), // eax // input regs - "1" (row) // edi - - : "%edx", "%esi" // clobber list -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm6", "%mm7" -#endif - ); - } - break; - - case 1: - { - __asm__ __volatile__ ( - "movl _dif, %%edx \n\t" -// preload "movl row, %%edi \n\t" - "cmpl _FullLength, %%edx \n\t" - "jnb sub_1end \n\t" - "movl %%edi, %%esi \n\t" // lp = row - "xorl %%eax, %%eax \n\t" -// preload "movl bpp, %%eax \n\t" - "addl %%eax, %%edi \n\t" // rp = row + bpp - - "sub_1lp: \n\t" - "movb (%%esi,%%edx,), %%al \n\t" - "addb %%al, (%%edi,%%edx,) \n\t" - "incl %%edx \n\t" - "cmpl _FullLength, %%edx \n\t" - "jb sub_1lp \n\t" - - "sub_1end: \n\t" - - : "=a" (dummy_value_a), // 0 // output regs (dummy) - "=D" (dummy_value_D) // 1 - - : "0" (bpp), // eax // input regs - "1" (row) // edi - - : "%edx", "%esi" // clobber list - ); - } - return; - - case 6: - case 4: - //case 7: // GRR BOGUS - //case 5: // GRR BOGUS - { - _ShiftBpp.use = bpp << 3; - _ShiftRem.use = 64 - _ShiftBpp.use; - - __asm__ __volatile__ ( -// preload "movl row, %%edi \n\t" - "movl _dif, %%edx \n\t" - "movl %%edi, %%esi \n\t" // lp = row -// preload "movl bpp, %%eax \n\t" - "addl %%eax, %%edi \n\t" // rp = row + bpp - - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%edx,), %%mm1 \n\t" - - "sub_4lp: \n\t" // shift data for adding first - "psrlq _ShiftRem, %%mm1 \n\t" // bpp bytes (no need for mask; - // shift clears inactive bytes) - "movq (%%edi,%%edx,), %%mm0 \n\t" - "paddb %%mm1, %%mm0 \n\t" - - // add 2nd active group - "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 - "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly - "addl $8, %%edx \n\t" - "paddb %%mm1, %%mm0 \n\t" - - "cmpl _MMXLength, %%edx \n\t" - "movq %%mm0, -8(%%edi,%%edx,) \n\t" - "movq %%mm0, %%mm1 \n\t" // prep 1st add at top of loop - "jb sub_4lp \n\t" - - : "=a" (dummy_value_a), // 0 // output regs (dummy) - "=D" (dummy_value_D) // 1 - - : "0" (bpp), // eax // input regs - "1" (row) // edi - - : "%edx", "%esi" // clobber list -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1" -#endif - ); - } - break; - - case 2: - { - _ActiveMask.use = 0x00000000ffff0000LL; - _ShiftBpp.use = 16; // == 2 * 8 - _ShiftRem.use = 48; // == 64 - 16 - - __asm__ __volatile__ ( - "movq _ActiveMask, %%mm7 \n\t" // load _ActiveMask for 2nd - // active byte group - "movl _dif, %%edx \n\t" - "movq %%mm7, %%mm6 \n\t" -// preload "movl row, %%edi \n\t" - "psllq _ShiftBpp, %%mm6 \n\t" // move mask in mm6 to cover - // 3rd active byte group - "movl %%edi, %%esi \n\t" // lp = row - "movq %%mm6, %%mm5 \n\t" -// preload "movl bpp, %%eax \n\t" - "addl %%eax, %%edi \n\t" // rp = row + bpp - "psllq _ShiftBpp, %%mm5 \n\t" // move mask in mm5 to cover - // 4th active byte group - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%edx,), %%mm1 \n\t" - - "sub_2lp: \n\t" // shift data for adding first - "psrlq _ShiftRem, %%mm1 \n\t" // bpp bytes (no need for mask; - // shift clears inactive bytes) - // add 1st active group - "movq (%%edi,%%edx,), %%mm0 \n\t" - "paddb %%mm1, %%mm0 \n\t" - - // add 2nd active group - "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 - "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly - "pand %%mm7, %%mm1 \n\t" // mask to use 2nd active group - "paddb %%mm1, %%mm0 \n\t" - - // add 3rd active group - "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 - "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly - "pand %%mm6, %%mm1 \n\t" // mask to use 3rd active group - "paddb %%mm1, %%mm0 \n\t" - - // add 4th active group - "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 - "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly - "pand %%mm5, %%mm1 \n\t" // mask to use 4th active group - "addl $8, %%edx \n\t" - "paddb %%mm1, %%mm0 \n\t" - "cmpl _MMXLength, %%edx \n\t" - "movq %%mm0, -8(%%edi,%%edx,) \n\t" // write updated Raws to array - "movq %%mm0, %%mm1 \n\t" // prep 1st add at top of loop - "jb sub_2lp \n\t" - - : "=a" (dummy_value_a), // 0 // output regs (dummy) - "=D" (dummy_value_D) // 1 - - : "0" (bpp), // eax // input regs - "1" (row) // edi - - : "%edx", "%esi" // clobber list -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm5", "%mm6", "%mm7" -#endif - ); - } - break; - - case 8: - { - __asm__ __volatile__ ( -// preload "movl row, %%edi \n\t" - "movl _dif, %%edx \n\t" - "movl %%edi, %%esi \n\t" // lp = row -// preload "movl bpp, %%eax \n\t" - "addl %%eax, %%edi \n\t" // rp = row + bpp - "movl _MMXLength, %%ecx \n\t" - - // prime the pump: load the first Raw(x-bpp) data set - "movq -8(%%edi,%%edx,), %%mm7 \n\t" - "andl $0x0000003f, %%ecx \n\t" // calc bytes over mult of 64 - - "sub_8lp: \n\t" - "movq (%%edi,%%edx,), %%mm0 \n\t" // load Sub(x) for 1st 8 bytes - "paddb %%mm7, %%mm0 \n\t" - "movq 8(%%edi,%%edx,), %%mm1 \n\t" // load Sub(x) for 2nd 8 bytes - "movq %%mm0, (%%edi,%%edx,) \n\t" // write Raw(x) for 1st 8 bytes - - // Now mm0 will be used as Raw(x-bpp) for the 2nd group of 8 bytes. - // This will be repeated for each group of 8 bytes with the 8th - // group being used as the Raw(x-bpp) for the 1st group of the - // next loop. - - "paddb %%mm0, %%mm1 \n\t" - "movq 16(%%edi,%%edx,), %%mm2 \n\t" // load Sub(x) for 3rd 8 bytes - "movq %%mm1, 8(%%edi,%%edx,) \n\t" // write Raw(x) for 2nd 8 bytes - "paddb %%mm1, %%mm2 \n\t" - "movq 24(%%edi,%%edx,), %%mm3 \n\t" // load Sub(x) for 4th 8 bytes - "movq %%mm2, 16(%%edi,%%edx,) \n\t" // write Raw(x) for 3rd 8 bytes - "paddb %%mm2, %%mm3 \n\t" - "movq 32(%%edi,%%edx,), %%mm4 \n\t" // load Sub(x) for 5th 8 bytes - "movq %%mm3, 24(%%edi,%%edx,) \n\t" // write Raw(x) for 4th 8 bytes - "paddb %%mm3, %%mm4 \n\t" - "movq 40(%%edi,%%edx,), %%mm5 \n\t" // load Sub(x) for 6th 8 bytes - "movq %%mm4, 32(%%edi,%%edx,) \n\t" // write Raw(x) for 5th 8 bytes - "paddb %%mm4, %%mm5 \n\t" - "movq 48(%%edi,%%edx,), %%mm6 \n\t" // load Sub(x) for 7th 8 bytes - "movq %%mm5, 40(%%edi,%%edx,) \n\t" // write Raw(x) for 6th 8 bytes - "paddb %%mm5, %%mm6 \n\t" - "movq 56(%%edi,%%edx,), %%mm7 \n\t" // load Sub(x) for 8th 8 bytes - "movq %%mm6, 48(%%edi,%%edx,) \n\t" // write Raw(x) for 7th 8 bytes - "addl $64, %%edx \n\t" - "paddb %%mm6, %%mm7 \n\t" - "cmpl %%ecx, %%edx \n\t" - "movq %%mm7, -8(%%edi,%%edx,) \n\t" // write Raw(x) for 8th 8 bytes - "jb sub_8lp \n\t" - - "cmpl _MMXLength, %%edx \n\t" - "jnb sub_8lt8 \n\t" - - "sub_8lpA: \n\t" - "movq (%%edi,%%edx,), %%mm0 \n\t" - "addl $8, %%edx \n\t" - "paddb %%mm7, %%mm0 \n\t" - "cmpl _MMXLength, %%edx \n\t" - "movq %%mm0, -8(%%edi,%%edx,) \n\t" // -8 to offset early addl edx - "movq %%mm0, %%mm7 \n\t" // move calculated Raw(x) data - // to mm1 to be new Raw(x-bpp) - // for next loop - "jb sub_8lpA \n\t" - - "sub_8lt8: \n\t" - - : "=a" (dummy_value_a), // 0 // output regs (dummy) - "=D" (dummy_value_D) // 1 - - : "0" (bpp), // eax // input regs - "1" (row) // edi - - : "%ecx", "%edx", "%esi" // clobber list -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - } - break; - - default: // bpp greater than 8 bytes GRR BOGUS - { - __asm__ __volatile__ ( - "movl _dif, %%edx \n\t" -// preload "movl row, %%edi \n\t" - "movl %%edi, %%esi \n\t" // lp = row -// preload "movl bpp, %%eax \n\t" - "addl %%eax, %%edi \n\t" // rp = row + bpp - - "sub_Alp: \n\t" - "movq (%%edi,%%edx,), %%mm0 \n\t" - "movq (%%esi,%%edx,), %%mm1 \n\t" - "addl $8, %%edx \n\t" - "paddb %%mm1, %%mm0 \n\t" - "cmpl _MMXLength, %%edx \n\t" - "movq %%mm0, -8(%%edi,%%edx,) \n\t" // mov does not affect flags; - // -8 to offset addl edx - "jb sub_Alp \n\t" - - : "=a" (dummy_value_a), // 0 // output regs (dummy) - "=D" (dummy_value_D) // 1 - - : "0" (bpp), // eax // input regs - "1" (row) // edi - - : "%edx", "%esi" // clobber list -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1" -#endif - ); - } - break; - - } // end switch (bpp) - - __asm__ __volatile__ ( - "movl _MMXLength, %%edx \n\t" -//pre "movl row, %%edi \n\t" - "cmpl _FullLength, %%edx \n\t" - "jnb sub_end \n\t" - - "movl %%edi, %%esi \n\t" // lp = row -//pre "movl bpp, %%eax \n\t" - "addl %%eax, %%edi \n\t" // rp = row + bpp - "xorl %%eax, %%eax \n\t" - - "sub_lp2: \n\t" - "movb (%%esi,%%edx,), %%al \n\t" - "addb %%al, (%%edi,%%edx,) \n\t" - "incl %%edx \n\t" - "cmpl _FullLength, %%edx \n\t" - "jb sub_lp2 \n\t" - - "sub_end: \n\t" - "EMMS \n\t" // end MMX instructions - - : "=a" (dummy_value_a), // 0 // output regs (dummy) - "=D" (dummy_value_D) // 1 - - : "0" (bpp), // eax // input regs - "1" (row) // edi - - : "%edx", "%esi" // clobber list - ); - -} // end of png_read_filter_row_mmx_sub() -#endif - - - - -//===========================================================================// -// // -// P N G _ R E A D _ F I L T E R _ R O W _ M M X _ U P // -// // -//===========================================================================// - -// Optimized code for PNG Up filter decoder - -static void /* PRIVATE */ -png_read_filter_row_mmx_up(png_row_infop row_info, png_bytep row, - png_bytep prev_row) -{ - png_uint_32 len; - int dummy_value_d; // fix 'forbidden register 3 (dx) was spilled' error - int dummy_value_S; - int dummy_value_D; - - len = row_info->rowbytes; // number of bytes to filter - - __asm__ __volatile__ ( -//pre "movl row, %%edi \n\t" - // get # of bytes to alignment -#ifdef __PIC__ - "pushl %%ebx \n\t" -#endif - "movl %%edi, %%ecx \n\t" - "xorl %%ebx, %%ebx \n\t" - "addl $0x7, %%ecx \n\t" - "xorl %%eax, %%eax \n\t" - "andl $0xfffffff8, %%ecx \n\t" -//pre "movl prev_row, %%esi \n\t" - "subl %%edi, %%ecx \n\t" - "jz up_go \n\t" - - "up_lp1: \n\t" // fix alignment - "movb (%%edi,%%ebx,), %%al \n\t" - "addb (%%esi,%%ebx,), %%al \n\t" - "incl %%ebx \n\t" - "cmpl %%ecx, %%ebx \n\t" - "movb %%al, -1(%%edi,%%ebx,) \n\t" // mov does not affect flags; -1 to - "jb up_lp1 \n\t" // offset incl ebx - - "up_go: \n\t" -//pre "movl len, %%edx \n\t" - "movl %%edx, %%ecx \n\t" - "subl %%ebx, %%edx \n\t" // subtract alignment fix - "andl $0x0000003f, %%edx \n\t" // calc bytes over mult of 64 - "subl %%edx, %%ecx \n\t" // drop over bytes from length - - // unrolled loop - use all MMX registers and interleave to reduce - // number of branch instructions (loops) and reduce partial stalls - "up_loop: \n\t" - "movq (%%esi,%%ebx,), %%mm1 \n\t" - "movq (%%edi,%%ebx,), %%mm0 \n\t" - "movq 8(%%esi,%%ebx,), %%mm3 \n\t" - "paddb %%mm1, %%mm0 \n\t" - "movq 8(%%edi,%%ebx,), %%mm2 \n\t" - "movq %%mm0, (%%edi,%%ebx,) \n\t" - "paddb %%mm3, %%mm2 \n\t" - "movq 16(%%esi,%%ebx,), %%mm5 \n\t" - "movq %%mm2, 8(%%edi,%%ebx,) \n\t" - "movq 16(%%edi,%%ebx,), %%mm4 \n\t" - "movq 24(%%esi,%%ebx,), %%mm7 \n\t" - "paddb %%mm5, %%mm4 \n\t" - "movq 24(%%edi,%%ebx,), %%mm6 \n\t" - "movq %%mm4, 16(%%edi,%%ebx,) \n\t" - "paddb %%mm7, %%mm6 \n\t" - "movq 32(%%esi,%%ebx,), %%mm1 \n\t" - "movq %%mm6, 24(%%edi,%%ebx,) \n\t" - "movq 32(%%edi,%%ebx,), %%mm0 \n\t" - "movq 40(%%esi,%%ebx,), %%mm3 \n\t" - "paddb %%mm1, %%mm0 \n\t" - "movq 40(%%edi,%%ebx,), %%mm2 \n\t" - "movq %%mm0, 32(%%edi,%%ebx,) \n\t" - "paddb %%mm3, %%mm2 \n\t" - "movq 48(%%esi,%%ebx,), %%mm5 \n\t" - "movq %%mm2, 40(%%edi,%%ebx,) \n\t" - "movq 48(%%edi,%%ebx,), %%mm4 \n\t" - "movq 56(%%esi,%%ebx,), %%mm7 \n\t" - "paddb %%mm5, %%mm4 \n\t" - "movq 56(%%edi,%%ebx,), %%mm6 \n\t" - "movq %%mm4, 48(%%edi,%%ebx,) \n\t" - "addl $64, %%ebx \n\t" - "paddb %%mm7, %%mm6 \n\t" - "cmpl %%ecx, %%ebx \n\t" - "movq %%mm6, -8(%%edi,%%ebx,) \n\t" // (+56)movq does not affect flags; - "jb up_loop \n\t" // -8 to offset addl ebx - - "cmpl $0, %%edx \n\t" // test for bytes over mult of 64 - "jz up_end \n\t" - - "cmpl $8, %%edx \n\t" // test for less than 8 bytes - "jb up_lt8 \n\t" // [added by lcreeve at netins.net] - - "addl %%edx, %%ecx \n\t" - "andl $0x00000007, %%edx \n\t" // calc bytes over mult of 8 - "subl %%edx, %%ecx \n\t" // drop over bytes from length - "jz up_lt8 \n\t" - - "up_lpA: \n\t" // use MMX regs to update 8 bytes sim. - "movq (%%esi,%%ebx,), %%mm1 \n\t" - "movq (%%edi,%%ebx,), %%mm0 \n\t" - "addl $8, %%ebx \n\t" - "paddb %%mm1, %%mm0 \n\t" - "cmpl %%ecx, %%ebx \n\t" - "movq %%mm0, -8(%%edi,%%ebx,) \n\t" // movq does not affect flags; -8 to - "jb up_lpA \n\t" // offset add ebx - "cmpl $0, %%edx \n\t" // test for bytes over mult of 8 - "jz up_end \n\t" - - "up_lt8: \n\t" - "xorl %%eax, %%eax \n\t" - "addl %%edx, %%ecx \n\t" // move over byte count into counter - - "up_lp2: \n\t" // use x86 regs for remaining bytes - "movb (%%edi,%%ebx,), %%al \n\t" - "addb (%%esi,%%ebx,), %%al \n\t" - "incl %%ebx \n\t" - "cmpl %%ecx, %%ebx \n\t" - "movb %%al, -1(%%edi,%%ebx,) \n\t" // mov does not affect flags; -1 to - "jb up_lp2 \n\t" // offset inc ebx - - "up_end: \n\t" - "EMMS \n\t" // conversion of filtered row complete -#ifdef __PIC__ - "popl %%ebx \n\t" -#endif - - : "=d" (dummy_value_d), // 0 // output regs (dummy) - "=S" (dummy_value_S), // 1 - "=D" (dummy_value_D) // 2 - - : "0" (len), // edx // input regs - "1" (prev_row), // esi - "2" (row) // edi - - : "%eax", "%ecx" // clobber list (no input regs!) -#ifndef __PIC__ - , "%ebx" -#endif - -#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ - , "%mm0", "%mm1", "%mm2", "%mm3" - , "%mm4", "%mm5", "%mm6", "%mm7" -#endif - ); - -} // end of png_read_filter_row_mmx_up() - -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - - - - -/*===========================================================================*/ -/* */ -/* P N G _ R E A D _ F I L T E R _ R O W */ -/* */ -/*===========================================================================*/ - - -/* Optimized png_read_filter_row routines */ - -void /* PRIVATE */ -png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep - row, png_bytep prev_row, int filter) -{ -#ifdef PNG_DEBUG - char filnm[10]; -#endif - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -/* GRR: these are superseded by png_ptr->asm_flags: */ -#define UseMMX_sub 1 // GRR: converted 20000730 -#define UseMMX_up 1 // GRR: converted 20000729 -#define UseMMX_avg 1 // GRR: converted 20000828 (+ 16-bit bugfix 20000916) -#define UseMMX_paeth 1 // GRR: converted 20000828 - - if (_mmx_supported == 2) { - /* this should have happened in png_init_mmx_flags() already */ -#if !defined(PNG_1_0_X) - png_warning(png_ptr, "asm_flags may not have been initialized"); -#endif - png_mmx_support(); - } -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - -#ifdef PNG_DEBUG - png_debug(1, "in png_read_filter_row (pnggccrd.c)\n"); - switch (filter) - { - case 0: sprintf(filnm, "none"); - break; - case 1: sprintf(filnm, "sub-%s", -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB)? "MMX" : -#endif -#endif -"x86"); - break; - case 2: sprintf(filnm, "up-%s", -#ifdef PNG_ASSEMBLER_CODE_SUPPORTED -#if !defined(PNG_1_0_X) - (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP)? "MMX" : -#endif -#endif - "x86"); - break; - case 3: sprintf(filnm, "avg-%s", -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG)? "MMX" : -#endif -#endif - "x86"); - break; - case 4: sprintf(filnm, "Paeth-%s", -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH)? "MMX": -#endif -#endif -"x86"); - break; - default: sprintf(filnm, "unknw"); - break; - } - png_debug2(0, "row_number=%5ld, %5s, ", png_ptr->row_number, filnm); - png_debug1(0, "row=0x%08lx, ", (unsigned long)row); - png_debug2(0, "pixdepth=%2d, bytes=%d, ", (int)row_info->pixel_depth, - (int)((row_info->pixel_depth + 7) >> 3)); - png_debug1(0,"rowbytes=%8ld\n", row_info->rowbytes); -#endif /* PNG_DEBUG */ - - switch (filter) - { - case PNG_FILTER_VALUE_NONE: - break; - - case PNG_FILTER_VALUE_SUB: -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB) && - (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && - (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) -#else - if (_mmx_supported) -#endif - { - png_read_filter_row_mmx_sub(row_info, row); - } - else -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_bytep rp = row + bpp; - png_bytep lp = row; - - for (i = bpp; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); - rp++; - } - } /* end !UseMMX_sub */ - break; - - case PNG_FILTER_VALUE_UP: -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP) && - (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && - (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) -#else - if (_mmx_supported) -#endif - { - png_read_filter_row_mmx_up(row_info, row, prev_row); - } - else -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_bytep rp = row; - png_bytep pp = prev_row; - - for (i = 0; i < istop; ++i) - { - *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); - rp++; - } - } /* end !UseMMX_up */ - break; - - case PNG_FILTER_VALUE_AVG: -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG) && - (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && - (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) -#else - if (_mmx_supported) -#endif - { - png_read_filter_row_mmx_avg(row_info, row, prev_row); - } - else -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - png_uint_32 i; - png_bytep rp = row; - png_bytep pp = prev_row; - png_bytep lp = row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 istop = row_info->rowbytes - bpp; - - for (i = 0; i < bpp; i++) - { - *rp = (png_byte)(((int)(*rp) + - ((int)(*pp++) >> 1)) & 0xff); - rp++; - } - - for (i = 0; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + - ((int)(*pp++ + *lp++) >> 1)) & 0xff); - rp++; - } - } /* end !UseMMX_avg */ - break; - - case PNG_FILTER_VALUE_PAETH: -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH) && - (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && - (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) -#else - if (_mmx_supported) -#endif - { - png_read_filter_row_mmx_paeth(row_info, row, prev_row); - } - else -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - { - png_uint_32 i; - png_bytep rp = row; - png_bytep pp = prev_row; - png_bytep lp = row; - png_bytep cp = prev_row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 istop = row_info->rowbytes - bpp; - - for (i = 0; i < bpp; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); - rp++; - } - - for (i = 0; i < istop; i++) /* use leftover rp,pp */ - { - int a, b, c, pa, pb, pc, p; - - a = *lp++; - b = *pp++; - c = *cp++; - - p = b - c; - pc = a - c; - -#ifdef PNG_USE_ABS - pa = abs(p); - pb = abs(pc); - pc = abs(p + pc); -#else - pa = p < 0 ? -p : p; - pb = pc < 0 ? -pc : pc; - pc = (p + pc) < 0 ? -(p + pc) : p + pc; -#endif - - /* - if (pa <= pb && pa <= pc) - p = a; - else if (pb <= pc) - p = b; - else - p = c; - */ - - p = (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c; - - *rp = (png_byte)(((int)(*rp) + p) & 0xff); - rp++; - } - } /* end !UseMMX_paeth */ - break; - - default: - png_warning(png_ptr, "Ignoring bad row-filter type"); - *row=0; - break; - } -} - -#endif /* PNG_HAVE_ASSEMBLER_READ_FILTER_ROW */ - - -/*===========================================================================*/ -/* */ -/* P N G _ M M X _ S U P P O R T */ -/* */ -/*===========================================================================*/ - -/* GRR NOTES: (1) the following code assumes 386 or better (pushfl/popfl) - * (2) all instructions compile with gcc 2.7.2.3 and later - * (3) the function is moved down here to prevent gcc from - * inlining it in multiple places and then barfing be- - * cause the ".NOT_SUPPORTED" label is multiply defined - * [is there a way to signal that a *single* function should - * not be inlined? is there a way to modify the label for - * each inlined instance, e.g., by appending _1, _2, etc.? - * maybe if don't use leading "." in label name? (nope...sigh)] - */ - -int PNGAPI -png_mmx_support(void) -{ -#if defined(PNG_MMX_CODE_SUPPORTED) - __asm__ __volatile__ ( - "pushl %%ebx \n\t" // ebx gets clobbered by CPUID instruction - "pushl %%ecx \n\t" // so does ecx... - "pushl %%edx \n\t" // ...and edx (but ecx & edx safe on Linux) -// ".byte 0x66 \n\t" // convert 16-bit pushf to 32-bit pushfd -// "pushf \n\t" // 16-bit pushf - "pushfl \n\t" // save Eflag to stack - "popl %%eax \n\t" // get Eflag from stack into eax - "movl %%eax, %%ecx \n\t" // make another copy of Eflag in ecx - "xorl $0x200000, %%eax \n\t" // toggle ID bit in Eflag (i.e., bit 21) - "pushl %%eax \n\t" // save modified Eflag back to stack -// ".byte 0x66 \n\t" // convert 16-bit popf to 32-bit popfd -// "popf \n\t" // 16-bit popf - "popfl \n\t" // restore modified value to Eflag reg - "pushfl \n\t" // save Eflag to stack - "popl %%eax \n\t" // get Eflag from stack - "pushl %%ecx \n\t" // save original Eflag to stack - "popfl \n\t" // restore original Eflag - "xorl %%ecx, %%eax \n\t" // compare new Eflag with original Eflag - "jz 0f \n\t" // if same, CPUID instr. is not supported - - "xorl %%eax, %%eax \n\t" // set eax to zero -// ".byte 0x0f, 0xa2 \n\t" // CPUID instruction (two-byte opcode) - "cpuid \n\t" // get the CPU identification info - "cmpl $1, %%eax \n\t" // make sure eax return non-zero value - "jl 0f \n\t" // if eax is zero, MMX is not supported - - "xorl %%eax, %%eax \n\t" // set eax to zero and... - "incl %%eax \n\t" // ...increment eax to 1. This pair is - // faster than the instruction "mov eax, 1" - "cpuid \n\t" // get the CPU identification info again - "andl $0x800000, %%edx \n\t" // mask out all bits but MMX bit (23) - "cmpl $0, %%edx \n\t" // 0 = MMX not supported - "jz 0f \n\t" // non-zero = yes, MMX IS supported - - "movl $1, %%eax \n\t" // set return value to 1 - "jmp 1f \n\t" // DONE: have MMX support - - "0: \n\t" // .NOT_SUPPORTED: target label for jump instructions - "movl $0, %%eax \n\t" // set return value to 0 - "1: \n\t" // .RETURN: target label for jump instructions - "movl %%eax, _mmx_supported \n\t" // save in global static variable, too - "popl %%edx \n\t" // restore edx - "popl %%ecx \n\t" // restore ecx - "popl %%ebx \n\t" // restore ebx - -// "ret \n\t" // DONE: no MMX support - // (fall through to standard C "ret") - - : // output list (none) - - : // any variables used on input (none) - - : "%eax" // clobber list -// , "%ebx", "%ecx", "%edx" // GRR: we handle these manually -// , "memory" // if write to a variable gcc thought was in a reg -// , "cc" // "condition codes" (flag bits) - ); -#else - _mmx_supported = 0; -#endif /* PNG_MMX_CODE_SUPPORTED */ - - return _mmx_supported; -} - - -#endif /* PNG_USE_PNGGCCRD */ diff --git a/src/SFML/Graphics/libpng/pngget.c b/src/SFML/Graphics/libpng/pngget.c deleted file mode 100644 index b538f749..00000000 --- a/src/SFML/Graphics/libpng/pngget.c +++ /dev/null @@ -1,934 +0,0 @@ - -/* pngget.c - retrieval of values from info struct - * - * libpng 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - */ - -#define PNG_INTERNAL -#include "png.h" - -png_uint_32 PNGAPI -png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->valid & flag); - else - return(0); -} - -png_uint_32 PNGAPI -png_get_rowbytes(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->rowbytes); - else - return(0); -} - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -png_bytepp PNGAPI -png_get_rows(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->row_pointers); - else - return(0); -} -#endif - -#ifdef PNG_EASY_ACCESS_SUPPORTED -/* easy access to info, added in libpng-0.99 */ -png_uint_32 PNGAPI -png_get_image_width(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->width; - } - return (0); -} - -png_uint_32 PNGAPI -png_get_image_height(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->height; - } - return (0); -} - -png_byte PNGAPI -png_get_bit_depth(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->bit_depth; - } - return (0); -} - -png_byte PNGAPI -png_get_color_type(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->color_type; - } - return (0); -} - -png_byte PNGAPI -png_get_filter_type(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->filter_type; - } - return (0); -} - -png_byte PNGAPI -png_get_interlace_type(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->interlace_type; - } - return (0); -} - -png_byte PNGAPI -png_get_compression_type(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->compression_type; - } - return (0); -} - -png_uint_32 PNGAPI -png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_pHYs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pHYs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter"); - if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) - return (0); - else return (info_ptr->x_pixels_per_unit); - } -#else - return (0); -#endif - return (0); -} - -png_uint_32 PNGAPI -png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_pHYs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pHYs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter"); - if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) - return (0); - else return (info_ptr->y_pixels_per_unit); - } -#else - return (0); -#endif - return (0); -} - -png_uint_32 PNGAPI -png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_pHYs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pHYs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter"); - if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER || - info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit) - return (0); - else return (info_ptr->x_pixels_per_unit); - } -#else - return (0); -#endif - return (0); -} - -#ifdef PNG_FLOATING_POINT_SUPPORTED -float PNGAPI -png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr) - { - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_pHYs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pHYs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio"); - if (info_ptr->x_pixels_per_unit == 0) - return ((float)0.0); - else - return ((float)((float)info_ptr->y_pixels_per_unit - /(float)info_ptr->x_pixels_per_unit)); - } -#else - return (0.0); -#endif - return ((float)0.0); -} -#endif - -png_int_32 PNGAPI -png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_oFFs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_oFFs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); - if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) - return (0); - else return (info_ptr->x_offset); - } -#else - return (0); -#endif - return (0); -} - -png_int_32 PNGAPI -png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_oFFs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_oFFs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); - if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) - return (0); - else return (info_ptr->y_offset); - } -#else - return (0); -#endif - return (0); -} - -png_int_32 PNGAPI -png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_oFFs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_oFFs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); - if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) - return (0); - else return (info_ptr->x_offset); - } -#else - return (0); -#endif - return (0); -} - -png_int_32 PNGAPI -png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_oFFs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_oFFs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); - if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) - return (0); - else return (info_ptr->y_offset); - } -#else - return (0); -#endif - return (0); -} - -#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) -png_uint_32 PNGAPI -png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) -{ - return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr) - *.0254 +.5)); -} - -png_uint_32 PNGAPI -png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) -{ - return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr) - *.0254 +.5)); -} - -png_uint_32 PNGAPI -png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) -{ - return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr) - *.0254 +.5)); -} - -float PNGAPI -png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr) -{ - return ((float)png_get_x_offset_microns(png_ptr, info_ptr) - *.00003937); -} - -float PNGAPI -png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr) -{ - return ((float)png_get_y_offset_microns(png_ptr, info_ptr) - *.00003937); -} - -#if defined(PNG_pHYs_SUPPORTED) -png_uint_32 PNGAPI -png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) -{ - png_uint_32 retval = 0; - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) - { - png_debug1(1, "in %s retrieval function\n", "pHYs"); - if (res_x != NULL) - { - *res_x = info_ptr->x_pixels_per_unit; - retval |= PNG_INFO_pHYs; - } - if (res_y != NULL) - { - *res_y = info_ptr->y_pixels_per_unit; - retval |= PNG_INFO_pHYs; - } - if (unit_type != NULL) - { - *unit_type = (int)info_ptr->phys_unit_type; - retval |= PNG_INFO_pHYs; - if(*unit_type == 1) - { - if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50); - if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50); - } - } - } - return (retval); -} -#endif /* PNG_pHYs_SUPPORTED */ -#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ - -/* png_get_channels really belongs in here, too, but it's been around longer */ - -#endif /* PNG_EASY_ACCESS_SUPPORTED */ - -png_byte PNGAPI -png_get_channels(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->channels); - else - return (0); -} - -png_bytep PNGAPI -png_get_signature(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->signature); - else - return (NULL); -} - -#if defined(PNG_bKGD_SUPPORTED) -png_uint_32 PNGAPI -png_get_bKGD(png_structp png_ptr, png_infop info_ptr, - png_color_16p *background) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) - && background != NULL) - { - png_debug1(1, "in %s retrieval function\n", "bKGD"); - *background = &(info_ptr->background); - return (PNG_INFO_bKGD); - } - return (0); -} -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_cHRM(png_structp png_ptr, png_infop info_ptr, - double *white_x, double *white_y, double *red_x, double *red_y, - double *green_x, double *green_y, double *blue_x, double *blue_y) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) - { - png_debug1(1, "in %s retrieval function\n", "cHRM"); - if (white_x != NULL) - *white_x = (double)info_ptr->x_white; - if (white_y != NULL) - *white_y = (double)info_ptr->y_white; - if (red_x != NULL) - *red_x = (double)info_ptr->x_red; - if (red_y != NULL) - *red_y = (double)info_ptr->y_red; - if (green_x != NULL) - *green_x = (double)info_ptr->x_green; - if (green_y != NULL) - *green_y = (double)info_ptr->y_green; - if (blue_x != NULL) - *blue_x = (double)info_ptr->x_blue; - if (blue_y != NULL) - *blue_y = (double)info_ptr->y_blue; - return (PNG_INFO_cHRM); - } - return (0); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, - png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, - png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, - png_fixed_point *blue_x, png_fixed_point *blue_y) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) - { - png_debug1(1, "in %s retrieval function\n", "cHRM"); - if (white_x != NULL) - *white_x = info_ptr->int_x_white; - if (white_y != NULL) - *white_y = info_ptr->int_y_white; - if (red_x != NULL) - *red_x = info_ptr->int_x_red; - if (red_y != NULL) - *red_y = info_ptr->int_y_red; - if (green_x != NULL) - *green_x = info_ptr->int_x_green; - if (green_y != NULL) - *green_y = info_ptr->int_y_green; - if (blue_x != NULL) - *blue_x = info_ptr->int_x_blue; - if (blue_y != NULL) - *blue_y = info_ptr->int_y_blue; - return (PNG_INFO_cHRM); - } - return (0); -} -#endif -#endif - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) - && file_gamma != NULL) - { - png_debug1(1, "in %s retrieval function\n", "gAMA"); - *file_gamma = (double)info_ptr->gamma; - return (PNG_INFO_gAMA); - } - return (0); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, - png_fixed_point *int_file_gamma) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) - && int_file_gamma != NULL) - { - png_debug1(1, "in %s retrieval function\n", "gAMA"); - *int_file_gamma = info_ptr->int_gamma; - return (PNG_INFO_gAMA); - } - return (0); -} -#endif -#endif - -#if defined(PNG_sRGB_SUPPORTED) -png_uint_32 PNGAPI -png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) - && file_srgb_intent != NULL) - { - png_debug1(1, "in %s retrieval function\n", "sRGB"); - *file_srgb_intent = (int)info_ptr->srgb_intent; - return (PNG_INFO_sRGB); - } - return (0); -} -#endif - -#if defined(PNG_iCCP_SUPPORTED) -png_uint_32 PNGAPI -png_get_iCCP(png_structp png_ptr, png_infop info_ptr, - png_charpp name, int *compression_type, - png_charpp profile, png_uint_32 *proflen) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) - && name != NULL && profile != NULL && proflen != NULL) - { - png_debug1(1, "in %s retrieval function\n", "iCCP"); - *name = info_ptr->iccp_name; - *profile = info_ptr->iccp_profile; - /* compression_type is a dummy so the API won't have to change - if we introduce multiple compression types later. */ - *proflen = (int)info_ptr->iccp_proflen; - *compression_type = (int)info_ptr->iccp_compression; - return (PNG_INFO_iCCP); - } - return (0); -} -#endif - -#if defined(PNG_sPLT_SUPPORTED) -png_uint_32 PNGAPI -png_get_sPLT(png_structp png_ptr, png_infop info_ptr, - png_sPLT_tpp spalettes) -{ - if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) - *spalettes = info_ptr->splt_palettes; - return ((png_uint_32)info_ptr->splt_palettes_num); -} -#endif - -#if defined(PNG_hIST_SUPPORTED) -png_uint_32 PNGAPI -png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) - && hist != NULL) - { - png_debug1(1, "in %s retrieval function\n", "hIST"); - *hist = info_ptr->hist; - return (PNG_INFO_hIST); - } - return (0); -} -#endif - -png_uint_32 PNGAPI -png_get_IHDR(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *width, png_uint_32 *height, int *bit_depth, - int *color_type, int *interlace_type, int *compression_type, - int *filter_type) - -{ - if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL && - bit_depth != NULL && color_type != NULL) - { - png_debug1(1, "in %s retrieval function\n", "IHDR"); - *width = info_ptr->width; - *height = info_ptr->height; - *bit_depth = info_ptr->bit_depth; - if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16) - png_error(png_ptr, "Invalid bit depth"); - *color_type = info_ptr->color_type; - if (info_ptr->color_type > 6) - png_error(png_ptr, "Invalid color type"); - if (compression_type != NULL) - *compression_type = info_ptr->compression_type; - if (filter_type != NULL) - *filter_type = info_ptr->filter_type; - if (interlace_type != NULL) - *interlace_type = info_ptr->interlace_type; - - /* check for potential overflow of rowbytes */ - if (*width == 0 || *width > PNG_UINT_31_MAX) - png_error(png_ptr, "Invalid image width"); - if (*height == 0 || *height > PNG_UINT_31_MAX) - png_error(png_ptr, "Invalid image height"); - if (info_ptr->width > (PNG_UINT_32_MAX - >> 3) /* 8-byte RGBA pixels */ - - 64 /* bigrowbuf hack */ - - 1 /* filter byte */ - - 7*8 /* rounding of width to multiple of 8 pixels */ - - 8) /* extra max_pixel_depth pad */ - { - png_warning(png_ptr, - "Width too large for libpng to process image data."); - } - return (1); - } - return (0); -} - -#if defined(PNG_oFFs_SUPPORTED) -png_uint_32 PNGAPI -png_get_oFFs(png_structp png_ptr, png_infop info_ptr, - png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) - && offset_x != NULL && offset_y != NULL && unit_type != NULL) - { - png_debug1(1, "in %s retrieval function\n", "oFFs"); - *offset_x = info_ptr->x_offset; - *offset_y = info_ptr->y_offset; - *unit_type = (int)info_ptr->offset_unit_type; - return (PNG_INFO_oFFs); - } - return (0); -} -#endif - -#if defined(PNG_pCAL_SUPPORTED) -png_uint_32 PNGAPI -png_get_pCAL(png_structp png_ptr, png_infop info_ptr, - png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, - png_charp *units, png_charpp *params) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) - && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && - nparams != NULL && units != NULL && params != NULL) - { - png_debug1(1, "in %s retrieval function\n", "pCAL"); - *purpose = info_ptr->pcal_purpose; - *X0 = info_ptr->pcal_X0; - *X1 = info_ptr->pcal_X1; - *type = (int)info_ptr->pcal_type; - *nparams = (int)info_ptr->pcal_nparams; - *units = info_ptr->pcal_units; - *params = info_ptr->pcal_params; - return (PNG_INFO_pCAL); - } - return (0); -} -#endif - -#if defined(PNG_sCAL_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_sCAL(png_structp png_ptr, png_infop info_ptr, - int *unit, double *width, double *height) -{ - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) - { - *unit = info_ptr->scal_unit; - *width = info_ptr->scal_pixel_width; - *height = info_ptr->scal_pixel_height; - return (PNG_INFO_sCAL); - } - return(0); -} -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr, - int *unit, png_charpp width, png_charpp height) -{ - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) - { - *unit = info_ptr->scal_unit; - *width = info_ptr->scal_s_width; - *height = info_ptr->scal_s_height; - return (PNG_INFO_sCAL); - } - return(0); -} -#endif -#endif -#endif - -#if defined(PNG_pHYs_SUPPORTED) -png_uint_32 PNGAPI -png_get_pHYs(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) -{ - png_uint_32 retval = 0; - - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_pHYs)) - { - png_debug1(1, "in %s retrieval function\n", "pHYs"); - if (res_x != NULL) - { - *res_x = info_ptr->x_pixels_per_unit; - retval |= PNG_INFO_pHYs; - } - if (res_y != NULL) - { - *res_y = info_ptr->y_pixels_per_unit; - retval |= PNG_INFO_pHYs; - } - if (unit_type != NULL) - { - *unit_type = (int)info_ptr->phys_unit_type; - retval |= PNG_INFO_pHYs; - } - } - return (retval); -} -#endif - -png_uint_32 PNGAPI -png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette, - int *num_palette) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) - && palette != NULL) - { - png_debug1(1, "in %s retrieval function\n", "PLTE"); - *palette = info_ptr->palette; - *num_palette = info_ptr->num_palette; - png_debug1(3, "num_palette = %d\n", *num_palette); - return (PNG_INFO_PLTE); - } - return (0); -} - -#if defined(PNG_sBIT_SUPPORTED) -png_uint_32 PNGAPI -png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) - && sig_bit != NULL) - { - png_debug1(1, "in %s retrieval function\n", "sBIT"); - *sig_bit = &(info_ptr->sig_bit); - return (PNG_INFO_sBIT); - } - return (0); -} -#endif - -#if defined(PNG_TEXT_SUPPORTED) -png_uint_32 PNGAPI -png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, - int *num_text) -{ - if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0) - { - png_debug1(1, "in %s retrieval function\n", - (png_ptr->chunk_name[0] == '\0' ? "text" - : (png_const_charp)png_ptr->chunk_name)); - if (text_ptr != NULL) - *text_ptr = info_ptr->text; - if (num_text != NULL) - *num_text = info_ptr->num_text; - return ((png_uint_32)info_ptr->num_text); - } - if (num_text != NULL) - *num_text = 0; - return(0); -} -#endif - -#if defined(PNG_tIME_SUPPORTED) -png_uint_32 PNGAPI -png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) - && mod_time != NULL) - { - png_debug1(1, "in %s retrieval function\n", "tIME"); - *mod_time = &(info_ptr->mod_time); - return (PNG_INFO_tIME); - } - return (0); -} -#endif - -#if defined(PNG_tRNS_SUPPORTED) -png_uint_32 PNGAPI -png_get_tRNS(png_structp png_ptr, png_infop info_ptr, - png_bytep *trans, int *num_trans, png_color_16p *trans_values) -{ - png_uint_32 retval = 0; - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) - { - png_debug1(1, "in %s retrieval function\n", "tRNS"); - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (trans != NULL) - { - *trans = info_ptr->trans; - retval |= PNG_INFO_tRNS; - } - if (trans_values != NULL) - *trans_values = &(info_ptr->trans_values); - } - else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ - { - if (trans_values != NULL) - { - *trans_values = &(info_ptr->trans_values); - retval |= PNG_INFO_tRNS; - } - if(trans != NULL) - *trans = NULL; - } - if(num_trans != NULL) - { - *num_trans = info_ptr->num_trans; - retval |= PNG_INFO_tRNS; - } - } - return (retval); -} -#endif - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -png_uint_32 PNGAPI -png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr, - png_unknown_chunkpp unknowns) -{ - if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) - *unknowns = info_ptr->unknown_chunks; - return ((png_uint_32)info_ptr->unknown_chunks_num); -} -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -png_byte PNGAPI -png_get_rgb_to_gray_status (png_structp png_ptr) -{ - return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0); -} -#endif - -#if defined(PNG_USER_CHUNKS_SUPPORTED) -png_voidp PNGAPI -png_get_user_chunk_ptr(png_structp png_ptr) -{ - return (png_ptr? png_ptr->user_chunk_ptr : NULL); -} -#endif - -#ifdef PNG_WRITE_SUPPORTED -png_uint_32 PNGAPI -png_get_compression_buffer_size(png_structp png_ptr) -{ - return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L); -} -#endif - -#ifndef PNG_1_0_X -#ifdef PNG_ASSEMBLER_CODE_SUPPORTED -/* this function was added to libpng 1.2.0 and should exist by default */ -png_uint_32 PNGAPI -png_get_asm_flags (png_structp png_ptr) -{ - return (png_uint_32)(png_ptr? png_ptr->asm_flags : 0L); -} - -/* this function was added to libpng 1.2.0 and should exist by default */ -png_uint_32 PNGAPI -png_get_asm_flagmask (int flag_select) -{ - png_uint_32 settable_asm_flags = 0; - - if (flag_select & PNG_SELECT_READ) - settable_asm_flags |= - PNG_ASM_FLAG_MMX_READ_COMBINE_ROW | - PNG_ASM_FLAG_MMX_READ_INTERLACE | - PNG_ASM_FLAG_MMX_READ_FILTER_SUB | - PNG_ASM_FLAG_MMX_READ_FILTER_UP | - PNG_ASM_FLAG_MMX_READ_FILTER_AVG | - PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; - /* no non-MMX flags yet */ - -#if 0 - /* GRR: no write-flags yet, either, but someday... */ - if (flag_select & PNG_SELECT_WRITE) - settable_asm_flags |= - PNG_ASM_FLAG_MMX_WRITE_ [whatever] ; -#endif /* 0 */ - - return settable_asm_flags; /* _theoretically_ settable capabilities only */ -} -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) - /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */ -/* this function was added to libpng 1.2.0 */ -png_uint_32 PNGAPI -png_get_mmx_flagmask (int flag_select, int *compilerID) -{ - png_uint_32 settable_mmx_flags = 0; - - if (flag_select & PNG_SELECT_READ) - settable_mmx_flags |= - PNG_ASM_FLAG_MMX_READ_COMBINE_ROW | - PNG_ASM_FLAG_MMX_READ_INTERLACE | - PNG_ASM_FLAG_MMX_READ_FILTER_SUB | - PNG_ASM_FLAG_MMX_READ_FILTER_UP | - PNG_ASM_FLAG_MMX_READ_FILTER_AVG | - PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; -#if 0 - /* GRR: no MMX write support yet, but someday... */ - if (flag_select & PNG_SELECT_WRITE) - settable_mmx_flags |= - PNG_ASM_FLAG_MMX_WRITE_ [whatever] ; -#endif /* 0 */ - - if (compilerID != NULL) { -#ifdef PNG_USE_PNGVCRD - *compilerID = 1; /* MSVC */ -#else -#ifdef PNG_USE_PNGGCCRD - *compilerID = 2; /* gcc/gas */ -#else - *compilerID = -1; /* unknown (i.e., no asm/MMX code compiled) */ -#endif -#endif - } - - return settable_mmx_flags; /* _theoretically_ settable capabilities only */ -} - -/* this function was added to libpng 1.2.0 */ -png_byte PNGAPI -png_get_mmx_bitdepth_threshold (png_structp png_ptr) -{ - return (png_byte)(png_ptr? png_ptr->mmx_bitdepth_threshold : 0); -} - -/* this function was added to libpng 1.2.0 */ -png_uint_32 PNGAPI -png_get_mmx_rowbytes_threshold (png_structp png_ptr) -{ - return (png_uint_32)(png_ptr? png_ptr->mmx_rowbytes_threshold : 0L); -} -#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ - -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -/* these functions were added to libpng 1.2.6 */ -png_uint_32 PNGAPI -png_get_user_width_max (png_structp png_ptr) -{ - return (png_ptr? png_ptr->user_width_max : 0); -} -png_uint_32 PNGAPI -png_get_user_height_max (png_structp png_ptr) -{ - return (png_ptr? png_ptr->user_height_max : 0); -} -#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ - -#endif /* ?PNG_1_0_X */ diff --git a/src/SFML/Graphics/libpng/pngmem.c b/src/SFML/Graphics/libpng/pngmem.c deleted file mode 100644 index 2f022789..00000000 --- a/src/SFML/Graphics/libpng/pngmem.c +++ /dev/null @@ -1,595 +0,0 @@ - -/* pngmem.c - stub functions for memory allocation - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This file provides a location for all memory allocation. Users who - * need special memory handling are expected to supply replacement - * functions for png_malloc() and png_free(), and to use - * png_create_read_struct_2() and png_create_write_struct_2() to - * identify the replacement functions. - */ - -#define PNG_INTERNAL -#include "png.h" - -/* Borland DOS special memory handler */ -#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) -/* if you change this, be sure to change the one in png.h also */ - -/* Allocate memory for a png_struct. The malloc and memset can be replaced - by a single call to calloc() if this is thought to improve performance. */ -png_voidp /* PRIVATE */ -png_create_struct(int type) -{ -#ifdef PNG_USER_MEM_SUPPORTED - return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); -} - -/* Alternate version of png_create_struct, for use with user-defined malloc. */ -png_voidp /* PRIVATE */ -png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - png_size_t size; - png_voidp struct_ptr; - - if (type == PNG_STRUCT_INFO) - size = png_sizeof(png_info); - else if (type == PNG_STRUCT_PNG) - size = png_sizeof(png_struct); - else - return (png_get_copyright(NULL)); - -#ifdef PNG_USER_MEM_SUPPORTED - if(malloc_fn != NULL) - { - png_struct dummy_struct; - png_structp png_ptr = &dummy_struct; - png_ptr->mem_ptr=mem_ptr; - struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); - } - else -#endif /* PNG_USER_MEM_SUPPORTED */ - struct_ptr = (png_voidp)farmalloc(size); - if (struct_ptr != NULL) - png_memset(struct_ptr, 0, size); - return (struct_ptr); -} - -/* Free memory allocated by a png_create_struct() call */ -void /* PRIVATE */ -png_destroy_struct(png_voidp struct_ptr) -{ -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); -} - -/* Free memory allocated by a png_create_struct() call */ -void /* PRIVATE */ -png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, - png_voidp mem_ptr) -{ -#endif - if (struct_ptr != NULL) - { -#ifdef PNG_USER_MEM_SUPPORTED - if(free_fn != NULL) - { - png_struct dummy_struct; - png_structp png_ptr = &dummy_struct; - png_ptr->mem_ptr=mem_ptr; - (*(free_fn))(png_ptr, struct_ptr); - return; - } -#endif /* PNG_USER_MEM_SUPPORTED */ - farfree (struct_ptr); - } -} - -/* Allocate memory. For reasonable files, size should never exceed - * 64K. However, zlib may allocate more then 64K if you don't tell - * it not to. See zconf.h and png.h for more information. zlib does - * need to allocate exactly 64K, so whatever you call here must - * have the ability to do that. - * - * Borland seems to have a problem in DOS mode for exactly 64K. - * It gives you a segment with an offset of 8 (perhaps to store its - * memory stuff). zlib doesn't like this at all, so we have to - * detect and deal with it. This code should not be needed in - * Windows or OS/2 modes, and only in 16 bit mode. This code has - * been updated by Alexander Lehmann for version 0.89 to waste less - * memory. - * - * Note that we can't use png_size_t for the "size" declaration, - * since on some systems a png_size_t is a 16-bit quantity, and as a - * result, we would be truncating potentially larger memory requests - * (which should cause a fatal error) and introducing major problems. - */ - -png_voidp PNGAPI -png_malloc(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ret; - - if (png_ptr == NULL || size == 0) - return (NULL); - -#ifdef PNG_USER_MEM_SUPPORTED - if(png_ptr->malloc_fn != NULL) - ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); - else - ret = (png_malloc_default(png_ptr, size)); - if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of memory!"); - return (ret); -} - -png_voidp PNGAPI -png_malloc_default(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ret; -#endif /* PNG_USER_MEM_SUPPORTED */ - -#ifdef PNG_MAX_MALLOC_64K - if (size > (png_uint_32)65536L) - { - png_warning(png_ptr, "Cannot Allocate > 64K"); - ret = NULL; - } - else -#endif - - if (size != (size_t)size) - ret = NULL; - else if (size == (png_uint_32)65536L) - { - if (png_ptr->offset_table == NULL) - { - /* try to see if we need to do any of this fancy stuff */ - ret = farmalloc(size); - if (ret == NULL || ((png_size_t)ret & 0xffff)) - { - int num_blocks; - png_uint_32 total_size; - png_bytep table; - int i; - png_byte huge * hptr; - - if (ret != NULL) - { - farfree(ret); - ret = NULL; - } - - if(png_ptr->zlib_window_bits > 14) - num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); - else - num_blocks = 1; - if (png_ptr->zlib_mem_level >= 7) - num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); - else - num_blocks++; - - total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; - - table = farmalloc(total_size); - - if (table == NULL) - { -#ifndef PNG_USER_MEM_SUPPORTED - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */ - else - png_warning(png_ptr, "Out Of Memory."); -#endif - return (NULL); - } - - if ((png_size_t)table & 0xfff0) - { -#ifndef PNG_USER_MEM_SUPPORTED - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, - "Farmalloc didn't return normalized pointer"); - else - png_warning(png_ptr, - "Farmalloc didn't return normalized pointer"); -#endif - return (NULL); - } - - png_ptr->offset_table = table; - png_ptr->offset_table_ptr = farmalloc(num_blocks * - png_sizeof (png_bytep)); - - if (png_ptr->offset_table_ptr == NULL) - { -#ifndef PNG_USER_MEM_SUPPORTED - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out Of memory."); /* Note "O" and "M" */ - else - png_warning(png_ptr, "Out Of memory."); -#endif - return (NULL); - } - - hptr = (png_byte huge *)table; - if ((png_size_t)hptr & 0xf) - { - hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); - hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ - } - for (i = 0; i < num_blocks; i++) - { - png_ptr->offset_table_ptr[i] = (png_bytep)hptr; - hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ - } - - png_ptr->offset_table_number = num_blocks; - png_ptr->offset_table_count = 0; - png_ptr->offset_table_count_free = 0; - } - } - - if (png_ptr->offset_table_count >= png_ptr->offset_table_number) - { -#ifndef PNG_USER_MEM_SUPPORTED - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ - else - png_warning(png_ptr, "Out of Memory."); -#endif - return (NULL); - } - - ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; - } - else - ret = farmalloc(size); - -#ifndef PNG_USER_MEM_SUPPORTED - if (ret == NULL) - { - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ - else - png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ - } -#endif - - return (ret); -} - -/* free a pointer allocated by png_malloc(). In the default - configuration, png_ptr is not used, but is passed in case it - is needed. If ptr is NULL, return without taking any action. */ -void PNGAPI -png_free(png_structp png_ptr, png_voidp ptr) -{ - if (png_ptr == NULL || ptr == NULL) - return; - -#ifdef PNG_USER_MEM_SUPPORTED - if (png_ptr->free_fn != NULL) - { - (*(png_ptr->free_fn))(png_ptr, ptr); - return; - } - else png_free_default(png_ptr, ptr); -} - -void PNGAPI -png_free_default(png_structp png_ptr, png_voidp ptr) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - - if (png_ptr->offset_table != NULL) - { - int i; - - for (i = 0; i < png_ptr->offset_table_count; i++) - { - if (ptr == png_ptr->offset_table_ptr[i]) - { - ptr = NULL; - png_ptr->offset_table_count_free++; - break; - } - } - if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) - { - farfree(png_ptr->offset_table); - farfree(png_ptr->offset_table_ptr); - png_ptr->offset_table = NULL; - png_ptr->offset_table_ptr = NULL; - } - } - - if (ptr != NULL) - { - farfree(ptr); - } -} - -#else /* Not the Borland DOS special memory handler */ - -/* Allocate memory for a png_struct or a png_info. The malloc and - memset can be replaced by a single call to calloc() if this is thought - to improve performance noticably. */ -png_voidp /* PRIVATE */ -png_create_struct(int type) -{ -#ifdef PNG_USER_MEM_SUPPORTED - return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); -} - -/* Allocate memory for a png_struct or a png_info. The malloc and - memset can be replaced by a single call to calloc() if this is thought - to improve performance noticably. */ -png_voidp /* PRIVATE */ -png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - png_size_t size; - png_voidp struct_ptr; - - if (type == PNG_STRUCT_INFO) - size = png_sizeof(png_info); - else if (type == PNG_STRUCT_PNG) - size = png_sizeof(png_struct); - else - return (NULL); - -#ifdef PNG_USER_MEM_SUPPORTED - if(malloc_fn != NULL) - { - png_struct dummy_struct; - png_structp png_ptr = &dummy_struct; - png_ptr->mem_ptr=mem_ptr; - struct_ptr = (*(malloc_fn))(png_ptr, size); - if (struct_ptr != NULL) - png_memset(struct_ptr, 0, size); - return (struct_ptr); - } -#endif /* PNG_USER_MEM_SUPPORTED */ - -#if defined(__TURBOC__) && !defined(__FLAT__) - struct_ptr = (png_voidp)farmalloc(size); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) - struct_ptr = (png_voidp)halloc(size,1); -# else - struct_ptr = (png_voidp)malloc(size); -# endif -#endif - if (struct_ptr != NULL) - png_memset(struct_ptr, 0, size); - - return (struct_ptr); -} - - -/* Free memory allocated by a png_create_struct() call */ -void /* PRIVATE */ -png_destroy_struct(png_voidp struct_ptr) -{ -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); -} - -/* Free memory allocated by a png_create_struct() call */ -void /* PRIVATE */ -png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, - png_voidp mem_ptr) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - if (struct_ptr != NULL) - { -#ifdef PNG_USER_MEM_SUPPORTED - if(free_fn != NULL) - { - png_struct dummy_struct; - png_structp png_ptr = &dummy_struct; - png_ptr->mem_ptr=mem_ptr; - (*(free_fn))(png_ptr, struct_ptr); - return; - } -#endif /* PNG_USER_MEM_SUPPORTED */ -#if defined(__TURBOC__) && !defined(__FLAT__) - farfree(struct_ptr); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) - hfree(struct_ptr); -# else - free(struct_ptr); -# endif -#endif - } -} - -/* Allocate memory. For reasonable files, size should never exceed - 64K. However, zlib may allocate more then 64K if you don't tell - it not to. See zconf.h and png.h for more information. zlib does - need to allocate exactly 64K, so whatever you call here must - have the ability to do that. */ - -png_voidp PNGAPI -png_malloc(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ret; - -#ifdef PNG_USER_MEM_SUPPORTED - if (png_ptr == NULL || size == 0) - return (NULL); - - if(png_ptr->malloc_fn != NULL) - ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); - else - ret = (png_malloc_default(png_ptr, size)); - if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of Memory!"); - return (ret); -} - -png_voidp PNGAPI -png_malloc_default(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ret; -#endif /* PNG_USER_MEM_SUPPORTED */ - - if (png_ptr == NULL || size == 0) - return (NULL); - -#ifdef PNG_MAX_MALLOC_64K - if (size > (png_uint_32)65536L) - { -#ifndef PNG_USER_MEM_SUPPORTED - if(png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Cannot Allocate > 64K"); - else -#endif - return NULL; - } -#endif - - /* Check for overflow */ -#if defined(__TURBOC__) && !defined(__FLAT__) - if (size != (unsigned long)size) - ret = NULL; - else - ret = farmalloc(size); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) - if (size != (unsigned long)size) - ret = NULL; - else - ret = halloc(size, 1); -# else - if (size != (size_t)size) - ret = NULL; - else - ret = malloc((size_t)size); -# endif -#endif - -#ifndef PNG_USER_MEM_SUPPORTED - if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of Memory"); -#endif - - return (ret); -} - -/* Free a pointer allocated by png_malloc(). If ptr is NULL, return - without taking any action. */ -void PNGAPI -png_free(png_structp png_ptr, png_voidp ptr) -{ - if (png_ptr == NULL || ptr == NULL) - return; - -#ifdef PNG_USER_MEM_SUPPORTED - if (png_ptr->free_fn != NULL) - { - (*(png_ptr->free_fn))(png_ptr, ptr); - return; - } - else png_free_default(png_ptr, ptr); -} -void PNGAPI -png_free_default(png_structp png_ptr, png_voidp ptr) -{ - if (png_ptr == NULL || ptr == NULL) - return; - -#endif /* PNG_USER_MEM_SUPPORTED */ - -#if defined(__TURBOC__) && !defined(__FLAT__) - farfree(ptr); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) - hfree(ptr); -# else - free(ptr); -# endif -#endif -} - -#endif /* Not Borland DOS special memory handler */ - -#if defined(PNG_1_0_X) -# define png_malloc_warn png_malloc -#else -/* This function was added at libpng version 1.2.3. The png_malloc_warn() - * function will set up png_malloc() to issue a png_warning and return NULL - * instead of issuing a png_error, if it fails to allocate the requested - * memory. - */ -png_voidp PNGAPI -png_malloc_warn(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ptr; - png_uint_32 save_flags=png_ptr->flags; - - png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; - ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); - png_ptr->flags=save_flags; - return(ptr); -} -#endif - -png_voidp PNGAPI -png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, - png_uint_32 length) -{ - png_size_t size; - - size = (png_size_t)length; - if ((png_uint_32)size != length) - png_error(png_ptr,"Overflow in png_memcpy_check."); - - return(png_memcpy (s1, s2, size)); -} - -png_voidp PNGAPI -png_memset_check (png_structp png_ptr, png_voidp s1, int value, - png_uint_32 length) -{ - png_size_t size; - - size = (png_size_t)length; - if ((png_uint_32)size != length) - png_error(png_ptr,"Overflow in png_memset_check."); - - return (png_memset (s1, value, size)); - -} - -#ifdef PNG_USER_MEM_SUPPORTED -/* This function is called when the application wants to use another method - * of allocating and freeing memory. - */ -void PNGAPI -png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr - malloc_fn, png_free_ptr free_fn) -{ - png_ptr->mem_ptr = mem_ptr; - png_ptr->malloc_fn = malloc_fn; - png_ptr->free_fn = free_fn; -} - -/* This function returns a pointer to the mem_ptr associated with the user - * functions. The application should free any memory associated with this - * pointer before png_write_destroy and png_read_destroy are called. - */ -png_voidp PNGAPI -png_get_mem_ptr(png_structp png_ptr) -{ - return ((png_voidp)png_ptr->mem_ptr); -} -#endif /* PNG_USER_MEM_SUPPORTED */ diff --git a/src/SFML/Graphics/libpng/pngpread.c b/src/SFML/Graphics/libpng/pngpread.c deleted file mode 100644 index e1e18d5a..00000000 --- a/src/SFML/Graphics/libpng/pngpread.c +++ /dev/null @@ -1,1573 +0,0 @@ - -/* pngpread.c - read a png file in push mode - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - */ - -#define PNG_INTERNAL -#include "png.h" - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - -/* push model modes */ -#define PNG_READ_SIG_MODE 0 -#define PNG_READ_CHUNK_MODE 1 -#define PNG_READ_IDAT_MODE 2 -#define PNG_SKIP_MODE 3 -#define PNG_READ_tEXt_MODE 4 -#define PNG_READ_zTXt_MODE 5 -#define PNG_READ_DONE_MODE 6 -#define PNG_READ_iTXt_MODE 7 -#define PNG_ERROR_MODE 8 - -void PNGAPI -png_process_data(png_structp png_ptr, png_infop info_ptr, - png_bytep buffer, png_size_t buffer_size) -{ - png_push_restore_buffer(png_ptr, buffer, buffer_size); - - while (png_ptr->buffer_size) - { - png_process_some_data(png_ptr, info_ptr); - } -} - -/* What we do with the incoming data depends on what we were previously - * doing before we ran out of data... - */ -void /* PRIVATE */ -png_process_some_data(png_structp png_ptr, png_infop info_ptr) -{ - switch (png_ptr->process_mode) - { - case PNG_READ_SIG_MODE: - { - png_push_read_sig(png_ptr, info_ptr); - break; - } - case PNG_READ_CHUNK_MODE: - { - png_push_read_chunk(png_ptr, info_ptr); - break; - } - case PNG_READ_IDAT_MODE: - { - png_push_read_IDAT(png_ptr); - break; - } -#if defined(PNG_READ_tEXt_SUPPORTED) - case PNG_READ_tEXt_MODE: - { - png_push_read_tEXt(png_ptr, info_ptr); - break; - } -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - case PNG_READ_zTXt_MODE: - { - png_push_read_zTXt(png_ptr, info_ptr); - break; - } -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - case PNG_READ_iTXt_MODE: - { - png_push_read_iTXt(png_ptr, info_ptr); - break; - } -#endif - case PNG_SKIP_MODE: - { - png_push_crc_finish(png_ptr); - break; - } - default: - { - png_ptr->buffer_size = 0; - break; - } - } -} - -/* Read any remaining signature bytes from the stream and compare them with - * the correct PNG signature. It is possible that this routine is called - * with bytes already read from the signature, either because they have been - * checked by the calling application, or because of multiple calls to this - * routine. - */ -void /* PRIVATE */ -png_push_read_sig(png_structp png_ptr, png_infop info_ptr) -{ - png_size_t num_checked = png_ptr->sig_bytes, - num_to_check = 8 - num_checked; - - if (png_ptr->buffer_size < num_to_check) - { - num_to_check = png_ptr->buffer_size; - } - - png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), - num_to_check); - png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes+num_to_check); - - if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) - { - if (num_checked < 4 && - png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) - png_error(png_ptr, "Not a PNG file"); - else - png_error(png_ptr, "PNG file corrupted by ASCII conversion"); - } - else - { - if (png_ptr->sig_bytes >= 8) - { - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - } - } -} - -void /* PRIVATE */ -png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IHDR; - PNG_IDAT; - PNG_IEND; - PNG_PLTE; -#if defined(PNG_READ_bKGD_SUPPORTED) - PNG_bKGD; -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - PNG_cHRM; -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - PNG_gAMA; -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - PNG_hIST; -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - PNG_iCCP; -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - PNG_iTXt; -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - PNG_oFFs; -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - PNG_pCAL; -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - PNG_pHYs; -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - PNG_sBIT; -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - PNG_sCAL; -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - PNG_sRGB; -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - PNG_sPLT; -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - PNG_tEXt; -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - PNG_tIME; -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - PNG_tRNS; -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - PNG_zTXt; -#endif -#endif /* PNG_USE_LOCAL_ARRAYS */ - /* First we make sure we have enough data for the 4 byte chunk name - * and the 4 byte chunk length before proceeding with decoding the - * chunk data. To fully decode each of these chunks, we also make - * sure we have enough data in the buffer for the 4 byte CRC at the - * end of every chunk (except IDAT, which is handled separately). - */ - if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) - { - png_byte chunk_length[4]; - - if (png_ptr->buffer_size < 8) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_fill_buffer(png_ptr, chunk_length, 4); - png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length); - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; - } - - if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); - } - else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); - - png_ptr->process_mode = PNG_READ_DONE_MODE; - png_push_have_end(png_ptr, info_ptr); - } -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - png_ptr->mode |= PNG_HAVE_IDAT; - png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); - if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_ptr->mode |= PNG_HAVE_PLTE; - else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before IDAT"); - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) - png_error(png_ptr, "Missing PLTE before IDAT"); - } - } -#endif - else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); - } - else if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) - { - /* If we reach an IDAT chunk, this means we have read all of the - * header chunks, and we can start reading the image (or if this - * is called after the image has been read - we have an error). - */ - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before IDAT"); - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) - png_error(png_ptr, "Missing PLTE before IDAT"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - { - if (png_ptr->push_length == 0) - return; - - if (png_ptr->mode & PNG_AFTER_IDAT) - png_error(png_ptr, "Too many IDAT's found"); - } - - png_ptr->idat_size = png_ptr->push_length; - png_ptr->mode |= PNG_HAVE_IDAT; - png_ptr->process_mode = PNG_READ_IDAT_MODE; - png_push_have_info(png_ptr, info_ptr); - png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; - png_ptr->zstream.next_out = png_ptr->row_buf; - return; - } -#if defined(PNG_READ_gAMA_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_bKGD_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); - } -#endif - else - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); - } - - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; -} - -void /* PRIVATE */ -png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) -{ - png_ptr->process_mode = PNG_SKIP_MODE; - png_ptr->skip_length = skip; -} - -void /* PRIVATE */ -png_push_crc_finish(png_structp png_ptr) -{ - if (png_ptr->skip_length && png_ptr->save_buffer_size) - { - png_size_t save_size; - - if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) - save_size = (png_size_t)png_ptr->skip_length; - else - save_size = png_ptr->save_buffer_size; - - png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); - - png_ptr->skip_length -= save_size; - png_ptr->buffer_size -= save_size; - png_ptr->save_buffer_size -= save_size; - png_ptr->save_buffer_ptr += save_size; - } - if (png_ptr->skip_length && png_ptr->current_buffer_size) - { - png_size_t save_size; - - if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) - save_size = (png_size_t)png_ptr->skip_length; - else - save_size = png_ptr->current_buffer_size; - - png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); - - png_ptr->skip_length -= save_size; - png_ptr->buffer_size -= save_size; - png_ptr->current_buffer_size -= save_size; - png_ptr->current_buffer_ptr += save_size; - } - if (!png_ptr->skip_length) - { - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_crc_finish(png_ptr, 0); - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - } -} - -void PNGAPI -png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) -{ - png_bytep ptr; - - ptr = buffer; - if (png_ptr->save_buffer_size) - { - png_size_t save_size; - - if (length < png_ptr->save_buffer_size) - save_size = length; - else - save_size = png_ptr->save_buffer_size; - - png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); - length -= save_size; - ptr += save_size; - png_ptr->buffer_size -= save_size; - png_ptr->save_buffer_size -= save_size; - png_ptr->save_buffer_ptr += save_size; - } - if (length && png_ptr->current_buffer_size) - { - png_size_t save_size; - - if (length < png_ptr->current_buffer_size) - save_size = length; - else - save_size = png_ptr->current_buffer_size; - - png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); - png_ptr->buffer_size -= save_size; - png_ptr->current_buffer_size -= save_size; - png_ptr->current_buffer_ptr += save_size; - } -} - -void /* PRIVATE */ -png_push_save_buffer(png_structp png_ptr) -{ - if (png_ptr->save_buffer_size) - { - if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) - { - png_size_t i,istop; - png_bytep sp; - png_bytep dp; - - istop = png_ptr->save_buffer_size; - for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; - i < istop; i++, sp++, dp++) - { - *dp = *sp; - } - } - } - if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > - png_ptr->save_buffer_max) - { - png_size_t new_max; - png_bytep old_buffer; - - if (png_ptr->save_buffer_size > PNG_SIZE_MAX - - (png_ptr->current_buffer_size + 256)) - { - png_error(png_ptr, "Potential overflow of save_buffer"); - } - new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; - old_buffer = png_ptr->save_buffer; - png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr, - (png_uint_32)new_max); - png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); - png_free(png_ptr, old_buffer); - png_ptr->save_buffer_max = new_max; - } - if (png_ptr->current_buffer_size) - { - png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, - png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); - png_ptr->save_buffer_size += png_ptr->current_buffer_size; - png_ptr->current_buffer_size = 0; - } - png_ptr->save_buffer_ptr = png_ptr->save_buffer; - png_ptr->buffer_size = 0; -} - -void /* PRIVATE */ -png_push_restore_buffer(png_structp png_ptr, png_bytep buffer, - png_size_t buffer_length) -{ - png_ptr->current_buffer = buffer; - png_ptr->current_buffer_size = buffer_length; - png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; - png_ptr->current_buffer_ptr = png_ptr->current_buffer; -} - -void /* PRIVATE */ -png_push_read_IDAT(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IDAT; -#endif - if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) - { - png_byte chunk_length[4]; - - if (png_ptr->buffer_size < 8) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_fill_buffer(png_ptr, chunk_length, 4); - png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length); - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; - - if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) - { - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) - png_error(png_ptr, "Not enough compressed data"); - return; - } - - png_ptr->idat_size = png_ptr->push_length; - } - if (png_ptr->idat_size && png_ptr->save_buffer_size) - { - png_size_t save_size; - - if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) - { - save_size = (png_size_t)png_ptr->idat_size; - /* check for overflow */ - if((png_uint_32)save_size != png_ptr->idat_size) - png_error(png_ptr, "save_size overflowed in pngpread"); - } - else - save_size = png_ptr->save_buffer_size; - - png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); - if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) - png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); - png_ptr->idat_size -= save_size; - png_ptr->buffer_size -= save_size; - png_ptr->save_buffer_size -= save_size; - png_ptr->save_buffer_ptr += save_size; - } - if (png_ptr->idat_size && png_ptr->current_buffer_size) - { - png_size_t save_size; - - if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) - { - save_size = (png_size_t)png_ptr->idat_size; - /* check for overflow */ - if((png_uint_32)save_size != png_ptr->idat_size) - png_error(png_ptr, "save_size overflowed in pngpread"); - } - else - save_size = png_ptr->current_buffer_size; - - png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); - if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) - png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); - - png_ptr->idat_size -= save_size; - png_ptr->buffer_size -= save_size; - png_ptr->current_buffer_size -= save_size; - png_ptr->current_buffer_ptr += save_size; - } - if (!png_ptr->idat_size) - { - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_crc_finish(png_ptr, 0); - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - png_ptr->mode |= PNG_AFTER_IDAT; - } -} - -void /* PRIVATE */ -png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, - png_size_t buffer_length) -{ - int ret; - - if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length) - png_error(png_ptr, "Extra compression data"); - - png_ptr->zstream.next_in = buffer; - png_ptr->zstream.avail_in = (uInt)buffer_length; - for(;;) - { - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret != Z_OK) - { - if (ret == Z_STREAM_END) - { - if (png_ptr->zstream.avail_in) - png_error(png_ptr, "Extra compressed data"); - if (!(png_ptr->zstream.avail_out)) - { - png_push_process_row(png_ptr); - } - - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - else if (ret == Z_BUF_ERROR) - break; - else - png_error(png_ptr, "Decompression Error"); - } - if (!(png_ptr->zstream.avail_out)) - { - if (( -#if defined(PNG_READ_INTERLACING_SUPPORTED) - png_ptr->interlaced && png_ptr->pass > 6) || - (!png_ptr->interlaced && -#endif - png_ptr->row_number == png_ptr->num_rows)) - { - if (png_ptr->zstream.avail_in) - png_warning(png_ptr, "Too much data in IDAT chunks"); - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - png_push_process_row(png_ptr); - png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; - png_ptr->zstream.next_out = png_ptr->row_buf; - } - else - break; - } -} - -void /* PRIVATE */ -png_push_process_row(png_structp png_ptr) -{ - png_ptr->row_info.color_type = png_ptr->color_type; - png_ptr->row_info.width = png_ptr->iwidth; - png_ptr->row_info.channels = png_ptr->channels; - png_ptr->row_info.bit_depth = png_ptr->bit_depth; - png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; - - png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->row_info.width); - - png_read_filter_row(png_ptr, &(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->prev_row + 1, - (int)(png_ptr->row_buf[0])); - - png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, - png_ptr->rowbytes + 1); - - if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) - png_do_read_transformations(png_ptr); - -#if defined(PNG_READ_INTERLACING_SUPPORTED) - /* blow up interlaced rows to full size */ - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) - { - if (png_ptr->pass < 6) -/* old interface (pre-1.0.9): - png_do_read_interlace(&(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); - */ - png_do_read_interlace(png_ptr); - - switch (png_ptr->pass) - { - case 0: - { - int i; - for (i = 0; i < 8 && png_ptr->pass == 0; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */ - } - if (png_ptr->pass == 2) /* pass 1 might be empty */ - { - for (i = 0; i < 4 && png_ptr->pass == 2; i++) - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - } - if (png_ptr->pass == 4 && png_ptr->height <= 4) - { - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - } - if (png_ptr->pass == 6 && png_ptr->height <= 4) - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - break; - } - case 1: - { - int i; - for (i = 0; i < 8 && png_ptr->pass == 1; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - if (png_ptr->pass == 2) /* skip top 4 generated rows */ - { - for (i = 0; i < 4 && png_ptr->pass == 2; i++) - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - } - break; - } - case 2: - { - int i; - for (i = 0; i < 4 && png_ptr->pass == 2; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - for (i = 0; i < 4 && png_ptr->pass == 2; i++) - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - if (png_ptr->pass == 4) /* pass 3 might be empty */ - { - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - } - break; - } - case 3: - { - int i; - for (i = 0; i < 4 && png_ptr->pass == 3; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - if (png_ptr->pass == 4) /* skip top two generated rows */ - { - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - } - break; - } - case 4: - { - int i; - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - if (png_ptr->pass == 6) /* pass 5 might be empty */ - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - break; - } - case 5: - { - int i; - for (i = 0; i < 2 && png_ptr->pass == 5; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - if (png_ptr->pass == 6) /* skip top generated row */ - { - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - break; - } - case 6: - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - if (png_ptr->pass != 6) - break; - png_push_have_row(png_ptr, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - } - } - else -#endif - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } -} - -void /* PRIVATE */ -png_read_push_finish_row(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; - - /* Width of interlace block. This is not currently used - if you need - * it, uncomment it here and in png.h - const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; - */ - - /* Height of interlace block. This is not currently used - if you need - * it, uncomment it here and in png.h - const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; - */ -#endif - - png_ptr->row_number++; - if (png_ptr->row_number < png_ptr->num_rows) - return; - - if (png_ptr->interlaced) - { - png_ptr->row_number = 0; - png_memset_check(png_ptr, png_ptr->prev_row, 0, - png_ptr->rowbytes + 1); - do - { - png_ptr->pass++; - if ((png_ptr->pass == 1 && png_ptr->width < 5) || - (png_ptr->pass == 3 && png_ptr->width < 3) || - (png_ptr->pass == 5 && png_ptr->width < 2)) - png_ptr->pass++; - - if (png_ptr->pass > 7) - png_ptr->pass--; - if (png_ptr->pass >= 7) - break; - - png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - - png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, - png_ptr->iwidth) + 1; - - if (png_ptr->transformations & PNG_INTERLACE) - break; - - png_ptr->num_rows = (png_ptr->height + - png_pass_yinc[png_ptr->pass] - 1 - - png_pass_ystart[png_ptr->pass]) / - png_pass_yinc[png_ptr->pass]; - - } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); - } -} - -#if defined(PNG_READ_tEXt_SUPPORTED) -void /* PRIVATE */ -png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - png_error(png_ptr, "Out of place tEXt"); - /* to quiet some compiler warnings */ - if(info_ptr == NULL) return; - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "tEXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_uint_32)(length+1)); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_tEXt_MODE; -} - -void /* PRIVATE */ -png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - else - text_size = png_ptr->current_text_left; - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#if defined(PNG_MAX_MALLOC_64K) - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* empty loop */ ; - - if (text != key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, - (png_uint_32)png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; - text_ptr->key = key; -#ifdef PNG_iTXt_SUPPORTED - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; -#endif - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - png_ptr->current_text = NULL; - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk."); - } -} -#endif - -#if defined(PNG_READ_zTXt_SUPPORTED) -void /* PRIVATE */ -png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - png_error(png_ptr, "Out of place zTXt"); - /* to quiet some compiler warnings */ - if(info_ptr == NULL) return; - } - -#ifdef PNG_MAX_MALLOC_64K - /* We can't handle zTXt chunks > 64K, since we don't have enough space - * to be able to store the uncompressed data. Actually, the threshold - * is probably around 32K, but it isn't as definite as 64K is. - */ - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "zTXt chunk too large to fit in memory"); - png_push_crc_skip(png_ptr, length); - return; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_uint_32)(length+1)); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_zTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - else - text_size = png_ptr->current_text_left; - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - png_size_t text_size, key_size; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* empty loop */ ; - - /* zTXt can't have zero text */ - if (text == key + png_ptr->current_text_size) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */ - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - png_ptr->zstream.next_in = (png_bytep )text; - png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - - (text - key)); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - key_size = text - key; - text_size = 0; - text = NULL; - ret = Z_STREAM_END; - - while (png_ptr->zstream.avail_in) - { - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret != Z_OK && ret != Z_STREAM_END) - { - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) - { - if (text == NULL) - { - text = (png_charp)png_malloc(png_ptr, - (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out - + key_size + 1)); - png_memcpy(text + key_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - png_memcpy(text, key, key_size); - text_size = key_size + png_ptr->zbuf_size - - png_ptr->zstream.avail_out; - *(text + text_size) = '\0'; - } - else - { - png_charp tmp; - - tmp = text; - text = (png_charp)png_malloc(png_ptr, text_size + - (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out - + 1)); - png_memcpy(text, tmp, text_size); - png_free(png_ptr, tmp); - png_memcpy(text + text_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; - *(text + text_size) = '\0'; - } - if (ret != Z_STREAM_END) - { - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - } - else - { - break; - } - - if (ret == Z_STREAM_END) - break; - } - - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - - if (ret != Z_STREAM_END) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - - png_ptr->current_text = NULL; - png_free(png_ptr, key); - key = text; - text += key_size; - - text_ptr = (png_textp)png_malloc(png_ptr, - (png_uint_32)png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; - text_ptr->key = key; -#ifdef PNG_iTXt_SUPPORTED - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; -#endif - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk."); - } -} -#endif - -#if defined(PNG_READ_iTXt_SUPPORTED) -void /* PRIVATE */ -png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - png_error(png_ptr, "Out of place iTXt"); - /* to quiet some compiler warnings */ - if(info_ptr == NULL) return; - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "iTXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_uint_32)(length+1)); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_iTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) -{ - - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - else - text_size = png_ptr->current_text_left; - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp key; - int comp_flag; - png_charp lang; - png_charp lang_key; - png_charp text; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#if defined(PNG_MAX_MALLOC_64K) - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (lang = key; *lang; lang++) - /* empty loop */ ; - - if (lang != key + png_ptr->current_text_size) - lang++; - - comp_flag = *lang++; - lang++; /* skip comp_type, always zero */ - - for (lang_key = lang; *lang_key; lang_key++) - /* empty loop */ ; - lang_key++; /* skip NUL separator */ - - for (text = lang_key; *text; text++) - /* empty loop */ ; - - if (text != key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, - (png_uint_32)png_sizeof(png_text)); - text_ptr->compression = comp_flag + 2; - text_ptr->key = key; - text_ptr->lang = lang; - text_ptr->lang_key = lang_key; - text_ptr->text = text; - text_ptr->text_length = 0; - text_ptr->itxt_length = png_strlen(text); - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_ptr->current_text = NULL; - - png_free(png_ptr, text_ptr); - if (ret) - png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); - } -} -#endif - -/* This function is called when we haven't found a handler for this - * chunk. If there isn't a problem with the chunk itself (ie a bad chunk - * name or a critical chunk), the chunk is (currently) silently ignored. - */ -void /* PRIVATE */ -png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - png_uint_32 skip=0; - png_check_chunk_name(png_ptr, png_ptr->chunk_name); - - if (!(png_ptr->chunk_name[0] & 0x20)) - { -#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) - && png_ptr->read_user_chunk_fn == NULL -#endif - ) -#endif - png_chunk_error(png_ptr, "unknown critical chunk"); - - /* to quiet compiler warnings about unused info_ptr */ - if (info_ptr == NULL) - return; - } - -#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) - { - png_unknown_chunk chunk; - -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "unknown chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_strcpy((png_charp)chunk.name, (png_charp)png_ptr->chunk_name); - chunk.data = (png_bytep)png_malloc(png_ptr, length); - png_crc_read(png_ptr, chunk.data, length); - chunk.size = length; -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) - if(png_ptr->read_user_chunk_fn != NULL) - { - /* callback to user unknown chunk handler */ - if ((*(png_ptr->read_user_chunk_fn)) (png_ptr, &chunk) <= 0) - { - if (!(png_ptr->chunk_name[0] & 0x20)) - if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS) - png_chunk_error(png_ptr, "unknown critical chunk"); - } - png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1); - } - else -#endif - png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1); - png_free(png_ptr, chunk.data); - } - else -#endif - skip=length; - png_push_crc_skip(png_ptr, skip); -} - -void /* PRIVATE */ -png_push_have_info(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->info_fn != NULL) - (*(png_ptr->info_fn))(png_ptr, info_ptr); -} - -void /* PRIVATE */ -png_push_have_end(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->end_fn != NULL) - (*(png_ptr->end_fn))(png_ptr, info_ptr); -} - -void /* PRIVATE */ -png_push_have_row(png_structp png_ptr, png_bytep row) -{ - if (png_ptr->row_fn != NULL) - (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, - (int)png_ptr->pass); -} - -void PNGAPI -png_progressive_combine_row (png_structp png_ptr, - png_bytep old_row, png_bytep new_row) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - const int FARDATA png_pass_dsp_mask[7] = - {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; -#endif - if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ - png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); -} - -void PNGAPI -png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, - png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, - png_progressive_end_ptr end_fn) -{ - png_ptr->info_fn = info_fn; - png_ptr->row_fn = row_fn; - png_ptr->end_fn = end_fn; - - png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); -} - -png_voidp PNGAPI -png_get_progressive_ptr(png_structp png_ptr) -{ - return png_ptr->io_ptr; -} -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ diff --git a/src/SFML/Graphics/libpng/pngread.c b/src/SFML/Graphics/libpng/pngread.c deleted file mode 100644 index 984fd164..00000000 --- a/src/SFML/Graphics/libpng/pngread.c +++ /dev/null @@ -1,1456 +0,0 @@ - -/* pngread.c - read a PNG file - * - * libpng 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This file contains routines that an application calls directly to - * read a PNG file or stream. - */ - -#define PNG_INTERNAL -#include "png.h" - -/* Create a PNG structure for reading, and allocate any memory needed. */ -png_structp PNGAPI -png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn) -{ - -#ifdef PNG_USER_MEM_SUPPORTED - return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn, - warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); -} - -/* Alternate create PNG structure for reading, and allocate any memory needed. */ -png_structp PNGAPI -png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - - png_structp png_ptr; - -#ifdef PNG_SETJMP_SUPPORTED -#ifdef USE_FAR_KEYWORD - jmp_buf jmpbuf; -#endif -#endif - - int i; - - png_debug(1, "in png_create_read_struct\n"); -#ifdef PNG_USER_MEM_SUPPORTED - png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, - (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); -#else - png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); -#endif - if (png_ptr == NULL) - return (NULL); - -#if !defined(PNG_1_0_X) -#ifdef PNG_ASSEMBLER_CODE_SUPPORTED - png_init_mmx_flags(png_ptr); /* 1.2.0 addition */ -#endif -#endif /* PNG_1_0_X */ - - /* added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - png_ptr->user_width_max=PNG_USER_WIDTH_MAX; - png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; -#endif - -#ifdef PNG_SETJMP_SUPPORTED -#ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) -#else - if (setjmp(png_ptr->jmpbuf)) -#endif - { - png_free(png_ptr, png_ptr->zbuf); - png_ptr->zbuf=NULL; -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)png_ptr, - (png_free_ptr)free_fn, (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)png_ptr); -#endif - return (NULL); - } -#ifdef USE_FAR_KEYWORD - png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); -#endif -#endif - -#ifdef PNG_USER_MEM_SUPPORTED - png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); -#endif - - png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); - - i=0; - do - { - if(user_png_ver[i] != png_libpng_ver[i]) - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - } while (png_libpng_ver[i++]); - - if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) - { - /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so - * we must recompile any applications that use any older library version. - * For versions after libpng 1.0, we will be compatible, so we need - * only check the first digit. - */ - if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || - (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || - (user_png_ver[0] == '0' && user_png_ver[2] < '9')) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[80]; - if (user_png_ver) - { - sprintf(msg, "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); - } - sprintf(msg, "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); -#endif -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "Incompatible libpng version in application and library"); - } - } - - /* initialize zbuf - compression buffer */ - png_ptr->zbuf_size = PNG_ZBUF_SIZE; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - png_ptr->zstream.zalloc = png_zalloc; - png_ptr->zstream.zfree = png_zfree; - png_ptr->zstream.opaque = (voidpf)png_ptr; - - switch (inflateInit(&png_ptr->zstream)) - { - case Z_OK: /* Do nothing */ break; - case Z_MEM_ERROR: - case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break; - case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break; - default: png_error(png_ptr, "Unknown zlib error"); - } - - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); - -#ifdef PNG_SETJMP_SUPPORTED -/* Applications that neglect to set up their own setjmp() and then encounter - a png_error() will longjmp here. Since the jmpbuf is then meaningless we - abort instead of returning. */ -#ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) - PNG_ABORT(); - png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); -#else - if (setjmp(png_ptr->jmpbuf)) - PNG_ABORT(); -#endif -#endif - return (png_ptr); -} - -/* Initialize PNG structure for reading, and allocate any memory needed. - This interface is deprecated in favour of the png_create_read_struct(), - and it will eventually disappear. */ -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -#undef png_read_init -void PNGAPI -png_read_init(png_structp png_ptr) -{ - /* We only come here via pre-1.0.7-compiled applications */ - png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0); -} -#endif - -void PNGAPI -png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver, - png_size_t png_struct_size, png_size_t png_info_size) -{ - /* We only come here via pre-1.0.12-compiled applications */ -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - if(png_sizeof(png_struct) > png_struct_size || - png_sizeof(png_info) > png_info_size) - { - char msg[80]; - png_ptr->warning_fn=NULL; - if (user_png_ver) - { - sprintf(msg, "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); - } - sprintf(msg, "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); - } -#endif - if(png_sizeof(png_struct) > png_struct_size) - { - png_ptr->error_fn=NULL; -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "The png struct allocated by the application for reading is too small."); - } - if(png_sizeof(png_info) > png_info_size) - { - png_ptr->error_fn=NULL; -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "The info struct allocated by application for reading is too small."); - } - png_read_init_3(&png_ptr, user_png_ver, png_struct_size); -} - -void PNGAPI -png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, - png_size_t png_struct_size) -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf tmp_jmp; /* to save current jump buffer */ -#endif - - int i=0; - - png_structp png_ptr=*ptr_ptr; - - do - { - if(user_png_ver[i] != png_libpng_ver[i]) - { -#ifdef PNG_LEGACY_SUPPORTED - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; -#else - png_ptr->warning_fn=NULL; - png_warning(png_ptr, - "Application uses deprecated png_read_init() and should be recompiled."); - break; -#endif - } - } while (png_libpng_ver[i++]); - - png_debug(1, "in png_read_init_3\n"); - -#ifdef PNG_SETJMP_SUPPORTED - /* save jump buffer and error functions */ - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); -#endif - - if(png_sizeof(png_struct) > png_struct_size) - { - png_destroy_struct(png_ptr); - *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); - png_ptr = *ptr_ptr; - } - - /* reset all variables to 0 */ - png_memset(png_ptr, 0, png_sizeof (png_struct)); - -#ifdef PNG_SETJMP_SUPPORTED - /* restore jump buffer */ - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); -#endif - - /* added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - png_ptr->user_width_max=PNG_USER_WIDTH_MAX; - png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; -#endif - - /* initialize zbuf - compression buffer */ - png_ptr->zbuf_size = PNG_ZBUF_SIZE; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - png_ptr->zstream.zalloc = png_zalloc; - png_ptr->zstream.zfree = png_zfree; - png_ptr->zstream.opaque = (voidpf)png_ptr; - - switch (inflateInit(&png_ptr->zstream)) - { - case Z_OK: /* Do nothing */ break; - case Z_MEM_ERROR: - case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory"); break; - case Z_VERSION_ERROR: png_error(png_ptr, "zlib version"); break; - default: png_error(png_ptr, "Unknown zlib error"); - } - - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); -} - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* Read the information before the actual image data. This has been - * changed in v0.90 to allow reading a file that already has the magic - * bytes read from the stream. You can tell libpng how many bytes have - * been read from the beginning of the stream (up to the maximum of 8) - * via png_set_sig_bytes(), and we will only check the remaining bytes - * here. The application can then have access to the signature bytes we - * read if it is determined that this isn't a valid PNG file. - */ -void PNGAPI -png_read_info(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_read_info\n"); - /* If we haven't checked all of the PNG signature bytes, do so now. */ - if (png_ptr->sig_bytes < 8) - { - png_size_t num_checked = png_ptr->sig_bytes, - num_to_check = 8 - num_checked; - - png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); - png_ptr->sig_bytes = 8; - - if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) - { - if (num_checked < 4 && - png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) - png_error(png_ptr, "Not a PNG file"); - else - png_error(png_ptr, "PNG file corrupted by ASCII conversion"); - } - if (num_checked < 3) - png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; - } - - for(;;) - { -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IHDR; - PNG_IDAT; - PNG_IEND; - PNG_PLTE; -#if defined(PNG_READ_bKGD_SUPPORTED) - PNG_bKGD; -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - PNG_cHRM; -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - PNG_gAMA; -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - PNG_hIST; -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - PNG_iCCP; -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - PNG_iTXt; -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - PNG_oFFs; -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - PNG_pCAL; -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - PNG_pHYs; -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - PNG_sBIT; -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - PNG_sCAL; -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - PNG_sPLT; -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - PNG_sRGB; -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - PNG_tEXt; -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - PNG_tIME; -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - PNG_tRNS; -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - PNG_zTXt; -#endif -#endif /* PNG_USE_LOCAL_ARRAYS */ - png_byte chunk_length[4]; - png_uint_32 length; - - png_read_data(png_ptr, chunk_length, 4); - length = png_get_uint_31(png_ptr,chunk_length); - - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - - png_debug2(0, "Reading %s chunk, length=%lu.\n", png_ptr->chunk_name, - length); - - /* This should be a binary subdivision search or a hash for - * matching the chunk name rather than a linear search. - */ - if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) - png_handle_IHDR(png_ptr, info_ptr, length); - else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) - png_handle_IEND(png_ptr, info_ptr, length); -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) - { - if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - png_ptr->mode |= PNG_HAVE_IDAT; - png_handle_unknown(png_ptr, info_ptr, length); - if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_ptr->mode |= PNG_HAVE_PLTE; - else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before IDAT"); - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) - png_error(png_ptr, "Missing PLTE before IDAT"); - break; - } - } -#endif - else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_handle_PLTE(png_ptr, info_ptr, length); - else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before IDAT"); - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) - png_error(png_ptr, "Missing PLTE before IDAT"); - - png_ptr->idat_size = length; - png_ptr->mode |= PNG_HAVE_IDAT; - break; - } -#if defined(PNG_READ_bKGD_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) - png_handle_bKGD(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) - png_handle_cHRM(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) - png_handle_gAMA(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) - png_handle_hIST(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) - png_handle_oFFs(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) - png_handle_pCAL(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) - png_handle_sCAL(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) - png_handle_pHYs(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) - png_handle_sBIT(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) - png_handle_sRGB(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) - png_handle_iCCP(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) - png_handle_sPLT(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) - png_handle_tEXt(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) - png_handle_tIME(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) - png_handle_tRNS(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) - png_handle_zTXt(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) - png_handle_iTXt(png_ptr, info_ptr, length); -#endif - else - png_handle_unknown(png_ptr, info_ptr, length); - } -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -/* optional call to update the users info_ptr structure */ -void PNGAPI -png_read_update_info(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_read_update_info\n"); - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) - png_read_start_row(png_ptr); - else - png_warning(png_ptr, - "Ignoring extra png_read_update_info() call; row buffer not reallocated"); - png_read_transform_info(png_ptr, info_ptr); -} - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* Initialize palette, background, etc, after transformations - * are set, but before any reading takes place. This allows - * the user to obtain a gamma-corrected palette, for example. - * If the user doesn't call this, we will do it ourselves. - */ -void PNGAPI -png_start_read_image(png_structp png_ptr) -{ - png_debug(1, "in png_start_read_image\n"); - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) - png_read_start_row(png_ptr); -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -void PNGAPI -png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IDAT; - const int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; - const int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; -#endif - int ret; - png_debug2(1, "in png_read_row (row %lu, pass %d)\n", - png_ptr->row_number, png_ptr->pass); - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) - png_read_start_row(png_ptr); - if (png_ptr->row_number == 0 && png_ptr->pass == 0) - { - /* check for transforms that have been set but were defined out */ -#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) - png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined."); -#endif -#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) - png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined."); -#endif -#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && !defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined."); -#endif -#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) - png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined."); -#endif -#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) - png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined."); -#endif -#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) - png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined."); -#endif -#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined."); -#endif - } - -#if defined(PNG_READ_INTERLACING_SUPPORTED) - /* if interlaced and we do not need a new row, combine row and return */ - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) - { - switch (png_ptr->pass) - { - case 0: - if (png_ptr->row_number & 0x07) - { - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); - png_read_finish_row(png_ptr); - return; - } - break; - case 1: - if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) - { - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); - png_read_finish_row(png_ptr); - return; - } - break; - case 2: - if ((png_ptr->row_number & 0x07) != 4) - { - if (dsp_row != NULL && (png_ptr->row_number & 4)) - png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); - png_read_finish_row(png_ptr); - return; - } - break; - case 3: - if ((png_ptr->row_number & 3) || png_ptr->width < 3) - { - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); - png_read_finish_row(png_ptr); - return; - } - break; - case 4: - if ((png_ptr->row_number & 3) != 2) - { - if (dsp_row != NULL && (png_ptr->row_number & 2)) - png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); - png_read_finish_row(png_ptr); - return; - } - break; - case 5: - if ((png_ptr->row_number & 1) || png_ptr->width < 2) - { - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); - png_read_finish_row(png_ptr); - return; - } - break; - case 6: - if (!(png_ptr->row_number & 1)) - { - png_read_finish_row(png_ptr); - return; - } - break; - } - } -#endif - - if (!(png_ptr->mode & PNG_HAVE_IDAT)) - png_error(png_ptr, "Invalid attempt to read row data"); - - png_ptr->zstream.next_out = png_ptr->row_buf; - png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; - do - { - if (!(png_ptr->zstream.avail_in)) - { - while (!png_ptr->idat_size) - { - png_byte chunk_length[4]; - - png_crc_finish(png_ptr, 0); - - png_read_data(png_ptr, chunk_length, 4); - png_ptr->idat_size = png_get_uint_31(png_ptr,chunk_length); - - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - png_error(png_ptr, "Not enough image data"); - } - png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_in = png_ptr->zbuf; - if (png_ptr->zbuf_size > png_ptr->idat_size) - png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; - png_crc_read(png_ptr, png_ptr->zbuf, - (png_size_t)png_ptr->zstream.avail_in); - png_ptr->idat_size -= png_ptr->zstream.avail_in; - } - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret == Z_STREAM_END) - { - if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || - png_ptr->idat_size) - png_error(png_ptr, "Extra compressed data"); - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - if (ret != Z_OK) - png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : - "Decompression error"); - - } while (png_ptr->zstream.avail_out); - - png_ptr->row_info.color_type = png_ptr->color_type; - png_ptr->row_info.width = png_ptr->iwidth; - png_ptr->row_info.channels = png_ptr->channels; - png_ptr->row_info.bit_depth = png_ptr->bit_depth; - png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; - png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->row_info.width); - - if(png_ptr->row_buf[0]) - png_read_filter_row(png_ptr, &(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->prev_row + 1, - (int)(png_ptr->row_buf[0])); - - png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, - png_ptr->rowbytes + 1); - -#if defined(PNG_MNG_FEATURES_SUPPORTED) - if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) - { - /* Intrapixel differencing */ - png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); - } -#endif - - - if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) - png_do_read_transformations(png_ptr); - -#if defined(PNG_READ_INTERLACING_SUPPORTED) - /* blow up interlaced rows to full size */ - if (png_ptr->interlaced && - (png_ptr->transformations & PNG_INTERLACE)) - { - if (png_ptr->pass < 6) -/* old interface (pre-1.0.9): - png_do_read_interlace(&(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); - */ - png_do_read_interlace(png_ptr); - - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); - if (row != NULL) - png_combine_row(png_ptr, row, - png_pass_mask[png_ptr->pass]); - } - else -#endif - { - if (row != NULL) - png_combine_row(png_ptr, row, 0xff); - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, 0xff); - } - png_read_finish_row(png_ptr); - - if (png_ptr->read_row_fn != NULL) - (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* Read one or more rows of image data. If the image is interlaced, - * and png_set_interlace_handling() has been called, the rows need to - * contain the contents of the rows from the previous pass. If the - * image has alpha or transparency, and png_handle_alpha()[*] has been - * called, the rows contents must be initialized to the contents of the - * screen. - * - * "row" holds the actual image, and pixels are placed in it - * as they arrive. If the image is displayed after each pass, it will - * appear to "sparkle" in. "display_row" can be used to display a - * "chunky" progressive image, with finer detail added as it becomes - * available. If you do not want this "chunky" display, you may pass - * NULL for display_row. If you do not want the sparkle display, and - * you have not called png_handle_alpha(), you may pass NULL for rows. - * If you have called png_handle_alpha(), and the image has either an - * alpha channel or a transparency chunk, you must provide a buffer for - * rows. In this case, you do not have to provide a display_row buffer - * also, but you may. If the image is not interlaced, or if you have - * not called png_set_interlace_handling(), the display_row buffer will - * be ignored, so pass NULL to it. - * - * [*] png_handle_alpha() does not exist yet, as of libpng version 1.2.8 - */ - -void PNGAPI -png_read_rows(png_structp png_ptr, png_bytepp row, - png_bytepp display_row, png_uint_32 num_rows) -{ - png_uint_32 i; - png_bytepp rp; - png_bytepp dp; - - png_debug(1, "in png_read_rows\n"); - rp = row; - dp = display_row; - if (rp != NULL && dp != NULL) - for (i = 0; i < num_rows; i++) - { - png_bytep rptr = *rp++; - png_bytep dptr = *dp++; - - png_read_row(png_ptr, rptr, dptr); - } - else if(rp != NULL) - for (i = 0; i < num_rows; i++) - { - png_bytep rptr = *rp; - png_read_row(png_ptr, rptr, png_bytep_NULL); - rp++; - } - else if(dp != NULL) - for (i = 0; i < num_rows; i++) - { - png_bytep dptr = *dp; - png_read_row(png_ptr, png_bytep_NULL, dptr); - dp++; - } -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* Read the entire image. If the image has an alpha channel or a tRNS - * chunk, and you have called png_handle_alpha()[*], you will need to - * initialize the image to the current image that PNG will be overlaying. - * We set the num_rows again here, in case it was incorrectly set in - * png_read_start_row() by a call to png_read_update_info() or - * png_start_read_image() if png_set_interlace_handling() wasn't called - * prior to either of these functions like it should have been. You can - * only call this function once. If you desire to have an image for - * each pass of a interlaced image, use png_read_rows() instead. - * - * [*] png_handle_alpha() does not exist yet, as of libpng version 1.2.8 - */ -void PNGAPI -png_read_image(png_structp png_ptr, png_bytepp image) -{ - png_uint_32 i,image_height; - int pass, j; - png_bytepp rp; - - png_debug(1, "in png_read_image\n"); - -#ifdef PNG_READ_INTERLACING_SUPPORTED - pass = png_set_interlace_handling(png_ptr); -#else - if (png_ptr->interlaced) - png_error(png_ptr, - "Cannot read interlaced image -- interlace handler disabled."); - pass = 1; -#endif - - - image_height=png_ptr->height; - png_ptr->num_rows = image_height; /* Make sure this is set correctly */ - - for (j = 0; j < pass; j++) - { - rp = image; - for (i = 0; i < image_height; i++) - { - png_read_row(png_ptr, *rp, png_bytep_NULL); - rp++; - } - } -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* Read the end of the PNG file. Will not read past the end of the - * file, will verify the end is accurate, and will read any comments - * or time information at the end of the file, if info is not NULL. - */ -void PNGAPI -png_read_end(png_structp png_ptr, png_infop info_ptr) -{ - png_byte chunk_length[4]; - png_uint_32 length; - - png_debug(1, "in png_read_end\n"); - png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ - - do - { -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IHDR; - PNG_IDAT; - PNG_IEND; - PNG_PLTE; -#if defined(PNG_READ_bKGD_SUPPORTED) - PNG_bKGD; -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - PNG_cHRM; -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - PNG_gAMA; -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - PNG_hIST; -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - PNG_iCCP; -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - PNG_iTXt; -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - PNG_oFFs; -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - PNG_pCAL; -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - PNG_pHYs; -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - PNG_sBIT; -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - PNG_sCAL; -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - PNG_sPLT; -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - PNG_sRGB; -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - PNG_tEXt; -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - PNG_tIME; -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - PNG_tRNS; -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - PNG_zTXt; -#endif -#endif /* PNG_USE_LOCAL_ARRAYS */ - - png_read_data(png_ptr, chunk_length, 4); - length = png_get_uint_31(png_ptr,chunk_length); - - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - - png_debug1(0, "Reading %s chunk.\n", png_ptr->chunk_name); - - if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) - png_handle_IHDR(png_ptr, info_ptr, length); - else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) - png_handle_IEND(png_ptr, info_ptr, length); -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) - { - if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - if (length > 0 || png_ptr->mode & PNG_AFTER_IDAT) - png_error(png_ptr, "Too many IDAT's found"); - } - else - png_ptr->mode |= PNG_AFTER_IDAT; - png_handle_unknown(png_ptr, info_ptr, length); - if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_ptr->mode |= PNG_HAVE_PLTE; - } -#endif - else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - /* Zero length IDATs are legal after the last IDAT has been - * read, but not after other chunks have been read. - */ - if (length > 0 || png_ptr->mode & PNG_AFTER_IDAT) - png_error(png_ptr, "Too many IDAT's found"); - png_crc_finish(png_ptr, length); - } - else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_handle_PLTE(png_ptr, info_ptr, length); -#if defined(PNG_READ_bKGD_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) - png_handle_bKGD(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) - png_handle_cHRM(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) - png_handle_gAMA(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) - png_handle_hIST(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) - png_handle_oFFs(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) - png_handle_pCAL(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) - png_handle_sCAL(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) - png_handle_pHYs(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) - png_handle_sBIT(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) - png_handle_sRGB(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) - png_handle_iCCP(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) - png_handle_sPLT(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) - png_handle_tEXt(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) - png_handle_tIME(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) - png_handle_tRNS(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) - png_handle_zTXt(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) - png_handle_iTXt(png_ptr, info_ptr, length); -#endif - else - png_handle_unknown(png_ptr, info_ptr, length); - } while (!(png_ptr->mode & PNG_HAVE_IEND)); -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -/* free all memory used by the read */ -void PNGAPI -png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, - png_infopp end_info_ptr_ptr) -{ - png_structp png_ptr = NULL; - png_infop info_ptr = NULL, end_info_ptr = NULL; -#ifdef PNG_USER_MEM_SUPPORTED - png_free_ptr free_fn; - png_voidp mem_ptr; -#endif - - png_debug(1, "in png_destroy_read_struct\n"); - if (png_ptr_ptr != NULL) - png_ptr = *png_ptr_ptr; - - if (info_ptr_ptr != NULL) - info_ptr = *info_ptr_ptr; - - if (end_info_ptr_ptr != NULL) - end_info_ptr = *end_info_ptr_ptr; - -#ifdef PNG_USER_MEM_SUPPORTED - free_fn = png_ptr->free_fn; - mem_ptr = png_ptr->mem_ptr; -#endif - - png_read_destroy(png_ptr, info_ptr, end_info_ptr); - - if (info_ptr != NULL) - { -#if defined(PNG_TEXT_SUPPORTED) - png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1); -#endif - -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)info_ptr); -#endif - *info_ptr_ptr = NULL; - } - - if (end_info_ptr != NULL) - { -#if defined(PNG_READ_TEXT_SUPPORTED) - png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1); -#endif -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)end_info_ptr); -#endif - *end_info_ptr_ptr = NULL; - } - - if (png_ptr != NULL) - { -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)png_ptr); -#endif - *png_ptr_ptr = NULL; - } -} - -/* free all memory used by the read (old method) */ -void /* PRIVATE */ -png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr) -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf tmp_jmp; -#endif - png_error_ptr error_fn; - png_error_ptr warning_fn; - png_voidp error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - png_free_ptr free_fn; -#endif - - png_debug(1, "in png_read_destroy\n"); - if (info_ptr != NULL) - png_info_destroy(png_ptr, info_ptr); - - if (end_info_ptr != NULL) - png_info_destroy(png_ptr, end_info_ptr); - - png_free(png_ptr, png_ptr->zbuf); - png_free(png_ptr, png_ptr->big_row_buf); - png_free(png_ptr, png_ptr->prev_row); -#if defined(PNG_READ_DITHER_SUPPORTED) - png_free(png_ptr, png_ptr->palette_lookup); - png_free(png_ptr, png_ptr->dither_index); -#endif -#if defined(PNG_READ_GAMMA_SUPPORTED) - png_free(png_ptr, png_ptr->gamma_table); -#endif -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - png_free(png_ptr, png_ptr->gamma_from_1); - png_free(png_ptr, png_ptr->gamma_to_1); -#endif -#ifdef PNG_FREE_ME_SUPPORTED - if (png_ptr->free_me & PNG_FREE_PLTE) - png_zfree(png_ptr, png_ptr->palette); - png_ptr->free_me &= ~PNG_FREE_PLTE; -#else - if (png_ptr->flags & PNG_FLAG_FREE_PLTE) - png_zfree(png_ptr, png_ptr->palette); - png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; -#endif -#if defined(PNG_tRNS_SUPPORTED) || \ - defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) -#ifdef PNG_FREE_ME_SUPPORTED - if (png_ptr->free_me & PNG_FREE_TRNS) - png_free(png_ptr, png_ptr->trans); - png_ptr->free_me &= ~PNG_FREE_TRNS; -#else - if (png_ptr->flags & PNG_FLAG_FREE_TRNS) - png_free(png_ptr, png_ptr->trans); - png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; -#endif -#endif -#if defined(PNG_READ_hIST_SUPPORTED) -#ifdef PNG_FREE_ME_SUPPORTED - if (png_ptr->free_me & PNG_FREE_HIST) - png_free(png_ptr, png_ptr->hist); - png_ptr->free_me &= ~PNG_FREE_HIST; -#else - if (png_ptr->flags & PNG_FLAG_FREE_HIST) - png_free(png_ptr, png_ptr->hist); - png_ptr->flags &= ~PNG_FLAG_FREE_HIST; -#endif -#endif -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (png_ptr->gamma_16_table != NULL) - { - int i; - int istop = (1 << (8 - png_ptr->gamma_shift)); - for (i = 0; i < istop; i++) - { - png_free(png_ptr, png_ptr->gamma_16_table[i]); - } - png_free(png_ptr, png_ptr->gamma_16_table); - } -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->gamma_16_from_1 != NULL) - { - int i; - int istop = (1 << (8 - png_ptr->gamma_shift)); - for (i = 0; i < istop; i++) - { - png_free(png_ptr, png_ptr->gamma_16_from_1[i]); - } - png_free(png_ptr, png_ptr->gamma_16_from_1); - } - if (png_ptr->gamma_16_to_1 != NULL) - { - int i; - int istop = (1 << (8 - png_ptr->gamma_shift)); - for (i = 0; i < istop; i++) - { - png_free(png_ptr, png_ptr->gamma_16_to_1[i]); - } - png_free(png_ptr, png_ptr->gamma_16_to_1); - } -#endif -#endif -#if defined(PNG_TIME_RFC1123_SUPPORTED) - png_free(png_ptr, png_ptr->time_buffer); -#endif - - inflateEnd(&png_ptr->zstream); -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - png_free(png_ptr, png_ptr->save_buffer); -#endif - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -#ifdef PNG_TEXT_SUPPORTED - png_free(png_ptr, png_ptr->current_text); -#endif /* PNG_TEXT_SUPPORTED */ -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - - /* Save the important info out of the png_struct, in case it is - * being used again. - */ -#ifdef PNG_SETJMP_SUPPORTED - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); -#endif - - error_fn = png_ptr->error_fn; - warning_fn = png_ptr->warning_fn; - error_ptr = png_ptr->error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - free_fn = png_ptr->free_fn; -#endif - - png_memset(png_ptr, 0, png_sizeof (png_struct)); - - png_ptr->error_fn = error_fn; - png_ptr->warning_fn = warning_fn; - png_ptr->error_ptr = error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - png_ptr->free_fn = free_fn; -#endif - -#ifdef PNG_SETJMP_SUPPORTED - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); -#endif - -} - -void PNGAPI -png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) -{ - png_ptr->read_row_fn = read_row_fn; -} - - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -#if defined(PNG_INFO_IMAGE_SUPPORTED) -void PNGAPI -png_read_png(png_structp png_ptr, png_infop info_ptr, - int transforms, - voidp params) -{ - int row; - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) - /* invert the alpha channel from opacity to transparency - */ - if (transforms & PNG_TRANSFORM_INVERT_ALPHA) - png_set_invert_alpha(png_ptr); -#endif - - /* png_read_info() gives us all of the information from the - * PNG file before the first IDAT (image data chunk). - */ - png_read_info(png_ptr, info_ptr); - if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep)) - png_error(png_ptr,"Image is too high to process with png_read_png()"); - - /* -------------- image transformations start here ------------------- */ - -#if defined(PNG_READ_16_TO_8_SUPPORTED) - /* tell libpng to strip 16 bit/color files down to 8 bits per color - */ - if (transforms & PNG_TRANSFORM_STRIP_16) - png_set_strip_16(png_ptr); -#endif - -#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) - /* Strip alpha bytes from the input data without combining with - * the background (not recommended). - */ - if (transforms & PNG_TRANSFORM_STRIP_ALPHA) - png_set_strip_alpha(png_ptr); -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED) - /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single - * byte into separate bytes (useful for paletted and grayscale images). - */ - if (transforms & PNG_TRANSFORM_PACKING) - png_set_packing(png_ptr); -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - /* Change the order of packed pixels to least significant bit first - * (not useful if you are using png_set_packing). - */ - if (transforms & PNG_TRANSFORM_PACKSWAP) - png_set_packswap(png_ptr); -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) - /* Expand paletted colors into true RGB triplets - * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel - * Expand paletted or RGB images with transparency to full alpha - * channels so the data will be available as RGBA quartets. - */ - if (transforms & PNG_TRANSFORM_EXPAND) - if ((png_ptr->bit_depth < 8) || - (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || - (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) - png_set_expand(png_ptr); -#endif - - /* We don't handle background color or gamma transformation or dithering. - */ - -#if defined(PNG_READ_INVERT_SUPPORTED) - /* invert monochrome files to have 0 as white and 1 as black - */ - if (transforms & PNG_TRANSFORM_INVERT_MONO) - png_set_invert_mono(png_ptr); -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) - /* If you want to shift the pixel values from the range [0,255] or - * [0,65535] to the original [0,7] or [0,31], or whatever range the - * colors were originally in: - */ - if ((transforms & PNG_TRANSFORM_SHIFT) - && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) - { - png_color_8p sig_bit; - - png_get_sBIT(png_ptr, info_ptr, &sig_bit); - png_set_shift(png_ptr, sig_bit); - } -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) - /* flip the RGB pixels to BGR (or RGBA to BGRA) - */ - if (transforms & PNG_TRANSFORM_BGR) - png_set_bgr(png_ptr); -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) - /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) - */ - if (transforms & PNG_TRANSFORM_SWAP_ALPHA) - png_set_swap_alpha(png_ptr); -#endif - -#if defined(PNG_READ_SWAP_SUPPORTED) - /* swap bytes of 16 bit files to least significant byte first - */ - if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) - png_set_swap(png_ptr); -#endif - - /* We don't handle adding filler bytes */ - - /* Optional call to gamma correct and add the background to the palette - * and update info structure. REQUIRED if you are expecting libpng to - * update the palette for you (i.e., you selected such a transform above). - */ - png_read_update_info(png_ptr, info_ptr); - - /* -------------- image transformations end here ------------------- */ - -#ifdef PNG_FREE_ME_SUPPORTED - png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); -#endif - if(info_ptr->row_pointers == NULL) - { - info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, - info_ptr->height * png_sizeof(png_bytep)); -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_ROWS; -#endif - for (row = 0; row < (int)info_ptr->height; row++) - { - info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr, - png_get_rowbytes(png_ptr, info_ptr)); - } - } - - png_read_image(png_ptr, info_ptr->row_pointers); - info_ptr->valid |= PNG_INFO_IDAT; - - /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ - png_read_end(png_ptr, info_ptr); - - if(transforms == 0 || params == NULL) - /* quiet compiler warnings */ return; - -} -#endif -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ diff --git a/src/SFML/Graphics/libpng/pngrio.c b/src/SFML/Graphics/libpng/pngrio.c deleted file mode 100644 index 241fcdce..00000000 --- a/src/SFML/Graphics/libpng/pngrio.c +++ /dev/null @@ -1,161 +0,0 @@ - -/* pngrio.c - functions for data input - * - * libpng 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This file provides a location for all input. Users who need - * special handling are expected to write a function that has the same - * arguments as this and performs a similar function, but that possibly - * has a different input method. Note that you shouldn't change this - * function, but rather write a replacement function and then make - * libpng use it at run time with png_set_read_fn(...). - */ - -#define PNG_INTERNAL -#include "png.h" - -/* Read the data from whatever input you are using. The default routine - reads from a file pointer. Note that this routine sometimes gets called - with very small lengths, so you should implement some kind of simple - buffering if you are using unbuffered reads. This should never be asked - to read more then 64K on a 16 bit machine. */ -void /* PRIVATE */ -png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_debug1(4,"reading %d bytes\n", (int)length); - if (png_ptr->read_data_fn != NULL) - (*(png_ptr->read_data_fn))(png_ptr, data, length); - else - png_error(png_ptr, "Call to NULL read function"); -} - -#if !defined(PNG_NO_STDIO) -/* This is the function that does the actual reading of data. If you are - not reading from a standard C stream, you should create a replacement - read_data function and use it at run time with png_set_read_fn(), rather - than changing the library. */ -#ifndef USE_FAR_KEYWORD -void PNGAPI -png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_size_t check; - - /* fread() returns 0 on error, so it is OK to store this in a png_size_t - * instead of an int, which is what fread() actually returns. - */ -#if defined(_WIN32_WCE) - if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) - check = 0; -#else - check = (png_size_t)fread(data, (png_size_t)1, length, - (png_FILE_p)png_ptr->io_ptr); -#endif - - if (check != length) - png_error(png_ptr, "Read Error"); -} -#else -/* this is the model-independent version. Since the standard I/O library - can't handle far buffers in the medium and small models, we have to copy - the data. -*/ - -#define NEAR_BUF_SIZE 1024 -#define MIN(a,b) (a <= b ? a : b) - -static void /* PRIVATE */ -png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - int check; - png_byte *n_data; - png_FILE_p io_ptr; - - /* Check if data really is near. If so, use usual code. */ - n_data = (png_byte *)CVT_PTR_NOCHECK(data); - io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); - if ((png_bytep)n_data == data) - { -#if defined(_WIN32_WCE) - if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) - check = 0; -#else - check = fread(n_data, 1, length, io_ptr); -#endif - } - else - { - png_byte buf[NEAR_BUF_SIZE]; - png_size_t read, remaining, err; - check = 0; - remaining = length; - do - { - read = MIN(NEAR_BUF_SIZE, remaining); -#if defined(_WIN32_WCE) - if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) ) - err = 0; -#else - err = fread(buf, (png_size_t)1, read, io_ptr); -#endif - png_memcpy(data, buf, read); /* copy far buffer to near buffer */ - if(err != read) - break; - else - check += err; - data += read; - remaining -= read; - } - while (remaining != 0); - } - if ((png_uint_32)check != (png_uint_32)length) - png_error(png_ptr, "read Error"); -} -#endif -#endif - -/* This function allows the application to supply a new input function - for libpng if standard C streams aren't being used. - - This function takes as its arguments: - png_ptr - pointer to a png input data structure - io_ptr - pointer to user supplied structure containing info about - the input functions. May be NULL. - read_data_fn - pointer to a new input function that takes as its - arguments a pointer to a png_struct, a pointer to - a location where input data can be stored, and a 32-bit - unsigned int that is the number of bytes to be read. - To exit and output any fatal error messages the new write - function should call png_error(png_ptr, "Error msg"). */ -void PNGAPI -png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, - png_rw_ptr read_data_fn) -{ - png_ptr->io_ptr = io_ptr; - -#if !defined(PNG_NO_STDIO) - if (read_data_fn != NULL) - png_ptr->read_data_fn = read_data_fn; - else - png_ptr->read_data_fn = png_default_read_data; -#else - png_ptr->read_data_fn = read_data_fn; -#endif - - /* It is an error to write to a read device */ - if (png_ptr->write_data_fn != NULL) - { - png_ptr->write_data_fn = NULL; - png_warning(png_ptr, - "It's an error to set both read_data_fn and write_data_fn in the "); - png_warning(png_ptr, - "same structure. Resetting write_data_fn to NULL."); - } - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) - png_ptr->output_flush_fn = NULL; -#endif -} diff --git a/src/SFML/Graphics/libpng/pngrtran.c b/src/SFML/Graphics/libpng/pngrtran.c deleted file mode 100644 index 2f0f31af..00000000 --- a/src/SFML/Graphics/libpng/pngrtran.c +++ /dev/null @@ -1,4177 +0,0 @@ - -/* pngrtran.c - transforms the data in a row for PNG readers - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This file contains functions optionally called by an application - * in order to tell libpng how to handle data when reading a PNG. - * Transformations that are used in both reading and writing are - * in pngtrans.c. - */ - -#define PNG_INTERNAL -#include "png.h" - -/* Set the action on getting a CRC error for an ancillary or critical chunk. */ -void PNGAPI -png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action) -{ - png_debug(1, "in png_set_crc_action\n"); - /* Tell libpng how we react to CRC errors in critical chunks */ - switch (crit_action) - { - case PNG_CRC_NO_CHANGE: /* leave setting as is */ - break; - case PNG_CRC_WARN_USE: /* warn/use data */ - png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; - png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE; - break; - case PNG_CRC_QUIET_USE: /* quiet/use data */ - png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; - png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE | - PNG_FLAG_CRC_CRITICAL_IGNORE; - break; - case PNG_CRC_WARN_DISCARD: /* not a valid action for critical data */ - png_warning(png_ptr, "Can't discard critical data on CRC error."); - case PNG_CRC_ERROR_QUIT: /* error/quit */ - case PNG_CRC_DEFAULT: - default: - png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; - break; - } - - switch (ancil_action) - { - case PNG_CRC_NO_CHANGE: /* leave setting as is */ - break; - case PNG_CRC_WARN_USE: /* warn/use data */ - png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; - png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE; - break; - case PNG_CRC_QUIET_USE: /* quiet/use data */ - png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; - png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE | - PNG_FLAG_CRC_ANCILLARY_NOWARN; - break; - case PNG_CRC_ERROR_QUIT: /* error/quit */ - png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; - png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN; - break; - case PNG_CRC_WARN_DISCARD: /* warn/discard data */ - case PNG_CRC_DEFAULT: - default: - png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; - break; - } -} - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ - defined(PNG_FLOATING_POINT_SUPPORTED) -/* handle alpha and tRNS via a background color */ -void PNGAPI -png_set_background(png_structp png_ptr, - png_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma) -{ - png_debug(1, "in png_set_background\n"); - if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN) - { - png_warning(png_ptr, "Application must supply a known background gamma"); - return; - } - - png_ptr->transformations |= PNG_BACKGROUND; - png_memcpy(&(png_ptr->background), background_color, - png_sizeof(png_color_16)); - png_ptr->background_gamma = (float)background_gamma; - png_ptr->background_gamma_type = (png_byte)(background_gamma_code); - png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0); - - /* Note: if need_expand is set and color_type is either RGB or RGB_ALPHA - * (in which case need_expand is superfluous anyway), the background color - * might actually be gray yet not be flagged as such. This is not a problem - * for the current code, which uses PNG_BACKGROUND_IS_GRAY only to - * decide when to do the png_do_gray_to_rgb() transformation. - */ - if ((need_expand && !(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) || - (!need_expand && background_color->red == background_color->green && - background_color->red == background_color->blue)) - png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; -} -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) -/* strip 16 bit depth files to 8 bit depth */ -void PNGAPI -png_set_strip_16(png_structp png_ptr) -{ - png_debug(1, "in png_set_strip_16\n"); - png_ptr->transformations |= PNG_16_TO_8; -} -#endif - -#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -void PNGAPI -png_set_strip_alpha(png_structp png_ptr) -{ - png_debug(1, "in png_set_strip_alpha\n"); - png_ptr->flags |= PNG_FLAG_STRIP_ALPHA; -} -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) -/* Dither file to 8 bit. Supply a palette, the current number - * of elements in the palette, the maximum number of elements - * allowed, and a histogram if possible. If the current number - * of colors is greater then the maximum number, the palette will be - * modified to fit in the maximum number. "full_dither" indicates - * whether we need a dithering cube set up for RGB images, or if we - * simply are reducing the number of colors in a paletted image. - */ - -typedef struct png_dsort_struct -{ - struct png_dsort_struct FAR * next; - png_byte left; - png_byte right; -} png_dsort; -typedef png_dsort FAR * png_dsortp; -typedef png_dsort FAR * FAR * png_dsortpp; - -void PNGAPI -png_set_dither(png_structp png_ptr, png_colorp palette, - int num_palette, int maximum_colors, png_uint_16p histogram, - int full_dither) -{ - png_debug(1, "in png_set_dither\n"); - png_ptr->transformations |= PNG_DITHER; - - if (!full_dither) - { - int i; - - png_ptr->dither_index = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof (png_byte))); - for (i = 0; i < num_palette; i++) - png_ptr->dither_index[i] = (png_byte)i; - } - - if (num_palette > maximum_colors) - { - if (histogram != NULL) - { - /* This is easy enough, just throw out the least used colors. - Perhaps not the best solution, but good enough. */ - - int i; - - /* initialize an array to sort colors */ - png_ptr->dither_sort = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof (png_byte))); - - /* initialize the dither_sort array */ - for (i = 0; i < num_palette; i++) - png_ptr->dither_sort[i] = (png_byte)i; - - /* Find the least used palette entries by starting a - bubble sort, and running it until we have sorted - out enough colors. Note that we don't care about - sorting all the colors, just finding which are - least used. */ - - for (i = num_palette - 1; i >= maximum_colors; i--) - { - int done; /* to stop early if the list is pre-sorted */ - int j; - - done = 1; - for (j = 0; j < i; j++) - { - if (histogram[png_ptr->dither_sort[j]] - < histogram[png_ptr->dither_sort[j + 1]]) - { - png_byte t; - - t = png_ptr->dither_sort[j]; - png_ptr->dither_sort[j] = png_ptr->dither_sort[j + 1]; - png_ptr->dither_sort[j + 1] = t; - done = 0; - } - } - if (done) - break; - } - - /* swap the palette around, and set up a table, if necessary */ - if (full_dither) - { - int j = num_palette; - - /* put all the useful colors within the max, but don't - move the others */ - for (i = 0; i < maximum_colors; i++) - { - if ((int)png_ptr->dither_sort[i] >= maximum_colors) - { - do - j--; - while ((int)png_ptr->dither_sort[j] >= maximum_colors); - palette[i] = palette[j]; - } - } - } - else - { - int j = num_palette; - - /* move all the used colors inside the max limit, and - develop a translation table */ - for (i = 0; i < maximum_colors; i++) - { - /* only move the colors we need to */ - if ((int)png_ptr->dither_sort[i] >= maximum_colors) - { - png_color tmp_color; - - do - j--; - while ((int)png_ptr->dither_sort[j] >= maximum_colors); - - tmp_color = palette[j]; - palette[j] = palette[i]; - palette[i] = tmp_color; - /* indicate where the color went */ - png_ptr->dither_index[j] = (png_byte)i; - png_ptr->dither_index[i] = (png_byte)j; - } - } - - /* find closest color for those colors we are not using */ - for (i = 0; i < num_palette; i++) - { - if ((int)png_ptr->dither_index[i] >= maximum_colors) - { - int min_d, k, min_k, d_index; - - /* find the closest color to one we threw out */ - d_index = png_ptr->dither_index[i]; - min_d = PNG_COLOR_DIST(palette[d_index], palette[0]); - for (k = 1, min_k = 0; k < maximum_colors; k++) - { - int d; - - d = PNG_COLOR_DIST(palette[d_index], palette[k]); - - if (d < min_d) - { - min_d = d; - min_k = k; - } - } - /* point to closest color */ - png_ptr->dither_index[i] = (png_byte)min_k; - } - } - } - png_free(png_ptr, png_ptr->dither_sort); - png_ptr->dither_sort=NULL; - } - else - { - /* This is much harder to do simply (and quickly). Perhaps - we need to go through a median cut routine, but those - don't always behave themselves with only a few colors - as input. So we will just find the closest two colors, - and throw out one of them (chosen somewhat randomly). - [We don't understand this at all, so if someone wants to - work on improving it, be our guest - AED, GRP] - */ - int i; - int max_d; - int num_new_palette; - png_dsortp t; - png_dsortpp hash; - - t=NULL; - - /* initialize palette index arrays */ - png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof (png_byte))); - png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof (png_byte))); - - /* initialize the sort array */ - for (i = 0; i < num_palette; i++) - { - png_ptr->index_to_palette[i] = (png_byte)i; - png_ptr->palette_to_index[i] = (png_byte)i; - } - - hash = (png_dsortpp)png_malloc(png_ptr, (png_uint_32)(769 * - png_sizeof (png_dsortp))); - for (i = 0; i < 769; i++) - hash[i] = NULL; -/* png_memset(hash, 0, 769 * png_sizeof (png_dsortp)); */ - - num_new_palette = num_palette; - - /* initial wild guess at how far apart the farthest pixel - pair we will be eliminating will be. Larger - numbers mean more areas will be allocated, Smaller - numbers run the risk of not saving enough data, and - having to do this all over again. - - I have not done extensive checking on this number. - */ - max_d = 96; - - while (num_new_palette > maximum_colors) - { - for (i = 0; i < num_new_palette - 1; i++) - { - int j; - - for (j = i + 1; j < num_new_palette; j++) - { - int d; - - d = PNG_COLOR_DIST(palette[i], palette[j]); - - if (d <= max_d) - { - - t = (png_dsortp)png_malloc_warn(png_ptr, - (png_uint_32)(png_sizeof(png_dsort))); - if (t == NULL) - break; - t->next = hash[d]; - t->left = (png_byte)i; - t->right = (png_byte)j; - hash[d] = t; - } - } - if (t == NULL) - break; - } - - if (t != NULL) - for (i = 0; i <= max_d; i++) - { - if (hash[i] != NULL) - { - png_dsortp p; - - for (p = hash[i]; p; p = p->next) - { - if ((int)png_ptr->index_to_palette[p->left] - < num_new_palette && - (int)png_ptr->index_to_palette[p->right] - < num_new_palette) - { - int j, next_j; - - if (num_new_palette & 0x01) - { - j = p->left; - next_j = p->right; - } - else - { - j = p->right; - next_j = p->left; - } - - num_new_palette--; - palette[png_ptr->index_to_palette[j]] - = palette[num_new_palette]; - if (!full_dither) - { - int k; - - for (k = 0; k < num_palette; k++) - { - if (png_ptr->dither_index[k] == - png_ptr->index_to_palette[j]) - png_ptr->dither_index[k] = - png_ptr->index_to_palette[next_j]; - if ((int)png_ptr->dither_index[k] == - num_new_palette) - png_ptr->dither_index[k] = - png_ptr->index_to_palette[j]; - } - } - - png_ptr->index_to_palette[png_ptr->palette_to_index - [num_new_palette]] = png_ptr->index_to_palette[j]; - png_ptr->palette_to_index[png_ptr->index_to_palette[j]] - = png_ptr->palette_to_index[num_new_palette]; - - png_ptr->index_to_palette[j] = (png_byte)num_new_palette; - png_ptr->palette_to_index[num_new_palette] = (png_byte)j; - } - if (num_new_palette <= maximum_colors) - break; - } - if (num_new_palette <= maximum_colors) - break; - } - } - - for (i = 0; i < 769; i++) - { - if (hash[i] != NULL) - { - png_dsortp p = hash[i]; - while (p) - { - t = p->next; - png_free(png_ptr, p); - p = t; - } - } - hash[i] = 0; - } - max_d += 96; - } - png_free(png_ptr, hash); - png_free(png_ptr, png_ptr->palette_to_index); - png_free(png_ptr, png_ptr->index_to_palette); - png_ptr->palette_to_index=NULL; - png_ptr->index_to_palette=NULL; - } - num_palette = maximum_colors; - } - if (png_ptr->palette == NULL) - { - png_ptr->palette = palette; - } - png_ptr->num_palette = (png_uint_16)num_palette; - - if (full_dither) - { - int i; - png_bytep distance; - int total_bits = PNG_DITHER_RED_BITS + PNG_DITHER_GREEN_BITS + - PNG_DITHER_BLUE_BITS; - int num_red = (1 << PNG_DITHER_RED_BITS); - int num_green = (1 << PNG_DITHER_GREEN_BITS); - int num_blue = (1 << PNG_DITHER_BLUE_BITS); - png_size_t num_entries = ((png_size_t)1 << total_bits); - - png_ptr->palette_lookup = (png_bytep )png_malloc(png_ptr, - (png_uint_32)(num_entries * png_sizeof (png_byte))); - - png_memset(png_ptr->palette_lookup, 0, num_entries * - png_sizeof (png_byte)); - - distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries * - png_sizeof(png_byte))); - - png_memset(distance, 0xff, num_entries * png_sizeof(png_byte)); - - for (i = 0; i < num_palette; i++) - { - int ir, ig, ib; - int r = (palette[i].red >> (8 - PNG_DITHER_RED_BITS)); - int g = (palette[i].green >> (8 - PNG_DITHER_GREEN_BITS)); - int b = (palette[i].blue >> (8 - PNG_DITHER_BLUE_BITS)); - - for (ir = 0; ir < num_red; ir++) - { - /* int dr = abs(ir - r); */ - int dr = ((ir > r) ? ir - r : r - ir); - int index_r = (ir << (PNG_DITHER_BLUE_BITS + PNG_DITHER_GREEN_BITS)); - - for (ig = 0; ig < num_green; ig++) - { - /* int dg = abs(ig - g); */ - int dg = ((ig > g) ? ig - g : g - ig); - int dt = dr + dg; - int dm = ((dr > dg) ? dr : dg); - int index_g = index_r | (ig << PNG_DITHER_BLUE_BITS); - - for (ib = 0; ib < num_blue; ib++) - { - int d_index = index_g | ib; - /* int db = abs(ib - b); */ - int db = ((ib > b) ? ib - b : b - ib); - int dmax = ((dm > db) ? dm : db); - int d = dmax + dt + db; - - if (d < (int)distance[d_index]) - { - distance[d_index] = (png_byte)d; - png_ptr->palette_lookup[d_index] = (png_byte)i; - } - } - } - } - } - - png_free(png_ptr, distance); - } -} -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) -/* Transform the image from the file_gamma to the screen_gamma. We - * only do transformations on images where the file_gamma and screen_gamma - * are not close reciprocals, otherwise it slows things down slightly, and - * also needlessly introduces small errors. - * - * We will turn off gamma transformation later if no semitransparent entries - * are present in the tRNS array for palette images. We can't do it here - * because we don't necessarily have the tRNS chunk yet. - */ -void PNGAPI -png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma) -{ - png_debug(1, "in png_set_gamma\n"); - if ((fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) || - (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) - png_ptr->transformations |= PNG_GAMMA; - png_ptr->gamma = (float)file_gamma; - png_ptr->screen_gamma = (float)scrn_gamma; -} -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) -/* Expand paletted images to RGB, expand grayscale images of - * less than 8-bit depth to 8-bit depth, and expand tRNS chunks - * to alpha channels. - */ -void PNGAPI -png_set_expand(png_structp png_ptr) -{ - png_debug(1, "in png_set_expand\n"); - png_ptr->transformations |= PNG_EXPAND; -} - -/* GRR 19990627: the following three functions currently are identical - * to png_set_expand(). However, it is entirely reasonable that someone - * might wish to expand an indexed image to RGB but *not* expand a single, - * fully transparent palette entry to a full alpha channel--perhaps instead - * convert tRNS to the grayscale/RGB format (16-bit RGB value), or replace - * the transparent color with a particular RGB value, or drop tRNS entirely. - * IOW, a future version of the library may make the transformations flag - * a bit more fine-grained, with separate bits for each of these three - * functions. - * - * More to the point, these functions make it obvious what libpng will be - * doing, whereas "expand" can (and does) mean any number of things. - */ - -/* Expand paletted images to RGB. */ -void PNGAPI -png_set_palette_to_rgb(png_structp png_ptr) -{ - png_debug(1, "in png_set_expand\n"); - png_ptr->transformations |= PNG_EXPAND; -} - -/* Expand grayscale images of less than 8-bit depth to 8 bits. */ -void PNGAPI -png_set_gray_1_2_4_to_8(png_structp png_ptr) -{ - png_debug(1, "in png_set_expand\n"); - png_ptr->transformations |= PNG_EXPAND; -} - -/* Expand tRNS chunks to alpha channels. */ -void PNGAPI -png_set_tRNS_to_alpha(png_structp png_ptr) -{ - png_debug(1, "in png_set_expand\n"); - png_ptr->transformations |= PNG_EXPAND; -} -#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -void PNGAPI -png_set_gray_to_rgb(png_structp png_ptr) -{ - png_debug(1, "in png_set_gray_to_rgb\n"); - png_ptr->transformations |= PNG_GRAY_TO_RGB; -} -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -#if defined(PNG_FLOATING_POINT_SUPPORTED) -/* Convert a RGB image to a grayscale of the same width. This allows us, - * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image. - */ - -void PNGAPI -png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red, - double green) -{ - int red_fixed = (int)((float)red*100000.0 + 0.5); - int green_fixed = (int)((float)green*100000.0 + 0.5); - png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed); -} -#endif - -void PNGAPI -png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, - png_fixed_point red, png_fixed_point green) -{ - png_debug(1, "in png_set_rgb_to_gray\n"); - switch(error_action) - { - case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY; - break; - case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN; - break; - case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR; - } - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) -#if defined(PNG_READ_EXPAND_SUPPORTED) - png_ptr->transformations |= PNG_EXPAND; -#else - { - png_warning(png_ptr, "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED."); - png_ptr->transformations &= ~PNG_RGB_TO_GRAY; - } -#endif - { - png_uint_16 red_int, green_int; - if(red < 0 || green < 0) - { - red_int = 6968; /* .212671 * 32768 + .5 */ - green_int = 23434; /* .715160 * 32768 + .5 */ - } - else if(red + green < 100000L) - { - red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L); - green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L); - } - else - { - png_warning(png_ptr, "ignoring out of range rgb_to_gray coefficients"); - red_int = 6968; - green_int = 23434; - } - png_ptr->rgb_to_gray_red_coeff = red_int; - png_ptr->rgb_to_gray_green_coeff = green_int; - png_ptr->rgb_to_gray_blue_coeff = (png_uint_16)(32768-red_int-green_int); - } -} -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -void PNGAPI -png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr - read_user_transform_fn) -{ - png_debug(1, "in png_set_read_user_transform_fn\n"); -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) - png_ptr->transformations |= PNG_USER_TRANSFORM; - png_ptr->read_user_transform_fn = read_user_transform_fn; -#endif -#ifdef PNG_LEGACY_SUPPORTED - if(read_user_transform_fn) - png_warning(png_ptr, - "This version of libpng does not support user transforms"); -#endif -} -#endif - -/* Initialize everything needed for the read. This includes modifying - * the palette. - */ -void /* PRIVATE */ -png_init_read_transformations(png_structp png_ptr) -{ - png_debug(1, "in png_init_read_transformations\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if(png_ptr != NULL) -#endif - { -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || defined(PNG_READ_SHIFT_SUPPORTED) \ - || defined(PNG_READ_GAMMA_SUPPORTED) - int color_type = png_ptr->color_type; -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED) - if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - (png_ptr->transformations & PNG_EXPAND)) - { - if (!(color_type & PNG_COLOR_MASK_COLOR)) /* i.e., GRAY or GRAY_ALPHA */ - { - /* expand background chunk. */ - switch (png_ptr->bit_depth) - { - case 1: - png_ptr->background.gray *= (png_uint_16)0xff; - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - break; - case 2: - png_ptr->background.gray *= (png_uint_16)0x55; - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - break; - case 4: - png_ptr->background.gray *= (png_uint_16)0x11; - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - break; - case 8: - case 16: - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - break; - } - } - else if (color_type == PNG_COLOR_TYPE_PALETTE) - { - png_ptr->background.red = - png_ptr->palette[png_ptr->background.index].red; - png_ptr->background.green = - png_ptr->palette[png_ptr->background.index].green; - png_ptr->background.blue = - png_ptr->palette[png_ptr->background.index].blue; - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_ALPHA) - { -#if defined(PNG_READ_EXPAND_SUPPORTED) - if (!(png_ptr->transformations & PNG_EXPAND)) -#endif - { - /* invert the alpha channel (in tRNS) unless the pixels are - going to be expanded, in which case leave it for later */ - int i,istop; - istop=(int)png_ptr->num_trans; - for (i=0; itrans[i] = (png_byte)(255 - png_ptr->trans[i]); - } - } -#endif - - } - } -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) - png_ptr->background_1 = png_ptr->background; -#endif -#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) - - if ((color_type == PNG_COLOR_TYPE_PALETTE && png_ptr->num_trans != 0) - && (fabs(png_ptr->screen_gamma * png_ptr->gamma - 1.0) - < PNG_GAMMA_THRESHOLD)) - { - int i,k; - k=0; - for (i=0; inum_trans; i++) - { - if (png_ptr->trans[i] != 0 && png_ptr->trans[i] != 0xff) - k=1; /* partial transparency is present */ - } - if (k == 0) - png_ptr->transformations &= (~PNG_GAMMA); - } - - if (png_ptr->transformations & (PNG_GAMMA | PNG_RGB_TO_GRAY)) - { - png_build_gamma_table(png_ptr); -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->transformations & PNG_BACKGROUND) - { - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - /* could skip if no transparency and - */ - png_color back, back_1; - png_colorp palette = png_ptr->palette; - int num_palette = png_ptr->num_palette; - int i; - if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) - { - back.red = png_ptr->gamma_table[png_ptr->background.red]; - back.green = png_ptr->gamma_table[png_ptr->background.green]; - back.blue = png_ptr->gamma_table[png_ptr->background.blue]; - - back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; - back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; - back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; - } - else - { - double g, gs; - - switch (png_ptr->background_gamma_type) - { - case PNG_BACKGROUND_GAMMA_SCREEN: - g = (png_ptr->screen_gamma); - gs = 1.0; - break; - case PNG_BACKGROUND_GAMMA_FILE: - g = 1.0 / (png_ptr->gamma); - gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - break; - case PNG_BACKGROUND_GAMMA_UNIQUE: - g = 1.0 / (png_ptr->background_gamma); - gs = 1.0 / (png_ptr->background_gamma * - png_ptr->screen_gamma); - break; - default: - g = 1.0; /* back_1 */ - gs = 1.0; /* back */ - } - - if ( fabs(gs - 1.0) < PNG_GAMMA_THRESHOLD) - { - back.red = (png_byte)png_ptr->background.red; - back.green = (png_byte)png_ptr->background.green; - back.blue = (png_byte)png_ptr->background.blue; - } - else - { - back.red = (png_byte)(pow( - (double)png_ptr->background.red/255, gs) * 255.0 + .5); - back.green = (png_byte)(pow( - (double)png_ptr->background.green/255, gs) * 255.0 + .5); - back.blue = (png_byte)(pow( - (double)png_ptr->background.blue/255, gs) * 255.0 + .5); - } - - back_1.red = (png_byte)(pow( - (double)png_ptr->background.red/255, g) * 255.0 + .5); - back_1.green = (png_byte)(pow( - (double)png_ptr->background.green/255, g) * 255.0 + .5); - back_1.blue = (png_byte)(pow( - (double)png_ptr->background.blue/255, g) * 255.0 + .5); - } - for (i = 0; i < num_palette; i++) - { - if (i < (int)png_ptr->num_trans && png_ptr->trans[i] != 0xff) - { - if (png_ptr->trans[i] == 0) - { - palette[i] = back; - } - else /* if (png_ptr->trans[i] != 0xff) */ - { - png_byte v, w; - - v = png_ptr->gamma_to_1[palette[i].red]; - png_composite(w, v, png_ptr->trans[i], back_1.red); - palette[i].red = png_ptr->gamma_from_1[w]; - - v = png_ptr->gamma_to_1[palette[i].green]; - png_composite(w, v, png_ptr->trans[i], back_1.green); - palette[i].green = png_ptr->gamma_from_1[w]; - - v = png_ptr->gamma_to_1[palette[i].blue]; - png_composite(w, v, png_ptr->trans[i], back_1.blue); - palette[i].blue = png_ptr->gamma_from_1[w]; - } - } - else - { - palette[i].red = png_ptr->gamma_table[palette[i].red]; - palette[i].green = png_ptr->gamma_table[palette[i].green]; - palette[i].blue = png_ptr->gamma_table[palette[i].blue]; - } - } - } - /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */ - else - /* color_type != PNG_COLOR_TYPE_PALETTE */ - { - double m = (double)(((png_uint_32)1 << png_ptr->bit_depth) - 1); - double g = 1.0; - double gs = 1.0; - - switch (png_ptr->background_gamma_type) - { - case PNG_BACKGROUND_GAMMA_SCREEN: - g = (png_ptr->screen_gamma); - gs = 1.0; - break; - case PNG_BACKGROUND_GAMMA_FILE: - g = 1.0 / (png_ptr->gamma); - gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - break; - case PNG_BACKGROUND_GAMMA_UNIQUE: - g = 1.0 / (png_ptr->background_gamma); - gs = 1.0 / (png_ptr->background_gamma * - png_ptr->screen_gamma); - break; - } - - png_ptr->background_1.gray = (png_uint_16)(pow( - (double)png_ptr->background.gray / m, g) * m + .5); - png_ptr->background.gray = (png_uint_16)(pow( - (double)png_ptr->background.gray / m, gs) * m + .5); - - if ((png_ptr->background.red != png_ptr->background.green) || - (png_ptr->background.red != png_ptr->background.blue) || - (png_ptr->background.red != png_ptr->background.gray)) - { - /* RGB or RGBA with color background */ - png_ptr->background_1.red = (png_uint_16)(pow( - (double)png_ptr->background.red / m, g) * m + .5); - png_ptr->background_1.green = (png_uint_16)(pow( - (double)png_ptr->background.green / m, g) * m + .5); - png_ptr->background_1.blue = (png_uint_16)(pow( - (double)png_ptr->background.blue / m, g) * m + .5); - png_ptr->background.red = (png_uint_16)(pow( - (double)png_ptr->background.red / m, gs) * m + .5); - png_ptr->background.green = (png_uint_16)(pow( - (double)png_ptr->background.green / m, gs) * m + .5); - png_ptr->background.blue = (png_uint_16)(pow( - (double)png_ptr->background.blue / m, gs) * m + .5); - } - else - { - /* GRAY, GRAY ALPHA, RGB, or RGBA with gray background */ - png_ptr->background_1.red = png_ptr->background_1.green - = png_ptr->background_1.blue = png_ptr->background_1.gray; - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - } - } - } - else - /* transformation does not include PNG_BACKGROUND */ -#endif /* PNG_READ_BACKGROUND_SUPPORTED */ - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - png_colorp palette = png_ptr->palette; - int num_palette = png_ptr->num_palette; - int i; - - for (i = 0; i < num_palette; i++) - { - palette[i].red = png_ptr->gamma_table[palette[i].red]; - palette[i].green = png_ptr->gamma_table[palette[i].green]; - palette[i].blue = png_ptr->gamma_table[palette[i].blue]; - } - } - } -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - else -#endif -#endif /* PNG_READ_GAMMA_SUPPORTED && PNG_FLOATING_POINT_SUPPORTED */ -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - /* No GAMMA transformation */ - if ((png_ptr->transformations & PNG_BACKGROUND) && - (color_type == PNG_COLOR_TYPE_PALETTE)) - { - int i; - int istop = (int)png_ptr->num_trans; - png_color back; - png_colorp palette = png_ptr->palette; - - back.red = (png_byte)png_ptr->background.red; - back.green = (png_byte)png_ptr->background.green; - back.blue = (png_byte)png_ptr->background.blue; - - for (i = 0; i < istop; i++) - { - if (png_ptr->trans[i] == 0) - { - palette[i] = back; - } - else if (png_ptr->trans[i] != 0xff) - { - /* The png_composite() macro is defined in png.h */ - png_composite(palette[i].red, palette[i].red, - png_ptr->trans[i], back.red); - png_composite(palette[i].green, palette[i].green, - png_ptr->trans[i], back.green); - png_composite(palette[i].blue, palette[i].blue, - png_ptr->trans[i], back.blue); - } - } - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED */ - -#if defined(PNG_READ_SHIFT_SUPPORTED) - if ((png_ptr->transformations & PNG_SHIFT) && - (color_type == PNG_COLOR_TYPE_PALETTE)) - { - png_uint_16 i; - png_uint_16 istop = png_ptr->num_palette; - int sr = 8 - png_ptr->sig_bit.red; - int sg = 8 - png_ptr->sig_bit.green; - int sb = 8 - png_ptr->sig_bit.blue; - - if (sr < 0 || sr > 8) - sr = 0; - if (sg < 0 || sg > 8) - sg = 0; - if (sb < 0 || sb > 8) - sb = 0; - for (i = 0; i < istop; i++) - { - png_ptr->palette[i].red >>= sr; - png_ptr->palette[i].green >>= sg; - png_ptr->palette[i].blue >>= sb; - } - } -#endif /* PNG_READ_SHIFT_SUPPORTED */ - } -#if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \ - && !defined(PNG_READ_BACKGROUND_SUPPORTED) - if(png_ptr) - return; -#endif -} - -/* Modify the info structure to reflect the transformations. The - * info should be updated so a PNG file could be written with it, - * assuming the transformations result in valid PNG data. - */ -void /* PRIVATE */ -png_read_transform_info(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_read_transform_info\n"); -#if defined(PNG_READ_EXPAND_SUPPORTED) - if (png_ptr->transformations & PNG_EXPAND) - { - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (png_ptr->num_trans) - info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; - else - info_ptr->color_type = PNG_COLOR_TYPE_RGB; - info_ptr->bit_depth = 8; - info_ptr->num_trans = 0; - } - else - { - if (png_ptr->num_trans) - info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; - if (info_ptr->bit_depth < 8) - info_ptr->bit_depth = 8; - info_ptr->num_trans = 0; - } - } -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->transformations & PNG_BACKGROUND) - { - info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; - info_ptr->num_trans = 0; - info_ptr->background = png_ptr->background; - } -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (png_ptr->transformations & PNG_GAMMA) - { -#ifdef PNG_FLOATING_POINT_SUPPORTED - info_ptr->gamma = png_ptr->gamma; -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_gamma = png_ptr->int_gamma; -#endif - } -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) - if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16)) - info_ptr->bit_depth = 8; -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) - if (png_ptr->transformations & PNG_DITHER) - { - if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || - (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) && - png_ptr->palette_lookup && info_ptr->bit_depth == 8) - { - info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; - } - } -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) - if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8)) - info_ptr->bit_depth = 8; -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) - if (png_ptr->transformations & PNG_GRAY_TO_RGB) - info_ptr->color_type |= PNG_COLOR_MASK_COLOR; -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & PNG_RGB_TO_GRAY) - info_ptr->color_type &= ~PNG_COLOR_MASK_COLOR; -#endif - - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - info_ptr->channels = 1; - else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) - info_ptr->channels = 3; - else - info_ptr->channels = 1; - -#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) - if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) - info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; -#endif - - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) - info_ptr->channels++; - -#if defined(PNG_READ_FILLER_SUPPORTED) - /* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */ - if ((png_ptr->transformations & PNG_FILLER) && - ((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || - (info_ptr->color_type == PNG_COLOR_TYPE_GRAY))) - { - info_ptr->channels++; - /* if adding a true alpha channel not just filler */ -#if !defined(PNG_1_0_X) - if (png_ptr->transformations & PNG_ADD_ALPHA) - info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; -#endif - } -#endif - -#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \ -defined(PNG_READ_USER_TRANSFORM_SUPPORTED) - if(png_ptr->transformations & PNG_USER_TRANSFORM) - { - if(info_ptr->bit_depth < png_ptr->user_transform_depth) - info_ptr->bit_depth = png_ptr->user_transform_depth; - if(info_ptr->channels < png_ptr->user_transform_channels) - info_ptr->channels = png_ptr->user_transform_channels; - } -#endif - - info_ptr->pixel_depth = (png_byte)(info_ptr->channels * - info_ptr->bit_depth); - - info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,info_ptr->width); - -#if !defined(PNG_READ_EXPAND_SUPPORTED) - if(png_ptr) - return; -#endif -} - -/* Transform the row. The order of transformations is significant, - * and is very touchy. If you add a transformation, take care to - * decide how it fits in with the other transformations here. - */ -void /* PRIVATE */ -png_do_read_transformations(png_structp png_ptr) -{ - png_debug(1, "in png_do_read_transformations\n"); -#if !defined(PNG_USELESS_TESTS_SUPPORTED) - if (png_ptr->row_buf == NULL) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[50]; - - sprintf(msg, "NULL row buffer for row %ld, pass %d", png_ptr->row_number, - png_ptr->pass); - png_error(png_ptr, msg); -#else - png_error(png_ptr, "NULL row buffer"); -#endif - } -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) - if (png_ptr->transformations & PNG_EXPAND) - { - if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE) - { - png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->palette, png_ptr->trans, png_ptr->num_trans); - } - else - { - if (png_ptr->num_trans) - png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->trans_values)); - else - png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, - NULL); - } - } -#endif - -#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) - if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) - png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, - PNG_FLAG_FILLER_AFTER | (png_ptr->flags & PNG_FLAG_STRIP_ALPHA)); -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & PNG_RGB_TO_GRAY) - { - int rgb_error = - png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1); - if(rgb_error) - { - png_ptr->rgb_to_gray_status=1; - if(png_ptr->transformations == PNG_RGB_TO_GRAY_WARN) - png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel"); - if(png_ptr->transformations == PNG_RGB_TO_GRAY_ERR) - png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel"); - } - } -#endif - -/* -From Andreas Dilger e-mail to png-implement, 26 March 1998: - - In most cases, the "simple transparency" should be done prior to doing - gray-to-RGB, or you will have to test 3x as many bytes to check if a - pixel is transparent. You would also need to make sure that the - transparency information is upgraded to RGB. - - To summarize, the current flow is: - - Gray + simple transparency -> compare 1 or 2 gray bytes and composite - with background "in place" if transparent, - convert to RGB if necessary - - Gray + alpha -> composite with gray background and remove alpha bytes, - convert to RGB if necessary - - To support RGB backgrounds for gray images we need: - - Gray + simple transparency -> convert to RGB + simple transparency, compare - 3 or 6 bytes and composite with background - "in place" if transparent (3x compare/pixel - compared to doing composite with gray bkgrnd) - - Gray + alpha -> convert to RGB + alpha, composite with background and - remove alpha bytes (3x float operations/pixel - compared with composite on gray background) - - Greg's change will do this. The reason it wasn't done before is for - performance, as this increases the per-pixel operations. If we would check - in advance if the background was gray or RGB, and position the gray-to-RGB - transform appropriately, then it would save a lot of work/time. - */ - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) - /* if gray -> RGB, do so now only if background is non-gray; else do later - * for performance reasons */ - if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && - !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) - png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - if ((png_ptr->transformations & PNG_BACKGROUND) && - ((png_ptr->num_trans != 0 ) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) - png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->trans_values), &(png_ptr->background) -#if defined(PNG_READ_GAMMA_SUPPORTED) - , &(png_ptr->background_1), - png_ptr->gamma_table, png_ptr->gamma_from_1, - png_ptr->gamma_to_1, png_ptr->gamma_16_table, - png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1, - png_ptr->gamma_shift -#endif -); -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) - if ((png_ptr->transformations & PNG_GAMMA) && -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - !((png_ptr->transformations & PNG_BACKGROUND) && - ((png_ptr->num_trans != 0) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) && -#endif - (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)) - png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->gamma_table, png_ptr->gamma_16_table, - png_ptr->gamma_shift); -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) - if (png_ptr->transformations & PNG_16_TO_8) - png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) - if (png_ptr->transformations & PNG_DITHER) - { - png_do_dither((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->palette_lookup, png_ptr->dither_index); - if(png_ptr->row_info.rowbytes == (png_uint_32)0) - png_error(png_ptr, "png_do_dither returned rowbytes=0"); - } -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) - png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) - png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->shift)); -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) - png_do_unpack(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) - png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) - /* if gray -> RGB, do so now only if we did not do so above */ - if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && - (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) - png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) - png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, - (png_uint_32)png_ptr->filler, png_ptr->flags); -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_ALPHA) - png_do_read_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_ALPHA) - png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) - if (png_ptr->transformations & PNG_USER_TRANSFORM) - { - if(png_ptr->read_user_transform_fn != NULL) - (*(png_ptr->read_user_transform_fn)) /* user read transform function */ - (png_ptr, /* png_ptr */ - &(png_ptr->row_info), /* row_info: */ - /* png_uint_32 width; width of row */ - /* png_uint_32 rowbytes; number of bytes in row */ - /* png_byte color_type; color type of pixels */ - /* png_byte bit_depth; bit depth of samples */ - /* png_byte channels; number of channels (1-4) */ - /* png_byte pixel_depth; bits per pixel (depth*channels) */ - png_ptr->row_buf + 1); /* start of pixel data for row */ -#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) - if(png_ptr->user_transform_depth) - png_ptr->row_info.bit_depth = png_ptr->user_transform_depth; - if(png_ptr->user_transform_channels) - png_ptr->row_info.channels = png_ptr->user_transform_channels; -#endif - png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * - png_ptr->row_info.channels); - png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->row_info.width); - } -#endif - -} - -#if defined(PNG_READ_PACK_SUPPORTED) -/* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel, - * without changing the actual values. Thus, if you had a row with - * a bit depth of 1, you would end up with bytes that only contained - * the numbers 0 or 1. If you would rather they contain 0 and 255, use - * png_do_shift() after this. - */ -void /* PRIVATE */ -png_do_unpack(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_unpack\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL && row_info->bit_depth < 8) -#else - if (row_info->bit_depth < 8) -#endif - { - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - switch (row_info->bit_depth) - { - case 1: - { - png_bytep sp = row + (png_size_t)((row_width - 1) >> 3); - png_bytep dp = row + (png_size_t)row_width - 1; - png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07); - for (i = 0; i < row_width; i++) - { - *dp = (png_byte)((*sp >> shift) & 0x01); - if (shift == 7) - { - shift = 0; - sp--; - } - else - shift++; - - dp--; - } - break; - } - case 2: - { - - png_bytep sp = row + (png_size_t)((row_width - 1) >> 2); - png_bytep dp = row + (png_size_t)row_width - 1; - png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); - for (i = 0; i < row_width; i++) - { - *dp = (png_byte)((*sp >> shift) & 0x03); - if (shift == 6) - { - shift = 0; - sp--; - } - else - shift += 2; - - dp--; - } - break; - } - case 4: - { - png_bytep sp = row + (png_size_t)((row_width - 1) >> 1); - png_bytep dp = row + (png_size_t)row_width - 1; - png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); - for (i = 0; i < row_width; i++) - { - *dp = (png_byte)((*sp >> shift) & 0x0f); - if (shift == 4) - { - shift = 0; - sp--; - } - else - shift = 4; - - dp--; - } - break; - } - } - row_info->bit_depth = 8; - row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_width * row_info->channels; - } -} -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) -/* Reverse the effects of png_do_shift. This routine merely shifts the - * pixels back to their significant bits values. Thus, if you have - * a row of bit depth 8, but only 5 are significant, this will shift - * the values back to 0 through 31. - */ -void /* PRIVATE */ -png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) -{ - png_debug(1, "in png_do_unshift\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && sig_bits != NULL && -#endif - row_info->color_type != PNG_COLOR_TYPE_PALETTE) - { - int shift[4]; - int channels = 0; - int c; - png_uint_16 value = 0; - png_uint_32 row_width = row_info->width; - - if (row_info->color_type & PNG_COLOR_MASK_COLOR) - { - shift[channels++] = row_info->bit_depth - sig_bits->red; - shift[channels++] = row_info->bit_depth - sig_bits->green; - shift[channels++] = row_info->bit_depth - sig_bits->blue; - } - else - { - shift[channels++] = row_info->bit_depth - sig_bits->gray; - } - if (row_info->color_type & PNG_COLOR_MASK_ALPHA) - { - shift[channels++] = row_info->bit_depth - sig_bits->alpha; - } - - for (c = 0; c < channels; c++) - { - if (shift[c] <= 0) - shift[c] = 0; - else - value = 1; - } - - if (!value) - return; - - switch (row_info->bit_depth) - { - case 2: - { - png_bytep bp; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - - for (bp = row, i = 0; i < istop; i++) - { - *bp >>= 1; - *bp++ &= 0x55; - } - break; - } - case 4: - { - png_bytep bp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) | - (png_byte)((int)0xf >> shift[0])); - - for (i = 0; i < istop; i++) - { - *bp >>= shift[0]; - *bp++ &= mask; - } - break; - } - case 8: - { - png_bytep bp = row; - png_uint_32 i; - png_uint_32 istop = row_width * channels; - - for (i = 0; i < istop; i++) - { - *bp++ >>= shift[i%channels]; - } - break; - } - case 16: - { - png_bytep bp = row; - png_uint_32 i; - png_uint_32 istop = channels * row_width; - - for (i = 0; i < istop; i++) - { - value = (png_uint_16)((*bp << 8) + *(bp + 1)); - value >>= shift[i%channels]; - *bp++ = (png_byte)(value >> 8); - *bp++ = (png_byte)(value & 0xff); - } - break; - } - } - } -} -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) -/* chop rows of bit depth 16 down to 8 */ -void /* PRIVATE */ -png_do_chop(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_chop\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL && row_info->bit_depth == 16) -#else - if (row_info->bit_depth == 16) -#endif - { - png_bytep sp = row; - png_bytep dp = row; - png_uint_32 i; - png_uint_32 istop = row_info->width * row_info->channels; - - for (i = 0; i> 8)) >> 8; - * - * Approximate calculation with shift/add instead of multiply/divide: - * *dp = ((((png_uint_32)(*sp) << 8) | - * (png_uint_32)((int)(*(sp + 1)) - *sp)) + 128) >> 8; - * - * What we actually do to avoid extra shifting and conversion: - */ - - *dp = *sp + ((((int)(*(sp + 1)) - *sp) > 128) ? 1 : 0); -#else - /* Simply discard the low order byte */ - *dp = *sp; -#endif - } - row_info->bit_depth = 8; - row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_info->width * row_info->channels; - } -} -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) -void /* PRIVATE */ -png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_read_swap_alpha\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - png_uint_32 row_width = row_info->width; - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - /* This converts from RGBA to ARGB */ - if (row_info->bit_depth == 8) - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_byte save; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - save = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = save; - } - } - /* This converts from RRGGBBAA to AARRGGBB */ - else - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_byte save[2]; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - save[0] = *(--sp); - save[1] = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = save[0]; - *(--dp) = save[1]; - } - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - /* This converts from GA to AG */ - if (row_info->bit_depth == 8) - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_byte save; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - save = *(--sp); - *(--dp) = *(--sp); - *(--dp) = save; - } - } - /* This converts from GGAA to AAGG */ - else - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_byte save[2]; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - save[0] = *(--sp); - save[1] = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = save[0]; - *(--dp) = save[1]; - } - } - } - } -} -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) -void /* PRIVATE */ -png_do_read_invert_alpha(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_read_invert_alpha\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - png_uint_32 row_width = row_info->width; - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - /* This inverts the alpha channel in RGBA */ - if (row_info->bit_depth == 8) - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - -/* This does nothing: - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - We can replace it with: -*/ - sp-=3; - dp=sp; - } - } - /* This inverts the alpha channel in RRGGBBAA */ - else - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - *(--dp) = (png_byte)(255 - *(--sp)); - -/* This does nothing: - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - We can replace it with: -*/ - sp-=6; - dp=sp; - } - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - /* This inverts the alpha channel in GA */ - if (row_info->bit_depth == 8) - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - *(--dp) = *(--sp); - } - } - /* This inverts the alpha channel in GGAA */ - else - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - *(--dp) = (png_byte)(255 - *(--sp)); -/* - *(--dp) = *(--sp); - *(--dp) = *(--sp); -*/ - sp-=2; - dp=sp; - } - } - } - } -} -#endif - -#if defined(PNG_READ_FILLER_SUPPORTED) -/* Add filler channel if we have RGB color */ -void /* PRIVATE */ -png_do_read_filler(png_row_infop row_info, png_bytep row, - png_uint_32 filler, png_uint_32 flags) -{ - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - png_byte hi_filler = (png_byte)((filler>>8) & 0xff); - png_byte lo_filler = (png_byte)(filler & 0xff); - - png_debug(1, "in png_do_read_filler\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - if(row_info->bit_depth == 8) - { - /* This changes the data from G to GX */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - png_bytep sp = row + (png_size_t)row_width; - png_bytep dp = sp + (png_size_t)row_width; - for (i = 1; i < row_width; i++) - { - *(--dp) = lo_filler; - *(--dp) = *(--sp); - } - *(--dp) = lo_filler; - row_info->channels = 2; - row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; - } - /* This changes the data from G to XG */ - else - { - png_bytep sp = row + (png_size_t)row_width; - png_bytep dp = sp + (png_size_t)row_width; - for (i = 0; i < row_width; i++) - { - *(--dp) = *(--sp); - *(--dp) = lo_filler; - } - row_info->channels = 2; - row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; - } - } - else if(row_info->bit_depth == 16) - { - /* This changes the data from GG to GGXX */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - png_bytep sp = row + (png_size_t)row_width * 2; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 1; i < row_width; i++) - { - *(--dp) = hi_filler; - *(--dp) = lo_filler; - *(--dp) = *(--sp); - *(--dp) = *(--sp); - } - *(--dp) = hi_filler; - *(--dp) = lo_filler; - row_info->channels = 2; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - } - /* This changes the data from GG to XXGG */ - else - { - png_bytep sp = row + (png_size_t)row_width * 2; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 0; i < row_width; i++) - { - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = hi_filler; - *(--dp) = lo_filler; - } - row_info->channels = 2; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - } - } - } /* COLOR_TYPE == GRAY */ - else if (row_info->color_type == PNG_COLOR_TYPE_RGB) - { - if(row_info->bit_depth == 8) - { - /* This changes the data from RGB to RGBX */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - png_bytep sp = row + (png_size_t)row_width * 3; - png_bytep dp = sp + (png_size_t)row_width; - for (i = 1; i < row_width; i++) - { - *(--dp) = lo_filler; - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - } - *(--dp) = lo_filler; - row_info->channels = 4; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - } - /* This changes the data from RGB to XRGB */ - else - { - png_bytep sp = row + (png_size_t)row_width * 3; - png_bytep dp = sp + (png_size_t)row_width; - for (i = 0; i < row_width; i++) - { - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = lo_filler; - } - row_info->channels = 4; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - } - } - else if(row_info->bit_depth == 16) - { - /* This changes the data from RRGGBB to RRGGBBXX */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - png_bytep sp = row + (png_size_t)row_width * 6; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 1; i < row_width; i++) - { - *(--dp) = hi_filler; - *(--dp) = lo_filler; - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - } - *(--dp) = hi_filler; - *(--dp) = lo_filler; - row_info->channels = 4; - row_info->pixel_depth = 64; - row_info->rowbytes = row_width * 8; - } - /* This changes the data from RRGGBB to XXRRGGBB */ - else - { - png_bytep sp = row + (png_size_t)row_width * 6; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 0; i < row_width; i++) - { - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = hi_filler; - *(--dp) = lo_filler; - } - row_info->channels = 4; - row_info->pixel_depth = 64; - row_info->rowbytes = row_width * 8; - } - } - } /* COLOR_TYPE == RGB */ -} -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -/* expand grayscale files to RGB, with or without alpha */ -void /* PRIVATE */ -png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) -{ - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - png_debug(1, "in png_do_gray_to_rgb\n"); - if (row_info->bit_depth >= 8 && -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - !(row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - if (row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - if (row_info->bit_depth == 8) - { - png_bytep sp = row + (png_size_t)row_width - 1; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 0; i < row_width; i++) - { - *(dp--) = *sp; - *(dp--) = *sp; - *(dp--) = *(sp--); - } - } - else - { - png_bytep sp = row + (png_size_t)row_width * 2 - 1; - png_bytep dp = sp + (png_size_t)row_width * 4; - for (i = 0; i < row_width; i++) - { - *(dp--) = *sp; - *(dp--) = *(sp - 1); - *(dp--) = *sp; - *(dp--) = *(sp - 1); - *(dp--) = *(sp--); - *(dp--) = *(sp--); - } - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - if (row_info->bit_depth == 8) - { - png_bytep sp = row + (png_size_t)row_width * 2 - 1; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 0; i < row_width; i++) - { - *(dp--) = *(sp--); - *(dp--) = *sp; - *(dp--) = *sp; - *(dp--) = *(sp--); - } - } - else - { - png_bytep sp = row + (png_size_t)row_width * 4 - 1; - png_bytep dp = sp + (png_size_t)row_width * 4; - for (i = 0; i < row_width; i++) - { - *(dp--) = *(sp--); - *(dp--) = *(sp--); - *(dp--) = *sp; - *(dp--) = *(sp - 1); - *(dp--) = *sp; - *(dp--) = *(sp - 1); - *(dp--) = *(sp--); - *(dp--) = *(sp--); - } - } - } - row_info->channels += (png_byte)2; - row_info->color_type |= PNG_COLOR_MASK_COLOR; - row_info->pixel_depth = (png_byte)(row_info->channels * - row_info->bit_depth); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); - } -} -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -/* reduce RGB files to grayscale, with or without alpha - * using the equation given in Poynton's ColorFAQ at - * - * Copyright (c) 1998-01-04 Charles Poynton poynton at inforamp.net - * - * Y = 0.212671 * R + 0.715160 * G + 0.072169 * B - * - * We approximate this with - * - * Y = 0.21268 * R + 0.7151 * G + 0.07217 * B - * - * which can be expressed with integers as - * - * Y = (6969 * R + 23434 * G + 2365 * B)/32768 - * - * The calculation is to be done in a linear colorspace. - * - * Other integer coefficents can be used via png_set_rgb_to_gray(). - */ -int /* PRIVATE */ -png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) - -{ - png_uint_32 i; - - png_uint_32 row_width = row_info->width; - int rgb_error = 0; - - png_debug(1, "in png_do_rgb_to_gray\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff; - png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff; - png_uint_32 bc = png_ptr->rgb_to_gray_blue_coeff; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - - for (i = 0; i < row_width; i++) - { - png_byte red = png_ptr->gamma_to_1[*(sp++)]; - png_byte green = png_ptr->gamma_to_1[*(sp++)]; - png_byte blue = png_ptr->gamma_to_1[*(sp++)]; - if(red != green || red != blue) - { - rgb_error |= 1; - *(dp++) = png_ptr->gamma_from_1[ - (rc*red+gc*green+bc*blue)>>15]; - } - else - *(dp++) = *(sp-1); - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - for (i = 0; i < row_width; i++) - { - png_byte red = *(sp++); - png_byte green = *(sp++); - png_byte blue = *(sp++); - if(red != green || red != blue) - { - rgb_error |= 1; - *(dp++) = (png_byte)((rc*red+gc*green+bc*blue)>>15); - } - else - *(dp++) = *(sp-1); - } - } - } - - else /* RGB bit_depth == 16 */ - { -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->gamma_16_to_1 != NULL && - png_ptr->gamma_16_from_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 red, green, blue, w; - - red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - - if(red == green && red == blue) - w = red; - else - { - png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> - png_ptr->gamma_shift][red>>8]; - png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> - png_ptr->gamma_shift][green>>8]; - png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> - png_ptr->gamma_shift][blue>>8]; - png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1 - + bc*blue_1)>>15); - w = png_ptr->gamma_16_from_1[(gray16&0xff) >> - png_ptr->gamma_shift][gray16 >> 8]; - rgb_error |= 1; - } - - *(dp++) = (png_byte)((w>>8) & 0xff); - *(dp++) = (png_byte)(w & 0xff); - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 red, green, blue, gray16; - - red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - - if(red != green || red != blue) - rgb_error |= 1; - gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); - *(dp++) = (png_byte)((gray16>>8) & 0xff); - *(dp++) = (png_byte)(gray16 & 0xff); - } - } - } - } - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - for (i = 0; i < row_width; i++) - { - png_byte red = png_ptr->gamma_to_1[*(sp++)]; - png_byte green = png_ptr->gamma_to_1[*(sp++)]; - png_byte blue = png_ptr->gamma_to_1[*(sp++)]; - if(red != green || red != blue) - rgb_error |= 1; - *(dp++) = png_ptr->gamma_from_1 - [(rc*red + gc*green + bc*blue)>>15]; - *(dp++) = *(sp++); /* alpha */ - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - for (i = 0; i < row_width; i++) - { - png_byte red = *(sp++); - png_byte green = *(sp++); - png_byte blue = *(sp++); - if(red != green || red != blue) - rgb_error |= 1; - *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); - *(dp++) = *(sp++); /* alpha */ - } - } - } - else /* RGBA bit_depth == 16 */ - { -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->gamma_16_to_1 != NULL && - png_ptr->gamma_16_from_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 red, green, blue, w; - - red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; - - if(red == green && red == blue) - w = red; - else - { - png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> - png_ptr->gamma_shift][red>>8]; - png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> - png_ptr->gamma_shift][green>>8]; - png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> - png_ptr->gamma_shift][blue>>8]; - png_uint_16 gray16 = (png_uint_16)((rc * red_1 - + gc * green_1 + bc * blue_1)>>15); - w = png_ptr->gamma_16_from_1[(gray16&0xff) >> - png_ptr->gamma_shift][gray16 >> 8]; - rgb_error |= 1; - } - - *(dp++) = (png_byte)((w>>8) & 0xff); - *(dp++) = (png_byte)(w & 0xff); - *(dp++) = *(sp++); /* alpha */ - *(dp++) = *(sp++); - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 red, green, blue, gray16; - red = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; - green = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; - blue = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; - if(red != green || red != blue) - rgb_error |= 1; - gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); - *(dp++) = (png_byte)((gray16>>8) & 0xff); - *(dp++) = (png_byte)(gray16 & 0xff); - *(dp++) = *(sp++); /* alpha */ - *(dp++) = *(sp++); - } - } - } - } - row_info->channels -= (png_byte)2; - row_info->color_type &= ~PNG_COLOR_MASK_COLOR; - row_info->pixel_depth = (png_byte)(row_info->channels * - row_info->bit_depth); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); - } - return rgb_error; -} -#endif - -/* Build a grayscale palette. Palette is assumed to be 1 << bit_depth - * large of png_color. This lets grayscale images be treated as - * paletted. Most useful for gamma correction and simplification - * of code. - */ -void PNGAPI -png_build_grayscale_palette(int bit_depth, png_colorp palette) -{ - int num_palette; - int color_inc; - int i; - int v; - - png_debug(1, "in png_do_build_grayscale_palette\n"); - if (palette == NULL) - return; - - switch (bit_depth) - { - case 1: - num_palette = 2; - color_inc = 0xff; - break; - case 2: - num_palette = 4; - color_inc = 0x55; - break; - case 4: - num_palette = 16; - color_inc = 0x11; - break; - case 8: - num_palette = 256; - color_inc = 1; - break; - default: - num_palette = 0; - color_inc = 0; - break; - } - - for (i = 0, v = 0; i < num_palette; i++, v += color_inc) - { - palette[i].red = (png_byte)v; - palette[i].green = (png_byte)v; - palette[i].blue = (png_byte)v; - } -} - -/* This function is currently unused. Do we really need it? */ -#if defined(PNG_READ_DITHER_SUPPORTED) && defined(PNG_CORRECT_PALETTE_SUPPORTED) -void /* PRIVATE */ -png_correct_palette(png_structp png_ptr, png_colorp palette, - int num_palette) -{ - png_debug(1, "in png_correct_palette\n"); -#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ - defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) - if (png_ptr->transformations & (PNG_GAMMA | PNG_BACKGROUND)) - { - png_color back, back_1; - - if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) - { - back.red = png_ptr->gamma_table[png_ptr->background.red]; - back.green = png_ptr->gamma_table[png_ptr->background.green]; - back.blue = png_ptr->gamma_table[png_ptr->background.blue]; - - back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; - back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; - back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; - } - else - { - double g; - - g = 1.0 / (png_ptr->background_gamma * png_ptr->screen_gamma); - - if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_SCREEN || - fabs(g - 1.0) < PNG_GAMMA_THRESHOLD) - { - back.red = png_ptr->background.red; - back.green = png_ptr->background.green; - back.blue = png_ptr->background.blue; - } - else - { - back.red = - (png_byte)(pow((double)png_ptr->background.red/255, g) * - 255.0 + 0.5); - back.green = - (png_byte)(pow((double)png_ptr->background.green/255, g) * - 255.0 + 0.5); - back.blue = - (png_byte)(pow((double)png_ptr->background.blue/255, g) * - 255.0 + 0.5); - } - - g = 1.0 / png_ptr->background_gamma; - - back_1.red = - (png_byte)(pow((double)png_ptr->background.red/255, g) * - 255.0 + 0.5); - back_1.green = - (png_byte)(pow((double)png_ptr->background.green/255, g) * - 255.0 + 0.5); - back_1.blue = - (png_byte)(pow((double)png_ptr->background.blue/255, g) * - 255.0 + 0.5); - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - png_uint_32 i; - - for (i = 0; i < (png_uint_32)num_palette; i++) - { - if (i < png_ptr->num_trans && png_ptr->trans[i] == 0) - { - palette[i] = back; - } - else if (i < png_ptr->num_trans && png_ptr->trans[i] != 0xff) - { - png_byte v, w; - - v = png_ptr->gamma_to_1[png_ptr->palette[i].red]; - png_composite(w, v, png_ptr->trans[i], back_1.red); - palette[i].red = png_ptr->gamma_from_1[w]; - - v = png_ptr->gamma_to_1[png_ptr->palette[i].green]; - png_composite(w, v, png_ptr->trans[i], back_1.green); - palette[i].green = png_ptr->gamma_from_1[w]; - - v = png_ptr->gamma_to_1[png_ptr->palette[i].blue]; - png_composite(w, v, png_ptr->trans[i], back_1.blue); - palette[i].blue = png_ptr->gamma_from_1[w]; - } - else - { - palette[i].red = png_ptr->gamma_table[palette[i].red]; - palette[i].green = png_ptr->gamma_table[palette[i].green]; - palette[i].blue = png_ptr->gamma_table[palette[i].blue]; - } - } - } - else - { - int i; - - for (i = 0; i < num_palette; i++) - { - if (palette[i].red == (png_byte)png_ptr->trans_values.gray) - { - palette[i] = back; - } - else - { - palette[i].red = png_ptr->gamma_table[palette[i].red]; - palette[i].green = png_ptr->gamma_table[palette[i].green]; - palette[i].blue = png_ptr->gamma_table[palette[i].blue]; - } - } - } - } - else -#endif -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (png_ptr->transformations & PNG_GAMMA) - { - int i; - - for (i = 0; i < num_palette; i++) - { - palette[i].red = png_ptr->gamma_table[palette[i].red]; - palette[i].green = png_ptr->gamma_table[palette[i].green]; - palette[i].blue = png_ptr->gamma_table[palette[i].blue]; - } - } -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - else -#endif -#endif -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->transformations & PNG_BACKGROUND) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - png_color back; - - back.red = (png_byte)png_ptr->background.red; - back.green = (png_byte)png_ptr->background.green; - back.blue = (png_byte)png_ptr->background.blue; - - for (i = 0; i < (int)png_ptr->num_trans; i++) - { - if (png_ptr->trans[i] == 0) - { - palette[i].red = back.red; - palette[i].green = back.green; - palette[i].blue = back.blue; - } - else if (png_ptr->trans[i] != 0xff) - { - png_composite(palette[i].red, png_ptr->palette[i].red, - png_ptr->trans[i], back.red); - png_composite(palette[i].green, png_ptr->palette[i].green, - png_ptr->trans[i], back.green); - png_composite(palette[i].blue, png_ptr->palette[i].blue, - png_ptr->trans[i], back.blue); - } - } - } - else /* assume grayscale palette (what else could it be?) */ - { - int i; - - for (i = 0; i < num_palette; i++) - { - if (i == (png_byte)png_ptr->trans_values.gray) - { - palette[i].red = (png_byte)png_ptr->background.red; - palette[i].green = (png_byte)png_ptr->background.green; - palette[i].blue = (png_byte)png_ptr->background.blue; - } - } - } - } -#endif -} -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) -/* Replace any alpha or transparency with the supplied background color. - * "background" is already in the screen gamma, while "background_1" is - * at a gamma of 1.0. Paletted files have already been taken care of. - */ -void /* PRIVATE */ -png_do_background(png_row_infop row_info, png_bytep row, - png_color_16p trans_values, png_color_16p background -#if defined(PNG_READ_GAMMA_SUPPORTED) - , png_color_16p background_1, - png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, - png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, - png_uint_16pp gamma_16_to_1, int gamma_shift -#endif - ) -{ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - int shift; - - png_debug(1, "in png_do_background\n"); - if (background != NULL && -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (!(row_info->color_type & PNG_COLOR_MASK_ALPHA) || - (row_info->color_type != PNG_COLOR_TYPE_PALETTE && trans_values))) - { - switch (row_info->color_type) - { - case PNG_COLOR_TYPE_GRAY: - { - switch (row_info->bit_depth) - { - case 1: - { - sp = row; - shift = 7; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x01) - == trans_values->gray) - { - *sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - if (!shift) - { - shift = 7; - sp++; - } - else - shift--; - } - break; - } - case 2: - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_table != NULL) - { - sp = row; - shift = 6; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x03) - == trans_values->gray) - { - *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - else - { - png_byte p = (png_byte)((*sp >> shift) & 0x03); - png_byte g = (png_byte)((gamma_table [p | (p << 2) | - (p << 4) | (p << 6)] >> 6) & 0x03); - *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *sp |= (png_byte)(g << shift); - } - if (!shift) - { - shift = 6; - sp++; - } - else - shift -= 2; - } - } - else -#endif - { - sp = row; - shift = 6; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x03) - == trans_values->gray) - { - *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - if (!shift) - { - shift = 6; - sp++; - } - else - shift -= 2; - } - } - break; - } - case 4: - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_table != NULL) - { - sp = row; - shift = 4; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x0f) - == trans_values->gray) - { - *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - else - { - png_byte p = (png_byte)((*sp >> shift) & 0x0f); - png_byte g = (png_byte)((gamma_table[p | - (p << 4)] >> 4) & 0x0f); - *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *sp |= (png_byte)(g << shift); - } - if (!shift) - { - shift = 4; - sp++; - } - else - shift -= 4; - } - } - else -#endif - { - sp = row; - shift = 4; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x0f) - == trans_values->gray) - { - *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - if (!shift) - { - shift = 4; - sp++; - } - else - shift -= 4; - } - } - break; - } - case 8: - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_table != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp++) - { - if (*sp == trans_values->gray) - { - *sp = (png_byte)background->gray; - } - else - { - *sp = gamma_table[*sp]; - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp++) - { - if (*sp == trans_values->gray) - { - *sp = (png_byte)background->gray; - } - } - } - break; - } - case 16: - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_16 != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 2) - { - png_uint_16 v; - - v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - if (v == trans_values->gray) - { - /* background is already in screen gamma */ - *sp = (png_byte)((background->gray >> 8) & 0xff); - *(sp + 1) = (png_byte)(background->gray & 0xff); - } - else - { - v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 2) - { - png_uint_16 v; - - v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - if (v == trans_values->gray) - { - *sp = (png_byte)((background->gray >> 8) & 0xff); - *(sp + 1) = (png_byte)(background->gray & 0xff); - } - } - } - break; - } - } - break; - } - case PNG_COLOR_TYPE_RGB: - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_table != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 3) - { - if (*sp == trans_values->red && - *(sp + 1) == trans_values->green && - *(sp + 2) == trans_values->blue) - { - *sp = (png_byte)background->red; - *(sp + 1) = (png_byte)background->green; - *(sp + 2) = (png_byte)background->blue; - } - else - { - *sp = gamma_table[*sp]; - *(sp + 1) = gamma_table[*(sp + 1)]; - *(sp + 2) = gamma_table[*(sp + 2)]; - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 3) - { - if (*sp == trans_values->red && - *(sp + 1) == trans_values->green && - *(sp + 2) == trans_values->blue) - { - *sp = (png_byte)background->red; - *(sp + 1) = (png_byte)background->green; - *(sp + 2) = (png_byte)background->blue; - } - } - } - } - else /* if (row_info->bit_depth == 16) */ - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_16 != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 6) - { - png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); - png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); - if (r == trans_values->red && g == trans_values->green && - b == trans_values->blue) - { - /* background is already in screen gamma */ - *sp = (png_byte)((background->red >> 8) & 0xff); - *(sp + 1) = (png_byte)(background->red & 0xff); - *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); - *(sp + 3) = (png_byte)(background->green & 0xff); - *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); - *(sp + 5) = (png_byte)(background->blue & 0xff); - } - else - { - png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; - *(sp + 2) = (png_byte)((v >> 8) & 0xff); - *(sp + 3) = (png_byte)(v & 0xff); - v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; - *(sp + 4) = (png_byte)((v >> 8) & 0xff); - *(sp + 5) = (png_byte)(v & 0xff); - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 6) - { - png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp+1)); - png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); - png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); - - if (r == trans_values->red && g == trans_values->green && - b == trans_values->blue) - { - *sp = (png_byte)((background->red >> 8) & 0xff); - *(sp + 1) = (png_byte)(background->red & 0xff); - *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); - *(sp + 3) = (png_byte)(background->green & 0xff); - *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); - *(sp + 5) = (png_byte)(background->blue & 0xff); - } - } - } - } - break; - } - case PNG_COLOR_TYPE_GRAY_ALPHA: - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_to_1 != NULL && gamma_from_1 != NULL && - gamma_table != NULL) - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 2, dp++) - { - png_uint_16 a = *(sp + 1); - - if (a == 0xff) - { - *dp = gamma_table[*sp]; - } - else if (a == 0) - { - /* background is already in screen gamma */ - *dp = (png_byte)background->gray; - } - else - { - png_byte v, w; - - v = gamma_to_1[*sp]; - png_composite(w, v, a, background_1->gray); - *dp = gamma_from_1[w]; - } - } - } - else -#endif - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 2, dp++) - { - png_byte a = *(sp + 1); - - if (a == 0xff) - { - *dp = *sp; - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else if (a == 0) - { - *dp = (png_byte)background->gray; - } - else - { - png_composite(*dp, *sp, a, background_1->gray); - } -#else - *dp = (png_byte)background->gray; -#endif - } - } - } - else /* if (png_ptr->bit_depth == 16) */ - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_16 != NULL && gamma_16_from_1 != NULL && - gamma_16_to_1 != NULL) - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 4, dp += 2) - { - png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); - - if (a == (png_uint_16)0xffff) - { - png_uint_16 v; - - v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; - *dp = (png_byte)((v >> 8) & 0xff); - *(dp + 1) = (png_byte)(v & 0xff); - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else if (a == 0) -#else - else -#endif - { - /* background is already in screen gamma */ - *dp = (png_byte)((background->gray >> 8) & 0xff); - *(dp + 1) = (png_byte)(background->gray & 0xff); - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else - { - png_uint_16 g, v, w; - - g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; - png_composite_16(v, g, a, background_1->gray); - w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8]; - *dp = (png_byte)((w >> 8) & 0xff); - *(dp + 1) = (png_byte)(w & 0xff); - } -#endif - } - } - else -#endif - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 4, dp += 2) - { - png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); - if (a == (png_uint_16)0xffff) - { - png_memcpy(dp, sp, 2); - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else if (a == 0) -#else - else -#endif - { - *dp = (png_byte)((background->gray >> 8) & 0xff); - *(dp + 1) = (png_byte)(background->gray & 0xff); - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else - { - png_uint_16 g, v; - - g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - png_composite_16(v, g, a, background_1->gray); - *dp = (png_byte)((v >> 8) & 0xff); - *(dp + 1) = (png_byte)(v & 0xff); - } -#endif - } - } - } - break; - } - case PNG_COLOR_TYPE_RGB_ALPHA: - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_to_1 != NULL && gamma_from_1 != NULL && - gamma_table != NULL) - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 4, dp += 3) - { - png_byte a = *(sp + 3); - - if (a == 0xff) - { - *dp = gamma_table[*sp]; - *(dp + 1) = gamma_table[*(sp + 1)]; - *(dp + 2) = gamma_table[*(sp + 2)]; - } - else if (a == 0) - { - /* background is already in screen gamma */ - *dp = (png_byte)background->red; - *(dp + 1) = (png_byte)background->green; - *(dp + 2) = (png_byte)background->blue; - } - else - { - png_byte v, w; - - v = gamma_to_1[*sp]; - png_composite(w, v, a, background_1->red); - *dp = gamma_from_1[w]; - v = gamma_to_1[*(sp + 1)]; - png_composite(w, v, a, background_1->green); - *(dp + 1) = gamma_from_1[w]; - v = gamma_to_1[*(sp + 2)]; - png_composite(w, v, a, background_1->blue); - *(dp + 2) = gamma_from_1[w]; - } - } - } - else -#endif - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 4, dp += 3) - { - png_byte a = *(sp + 3); - - if (a == 0xff) - { - *dp = *sp; - *(dp + 1) = *(sp + 1); - *(dp + 2) = *(sp + 2); - } - else if (a == 0) - { - *dp = (png_byte)background->red; - *(dp + 1) = (png_byte)background->green; - *(dp + 2) = (png_byte)background->blue; - } - else - { - png_composite(*dp, *sp, a, background->red); - png_composite(*(dp + 1), *(sp + 1), a, - background->green); - png_composite(*(dp + 2), *(sp + 2), a, - background->blue); - } - } - } - } - else /* if (row_info->bit_depth == 16) */ - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_16 != NULL && gamma_16_from_1 != NULL && - gamma_16_to_1 != NULL) - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 8, dp += 6) - { - png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) - << 8) + (png_uint_16)(*(sp + 7))); - if (a == (png_uint_16)0xffff) - { - png_uint_16 v; - - v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; - *dp = (png_byte)((v >> 8) & 0xff); - *(dp + 1) = (png_byte)(v & 0xff); - v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; - *(dp + 2) = (png_byte)((v >> 8) & 0xff); - *(dp + 3) = (png_byte)(v & 0xff); - v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; - *(dp + 4) = (png_byte)((v >> 8) & 0xff); - *(dp + 5) = (png_byte)(v & 0xff); - } - else if (a == 0) - { - /* background is already in screen gamma */ - *dp = (png_byte)((background->red >> 8) & 0xff); - *(dp + 1) = (png_byte)(background->red & 0xff); - *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); - *(dp + 3) = (png_byte)(background->green & 0xff); - *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); - *(dp + 5) = (png_byte)(background->blue & 0xff); - } - else - { - png_uint_16 v, w, x; - - v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; - png_composite_16(w, v, a, background_1->red); - x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; - *dp = (png_byte)((x >> 8) & 0xff); - *(dp + 1) = (png_byte)(x & 0xff); - v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; - png_composite_16(w, v, a, background_1->green); - x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; - *(dp + 2) = (png_byte)((x >> 8) & 0xff); - *(dp + 3) = (png_byte)(x & 0xff); - v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; - png_composite_16(w, v, a, background_1->blue); - x = gamma_16_from_1[(w & 0xff) >> gamma_shift][w >> 8]; - *(dp + 4) = (png_byte)((x >> 8) & 0xff); - *(dp + 5) = (png_byte)(x & 0xff); - } - } - } - else -#endif - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 8, dp += 6) - { - png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) - << 8) + (png_uint_16)(*(sp + 7))); - if (a == (png_uint_16)0xffff) - { - png_memcpy(dp, sp, 6); - } - else if (a == 0) - { - *dp = (png_byte)((background->red >> 8) & 0xff); - *(dp + 1) = (png_byte)(background->red & 0xff); - *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); - *(dp + 3) = (png_byte)(background->green & 0xff); - *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); - *(dp + 5) = (png_byte)(background->blue & 0xff); - } - else - { - png_uint_16 v; - - png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) - + *(sp + 3)); - png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) - + *(sp + 5)); - - png_composite_16(v, r, a, background->red); - *dp = (png_byte)((v >> 8) & 0xff); - *(dp + 1) = (png_byte)(v & 0xff); - png_composite_16(v, g, a, background->green); - *(dp + 2) = (png_byte)((v >> 8) & 0xff); - *(dp + 3) = (png_byte)(v & 0xff); - png_composite_16(v, b, a, background->blue); - *(dp + 4) = (png_byte)((v >> 8) & 0xff); - *(dp + 5) = (png_byte)(v & 0xff); - } - } - } - } - break; - } - } - - if (row_info->color_type & PNG_COLOR_MASK_ALPHA) - { - row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; - row_info->channels--; - row_info->pixel_depth = (png_byte)(row_info->channels * - row_info->bit_depth); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); - } - } -} -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) -/* Gamma correct the image, avoiding the alpha channel. Make sure - * you do this after you deal with the transparency issue on grayscale - * or RGB images. If your bit depth is 8, use gamma_table, if it - * is 16, use gamma_16_table and gamma_shift. Build these with - * build_gamma_table(). - */ -void /* PRIVATE */ -png_do_gamma(png_row_infop row_info, png_bytep row, - png_bytep gamma_table, png_uint_16pp gamma_16_table, - int gamma_shift) -{ - png_bytep sp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_gamma\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - ((row_info->bit_depth <= 8 && gamma_table != NULL) || - (row_info->bit_depth == 16 && gamma_16_table != NULL))) - { - switch (row_info->color_type) - { - case PNG_COLOR_TYPE_RGB: - { - if (row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp++; - *sp = gamma_table[*sp]; - sp++; - *sp = gamma_table[*sp]; - sp++; - } - } - else /* if (row_info->bit_depth == 16) */ - { - sp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 v; - - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - } - } - break; - } - case PNG_COLOR_TYPE_RGB_ALPHA: - { - if (row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp++; - *sp = gamma_table[*sp]; - sp++; - *sp = gamma_table[*sp]; - sp++; - sp++; - } - } - else /* if (row_info->bit_depth == 16) */ - { - sp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 4; - } - } - break; - } - case PNG_COLOR_TYPE_GRAY_ALPHA: - { - if (row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp += 2; - } - } - else /* if (row_info->bit_depth == 16) */ - { - sp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 4; - } - } - break; - } - case PNG_COLOR_TYPE_GRAY: - { - if (row_info->bit_depth == 2) - { - sp = row; - for (i = 0; i < row_width; i += 4) - { - int a = *sp & 0xc0; - int b = *sp & 0x30; - int c = *sp & 0x0c; - int d = *sp & 0x03; - - *sp = (png_byte)( - ((((int)gamma_table[a|(a>>2)|(a>>4)|(a>>6)]) ) & 0xc0)| - ((((int)gamma_table[(b<<2)|b|(b>>2)|(b>>4)])>>2) & 0x30)| - ((((int)gamma_table[(c<<4)|(c<<2)|c|(c>>2)])>>4) & 0x0c)| - ((((int)gamma_table[(d<<6)|(d<<4)|(d<<2)|d])>>6) )); - sp++; - } - } - if (row_info->bit_depth == 4) - { - sp = row; - for (i = 0; i < row_width; i += 2) - { - int msb = *sp & 0xf0; - int lsb = *sp & 0x0f; - - *sp = (png_byte)((((int)gamma_table[msb | (msb >> 4)]) & 0xf0) - | (((int)gamma_table[(lsb << 4) | lsb]) >> 4)); - sp++; - } - } - else if (row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp++; - } - } - else if (row_info->bit_depth == 16) - { - sp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - } - } - break; - } - } - } -} -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) -/* Expands a palette row to an RGB or RGBA row depending - * upon whether you supply trans and num_trans. - */ -void /* PRIVATE */ -png_do_expand_palette(png_row_infop row_info, png_bytep row, - png_colorp palette, png_bytep trans, int num_trans) -{ - int shift, value; - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_expand_palette\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - row_info->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (row_info->bit_depth < 8) - { - switch (row_info->bit_depth) - { - case 1: - { - sp = row + (png_size_t)((row_width - 1) >> 3); - dp = row + (png_size_t)row_width - 1; - shift = 7 - (int)((row_width + 7) & 0x07); - for (i = 0; i < row_width; i++) - { - if ((*sp >> shift) & 0x01) - *dp = 1; - else - *dp = 0; - if (shift == 7) - { - shift = 0; - sp--; - } - else - shift++; - - dp--; - } - break; - } - case 2: - { - sp = row + (png_size_t)((row_width - 1) >> 2); - dp = row + (png_size_t)row_width - 1; - shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); - for (i = 0; i < row_width; i++) - { - value = (*sp >> shift) & 0x03; - *dp = (png_byte)value; - if (shift == 6) - { - shift = 0; - sp--; - } - else - shift += 2; - - dp--; - } - break; - } - case 4: - { - sp = row + (png_size_t)((row_width - 1) >> 1); - dp = row + (png_size_t)row_width - 1; - shift = (int)((row_width & 0x01) << 2); - for (i = 0; i < row_width; i++) - { - value = (*sp >> shift) & 0x0f; - *dp = (png_byte)value; - if (shift == 4) - { - shift = 0; - sp--; - } - else - shift += 4; - - dp--; - } - break; - } - } - row_info->bit_depth = 8; - row_info->pixel_depth = 8; - row_info->rowbytes = row_width; - } - switch (row_info->bit_depth) - { - case 8: - { - if (trans != NULL) - { - sp = row + (png_size_t)row_width - 1; - dp = row + (png_size_t)(row_width << 2) - 1; - - for (i = 0; i < row_width; i++) - { - if ((int)(*sp) >= num_trans) - *dp-- = 0xff; - else - *dp-- = trans[*sp]; - *dp-- = palette[*sp].blue; - *dp-- = palette[*sp].green; - *dp-- = palette[*sp].red; - sp--; - } - row_info->bit_depth = 8; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - row_info->color_type = 6; - row_info->channels = 4; - } - else - { - sp = row + (png_size_t)row_width - 1; - dp = row + (png_size_t)(row_width * 3) - 1; - - for (i = 0; i < row_width; i++) - { - *dp-- = palette[*sp].blue; - *dp-- = palette[*sp].green; - *dp-- = palette[*sp].red; - sp--; - } - row_info->bit_depth = 8; - row_info->pixel_depth = 24; - row_info->rowbytes = row_width * 3; - row_info->color_type = 2; - row_info->channels = 3; - } - break; - } - } - } -} - -/* If the bit depth < 8, it is expanded to 8. Also, if the - * transparency value is supplied, an alpha channel is built. - */ -void /* PRIVATE */ -png_do_expand(png_row_infop row_info, png_bytep row, - png_color_16p trans_value) -{ - int shift, value; - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_expand\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - if (row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - png_uint_16 gray = (png_uint_16)(trans_value ? trans_value->gray : 0); - - if (row_info->bit_depth < 8) - { - switch (row_info->bit_depth) - { - case 1: - { - gray = (png_uint_16)(gray*0xff); - sp = row + (png_size_t)((row_width - 1) >> 3); - dp = row + (png_size_t)row_width - 1; - shift = 7 - (int)((row_width + 7) & 0x07); - for (i = 0; i < row_width; i++) - { - if ((*sp >> shift) & 0x01) - *dp = 0xff; - else - *dp = 0; - if (shift == 7) - { - shift = 0; - sp--; - } - else - shift++; - - dp--; - } - break; - } - case 2: - { - gray = (png_uint_16)(gray*0x55); - sp = row + (png_size_t)((row_width - 1) >> 2); - dp = row + (png_size_t)row_width - 1; - shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); - for (i = 0; i < row_width; i++) - { - value = (*sp >> shift) & 0x03; - *dp = (png_byte)(value | (value << 2) | (value << 4) | - (value << 6)); - if (shift == 6) - { - shift = 0; - sp--; - } - else - shift += 2; - - dp--; - } - break; - } - case 4: - { - gray = (png_uint_16)(gray*0x11); - sp = row + (png_size_t)((row_width - 1) >> 1); - dp = row + (png_size_t)row_width - 1; - shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); - for (i = 0; i < row_width; i++) - { - value = (*sp >> shift) & 0x0f; - *dp = (png_byte)(value | (value << 4)); - if (shift == 4) - { - shift = 0; - sp--; - } - else - shift = 4; - - dp--; - } - break; - } - } - row_info->bit_depth = 8; - row_info->pixel_depth = 8; - row_info->rowbytes = row_width; - } - - if (trans_value != NULL) - { - if (row_info->bit_depth == 8) - { - sp = row + (png_size_t)row_width - 1; - dp = row + (png_size_t)(row_width << 1) - 1; - for (i = 0; i < row_width; i++) - { - if (*sp == gray) - *dp-- = 0; - else - *dp-- = 0xff; - *dp-- = *sp--; - } - } - else if (row_info->bit_depth == 16) - { - sp = row + row_info->rowbytes - 1; - dp = row + (row_info->rowbytes << 1) - 1; - for (i = 0; i < row_width; i++) - { - if (((png_uint_16)*(sp) | - ((png_uint_16)*(sp - 1) << 8)) == gray) - { - *dp-- = 0; - *dp-- = 0; - } - else - { - *dp-- = 0xff; - *dp-- = 0xff; - } - *dp-- = *sp--; - *dp-- = *sp--; - } - } - row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; - row_info->channels = 2; - row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, - row_width); - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_value) - { - if (row_info->bit_depth == 8) - { - sp = row + (png_size_t)row_info->rowbytes - 1; - dp = row + (png_size_t)(row_width << 2) - 1; - for (i = 0; i < row_width; i++) - { - if (*(sp - 2) == trans_value->red && - *(sp - 1) == trans_value->green && - *(sp - 0) == trans_value->blue) - *dp-- = 0; - else - *dp-- = 0xff; - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - } - } - else if (row_info->bit_depth == 16) - { - sp = row + row_info->rowbytes - 1; - dp = row + (png_size_t)(row_width << 3) - 1; - for (i = 0; i < row_width; i++) - { - if ((((png_uint_16)*(sp - 4) | - ((png_uint_16)*(sp - 5) << 8)) == trans_value->red) && - (((png_uint_16)*(sp - 2) | - ((png_uint_16)*(sp - 3) << 8)) == trans_value->green) && - (((png_uint_16)*(sp - 0) | - ((png_uint_16)*(sp - 1) << 8)) == trans_value->blue)) - { - *dp-- = 0; - *dp-- = 0; - } - else - { - *dp-- = 0xff; - *dp-- = 0xff; - } - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - } - } - row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; - row_info->channels = 4; - row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); - } - } -} -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) -void /* PRIVATE */ -png_do_dither(png_row_infop row_info, png_bytep row, - png_bytep palette_lookup, png_bytep dither_lookup) -{ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_dither\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB && - palette_lookup && row_info->bit_depth == 8) - { - int r, g, b, p; - sp = row; - dp = row; - for (i = 0; i < row_width; i++) - { - r = *sp++; - g = *sp++; - b = *sp++; - - /* this looks real messy, but the compiler will reduce - it down to a reasonable formula. For example, with - 5 bits per color, we get: - p = (((r >> 3) & 0x1f) << 10) | - (((g >> 3) & 0x1f) << 5) | - ((b >> 3) & 0x1f); - */ - p = (((r >> (8 - PNG_DITHER_RED_BITS)) & - ((1 << PNG_DITHER_RED_BITS) - 1)) << - (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | - (((g >> (8 - PNG_DITHER_GREEN_BITS)) & - ((1 << PNG_DITHER_GREEN_BITS) - 1)) << - (PNG_DITHER_BLUE_BITS)) | - ((b >> (8 - PNG_DITHER_BLUE_BITS)) & - ((1 << PNG_DITHER_BLUE_BITS) - 1)); - - *dp++ = palette_lookup[p]; - } - row_info->color_type = PNG_COLOR_TYPE_PALETTE; - row_info->channels = 1; - row_info->pixel_depth = row_info->bit_depth; - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); - } - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && - palette_lookup != NULL && row_info->bit_depth == 8) - { - int r, g, b, p; - sp = row; - dp = row; - for (i = 0; i < row_width; i++) - { - r = *sp++; - g = *sp++; - b = *sp++; - sp++; - - p = (((r >> (8 - PNG_DITHER_RED_BITS)) & - ((1 << PNG_DITHER_RED_BITS) - 1)) << - (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | - (((g >> (8 - PNG_DITHER_GREEN_BITS)) & - ((1 << PNG_DITHER_GREEN_BITS) - 1)) << - (PNG_DITHER_BLUE_BITS)) | - ((b >> (8 - PNG_DITHER_BLUE_BITS)) & - ((1 << PNG_DITHER_BLUE_BITS) - 1)); - - *dp++ = palette_lookup[p]; - } - row_info->color_type = PNG_COLOR_TYPE_PALETTE; - row_info->channels = 1; - row_info->pixel_depth = row_info->bit_depth; - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); - } - else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && - dither_lookup && row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++, sp++) - { - *sp = dither_lookup[*sp]; - } - } - } -} -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -#if defined(PNG_READ_GAMMA_SUPPORTED) -static int png_gamma_shift[] = - {0x10, 0x21, 0x42, 0x84, 0x110, 0x248, 0x550, 0xff0}; - -/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit - * tables, we don't make a full table if we are reducing to 8-bit in - * the future. Note also how the gamma_16 tables are segmented so that - * we don't need to allocate > 64K chunks for a full 16-bit table. - */ -void /* PRIVATE */ -png_build_gamma_table(png_structp png_ptr) -{ - png_debug(1, "in png_build_gamma_table\n"); - if(png_ptr->gamma != 0.0) - { - if (png_ptr->bit_depth <= 8) - { - int i; - double g; - - if (png_ptr->screen_gamma > .000001) - g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - else - g = 1.0; - - png_ptr->gamma_table = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - - for (i = 0; i < 256; i++) - { - png_ptr->gamma_table[i] = (png_byte)(pow((double)i / 255.0, - g) * 255.0 + .5); - } - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY)) - { - - g = 1.0 / (png_ptr->gamma); - - png_ptr->gamma_to_1 = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - - for (i = 0; i < 256; i++) - { - png_ptr->gamma_to_1[i] = (png_byte)(pow((double)i / 255.0, - g) * 255.0 + .5); - } - - - png_ptr->gamma_from_1 = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - - if(png_ptr->screen_gamma > 0.000001) - g = 1.0 / png_ptr->screen_gamma; - else - g = png_ptr->gamma; /* probably doing rgb_to_gray */ - - for (i = 0; i < 256; i++) - { - png_ptr->gamma_from_1[i] = (png_byte)(pow((double)i / 255.0, - g) * 255.0 + .5); - - } - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ - } - else - { - double g; - int i, j, shift, num; - int sig_bit; - png_uint_32 ig; - - if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) - { - sig_bit = (int)png_ptr->sig_bit.red; - if ((int)png_ptr->sig_bit.green > sig_bit) - sig_bit = png_ptr->sig_bit.green; - if ((int)png_ptr->sig_bit.blue > sig_bit) - sig_bit = png_ptr->sig_bit.blue; - } - else - { - sig_bit = (int)png_ptr->sig_bit.gray; - } - - if (sig_bit > 0) - shift = 16 - sig_bit; - else - shift = 0; - - if (png_ptr->transformations & PNG_16_TO_8) - { - if (shift < (16 - PNG_MAX_GAMMA_8)) - shift = (16 - PNG_MAX_GAMMA_8); - } - - if (shift > 8) - shift = 8; - if (shift < 0) - shift = 0; - - png_ptr->gamma_shift = (png_byte)shift; - - num = (1 << (8 - shift)); - - if (png_ptr->screen_gamma > .000001) - g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - else - g = 1.0; - - png_ptr->gamma_16_table = (png_uint_16pp)png_malloc(png_ptr, - (png_uint_32)(num * png_sizeof (png_uint_16p))); - - if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND)) - { - double fin, fout; - png_uint_32 last, max; - - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof (png_uint_16))); - } - - g = 1.0 / g; - last = 0; - for (i = 0; i < 256; i++) - { - fout = ((double)i + 0.5) / 256.0; - fin = pow(fout, g); - max = (png_uint_32)(fin * (double)((png_uint_32)num << 8)); - while (last <= max) - { - png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] - [(int)(last >> (8 - shift))] = (png_uint_16)( - (png_uint_16)i | ((png_uint_16)i << 8)); - last++; - } - } - while (last < ((png_uint_32)num << 8)) - { - png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] - [(int)(last >> (8 - shift))] = (png_uint_16)65535L; - last++; - } - } - else - { - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof (png_uint_16))); - - ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4); - for (j = 0; j < 256; j++) - { - png_ptr->gamma_16_table[i][j] = - (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / - 65535.0, g) * 65535.0 + .5); - } - } - } - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY)) - { - - g = 1.0 / (png_ptr->gamma); - - png_ptr->gamma_16_to_1 = (png_uint_16pp)png_malloc(png_ptr, - (png_uint_32)(num * png_sizeof (png_uint_16p ))); - - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_to_1[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof (png_uint_16))); - - ig = (((png_uint_32)i * - (png_uint_32)png_gamma_shift[shift]) >> 4); - for (j = 0; j < 256; j++) - { - png_ptr->gamma_16_to_1[i][j] = - (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / - 65535.0, g) * 65535.0 + .5); - } - } - - if(png_ptr->screen_gamma > 0.000001) - g = 1.0 / png_ptr->screen_gamma; - else - g = png_ptr->gamma; /* probably doing rgb_to_gray */ - - png_ptr->gamma_16_from_1 = (png_uint_16pp)png_malloc(png_ptr, - (png_uint_32)(num * png_sizeof (png_uint_16p))); - - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_from_1[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof (png_uint_16))); - - ig = (((png_uint_32)i * - (png_uint_32)png_gamma_shift[shift]) >> 4); - for (j = 0; j < 256; j++) - { - png_ptr->gamma_16_from_1[i][j] = - (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / - 65535.0, g) * 65535.0 + .5); - } - } - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ - } - } -} -#endif -/* To do: install integer version of png_build_gamma_table here */ -#endif - -#if defined(PNG_MNG_FEATURES_SUPPORTED) -/* undoes intrapixel differencing */ -void /* PRIVATE */ -png_do_read_intrapixel(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_read_intrapixel\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - int bytes_per_pixel; - png_uint_32 row_width = row_info->width; - if (row_info->bit_depth == 8) - { - png_bytep rp; - png_uint_32 i; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - bytes_per_pixel = 3; - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - bytes_per_pixel = 4; - else - return; - - for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) - { - *(rp) = (png_byte)((256 + *rp + *(rp+1))&0xff); - *(rp+2) = (png_byte)((256 + *(rp+2) + *(rp+1))&0xff); - } - } - else if (row_info->bit_depth == 16) - { - png_bytep rp; - png_uint_32 i; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - bytes_per_pixel = 6; - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - bytes_per_pixel = 8; - else - return; - - for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) - { - png_uint_32 s0 = (*(rp ) << 8) | *(rp+1); - png_uint_32 s1 = (*(rp+2) << 8) | *(rp+3); - png_uint_32 s2 = (*(rp+4) << 8) | *(rp+5); - png_uint_32 red = (png_uint_32)((s0+s1+65536L) & 0xffffL); - png_uint_32 blue = (png_uint_32)((s2+s1+65536L) & 0xffffL); - *(rp ) = (png_byte)((red >> 8) & 0xff); - *(rp+1) = (png_byte)(red & 0xff); - *(rp+4) = (png_byte)((blue >> 8) & 0xff); - *(rp+5) = (png_byte)(blue & 0xff); - } - } - } -} -#endif /* PNG_MNG_FEATURES_SUPPORTED */ diff --git a/src/SFML/Graphics/libpng/pngrutil.c b/src/SFML/Graphics/libpng/pngrutil.c deleted file mode 100644 index 6c1cdf76..00000000 --- a/src/SFML/Graphics/libpng/pngrutil.c +++ /dev/null @@ -1,3124 +0,0 @@ -/* pngrutil.c - utilities to read a PNG file - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This file contains routines that are only called from within - * libpng itself during the course of reading an image. - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(_WIN32_WCE) -/* strtod() function is not supported on WindowsCE */ -# ifdef PNG_FLOATING_POINT_SUPPORTED -__inline double strtod(const char *nptr, char **endptr) -{ - double result = 0; - int len; - wchar_t *str, *end; - - len = MultiByteToWideChar(CP_ACP, 0, nptr, -1, NULL, 0); - str = (wchar_t *)malloc(len * sizeof(wchar_t)); - if ( NULL != str ) - { - MultiByteToWideChar(CP_ACP, 0, nptr, -1, str, len); - result = wcstod(str, &end); - len = WideCharToMultiByte(CP_ACP, 0, end, -1, NULL, 0, NULL, NULL); - *endptr = (char *)nptr + (png_strlen(nptr) - len + 1); - free(str); - } - return result; -} -# endif -#endif - -png_uint_32 /* PRIVATE */ -png_get_uint_31(png_structp png_ptr, png_bytep buf) -{ - png_uint_32 i = png_get_uint_32(buf); - if (i > PNG_UINT_31_MAX) - png_error(png_ptr, "PNG unsigned integer out of range.\n"); - return (i); -} -#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED -/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */ -png_uint_32 /* PRIVATE */ -png_get_uint_32(png_bytep buf) -{ - png_uint_32 i = ((png_uint_32)(*buf) << 24) + - ((png_uint_32)(*(buf + 1)) << 16) + - ((png_uint_32)(*(buf + 2)) << 8) + - (png_uint_32)(*(buf + 3)); - - return (i); -} - -#if defined(PNG_READ_pCAL_SUPPORTED) || defined(PNG_READ_oFFs_SUPPORTED) -/* Grab a signed 32-bit integer from a buffer in big-endian format. The - * data is stored in the PNG file in two's complement format, and it is - * assumed that the machine format for signed integers is the same. */ -png_int_32 /* PRIVATE */ -png_get_int_32(png_bytep buf) -{ - png_int_32 i = ((png_int_32)(*buf) << 24) + - ((png_int_32)(*(buf + 1)) << 16) + - ((png_int_32)(*(buf + 2)) << 8) + - (png_int_32)(*(buf + 3)); - - return (i); -} -#endif /* PNG_READ_pCAL_SUPPORTED */ - -/* Grab an unsigned 16-bit integer from a buffer in big-endian format. */ -png_uint_16 /* PRIVATE */ -png_get_uint_16(png_bytep buf) -{ - png_uint_16 i = (png_uint_16)(((png_uint_16)(*buf) << 8) + - (png_uint_16)(*(buf + 1))); - - return (i); -} -#endif /* PNG_READ_BIG_ENDIAN_SUPPORTED */ - -/* Read data, and (optionally) run it through the CRC. */ -void /* PRIVATE */ -png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length) -{ - png_read_data(png_ptr, buf, length); - png_calculate_crc(png_ptr, buf, length); -} - -/* Optionally skip data and then check the CRC. Depending on whether we - are reading a ancillary or critical chunk, and how the program has set - things up, we may calculate the CRC on the data and print a message. - Returns '1' if there was a CRC error, '0' otherwise. */ -int /* PRIVATE */ -png_crc_finish(png_structp png_ptr, png_uint_32 skip) -{ - png_size_t i; - png_size_t istop = png_ptr->zbuf_size; - - for (i = (png_size_t)skip; i > istop; i -= istop) - { - png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); - } - if (i) - { - png_crc_read(png_ptr, png_ptr->zbuf, i); - } - - if (png_crc_error(png_ptr)) - { - if (((png_ptr->chunk_name[0] & 0x20) && /* Ancillary */ - !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) || - (!(png_ptr->chunk_name[0] & 0x20) && /* Critical */ - (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE))) - { - png_chunk_warning(png_ptr, "CRC error"); - } - else - { - png_chunk_error(png_ptr, "CRC error"); - } - return (1); - } - - return (0); -} - -/* Compare the CRC stored in the PNG file with that calculated by libpng from - the data it has read thus far. */ -int /* PRIVATE */ -png_crc_error(png_structp png_ptr) -{ - png_byte crc_bytes[4]; - png_uint_32 crc; - int need_crc = 1; - - if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ - { - if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == - (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) - need_crc = 0; - } - else /* critical */ - { - if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) - need_crc = 0; - } - - png_read_data(png_ptr, crc_bytes, 4); - - if (need_crc) - { - crc = png_get_uint_32(crc_bytes); - return ((int)(crc != png_ptr->crc)); - } - else - return (0); -} - -#if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \ - defined(PNG_READ_iCCP_SUPPORTED) -/* - * Decompress trailing data in a chunk. The assumption is that chunkdata - * points at an allocated area holding the contents of a chunk with a - * trailing compressed part. What we get back is an allocated area - * holding the original prefix part and an uncompressed version of the - * trailing part (the malloc area passed in is freed). - */ -png_charp /* PRIVATE */ -png_decompress_chunk(png_structp png_ptr, int comp_type, - png_charp chunkdata, png_size_t chunklength, - png_size_t prefix_size, png_size_t *newlength) -{ - static char msg[] = "Error decoding compressed text"; - png_charp text; - png_size_t text_size; - - if (comp_type == PNG_COMPRESSION_TYPE_BASE) - { - int ret = Z_OK; - png_ptr->zstream.next_in = (png_bytep)(chunkdata + prefix_size); - png_ptr->zstream.avail_in = (uInt)(chunklength - prefix_size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - text_size = 0; - text = NULL; - - while (png_ptr->zstream.avail_in) - { - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret != Z_OK && ret != Z_STREAM_END) - { - if (png_ptr->zstream.msg != NULL) - png_warning(png_ptr, png_ptr->zstream.msg); - else - png_warning(png_ptr, msg); - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - - if (text == NULL) - { - text_size = prefix_size + png_sizeof(msg) + 1; - text = (png_charp)png_malloc_warn(png_ptr, text_size); - if (text == NULL) - { - png_free(png_ptr,chunkdata); - png_error(png_ptr,"Not enough memory to decompress chunk"); - } - png_memcpy(text, chunkdata, prefix_size); - } - - text[text_size - 1] = 0x00; - - /* Copy what we can of the error message into the text chunk */ - text_size = (png_size_t)(chunklength - (text - chunkdata) - 1); - text_size = png_sizeof(msg) > text_size ? text_size : - png_sizeof(msg); - png_memcpy(text + prefix_size, msg, text_size + 1); - break; - } - if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END) - { - if (text == NULL) - { - text_size = prefix_size + - png_ptr->zbuf_size - png_ptr->zstream.avail_out; - text = (png_charp)png_malloc_warn(png_ptr, text_size + 1); - if (text == NULL) - { - png_free(png_ptr,chunkdata); - png_error(png_ptr,"Not enough memory to decompress chunk."); - } - png_memcpy(text + prefix_size, png_ptr->zbuf, - text_size - prefix_size); - png_memcpy(text, chunkdata, prefix_size); - *(text + text_size) = 0x00; - } - else - { - png_charp tmp; - - tmp = text; - text = (png_charp)png_malloc_warn(png_ptr, - (png_uint_32)(text_size + - png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1)); - if (text == NULL) - { - png_free(png_ptr, tmp); - png_free(png_ptr, chunkdata); - png_error(png_ptr,"Not enough memory to decompress chunk.."); - } - png_memcpy(text, tmp, text_size); - png_free(png_ptr, tmp); - png_memcpy(text + text_size, png_ptr->zbuf, - (png_ptr->zbuf_size - png_ptr->zstream.avail_out)); - text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; - *(text + text_size) = 0x00; - } - if (ret == Z_STREAM_END) - break; - else - { - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - } - } - if (ret != Z_STREAM_END) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char umsg[50]; - - if (ret == Z_BUF_ERROR) - sprintf(umsg,"Buffer error in compressed datastream in %s chunk", - png_ptr->chunk_name); - else if (ret == Z_DATA_ERROR) - sprintf(umsg,"Data error in compressed datastream in %s chunk", - png_ptr->chunk_name); - else - sprintf(umsg,"Incomplete compressed datastream in %s chunk", - png_ptr->chunk_name); - png_warning(png_ptr, umsg); -#else - png_warning(png_ptr, - "Incomplete compressed datastream in chunk other than IDAT"); -#endif - text_size=prefix_size; - if (text == NULL) - { - text = (png_charp)png_malloc_warn(png_ptr, text_size+1); - if (text == NULL) - { - png_free(png_ptr, chunkdata); - png_error(png_ptr,"Not enough memory for text."); - } - png_memcpy(text, chunkdata, prefix_size); - } - *(text + text_size) = 0x00; - } - - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - - png_free(png_ptr, chunkdata); - chunkdata = text; - *newlength=text_size; - } - else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */ - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char umsg[50]; - - sprintf(umsg, "Unknown zTXt compression type %d", comp_type); - png_warning(png_ptr, umsg); -#else - png_warning(png_ptr, "Unknown zTXt compression type"); -#endif - - *(chunkdata + prefix_size) = 0x00; - *newlength=prefix_size; - } - - return chunkdata; -} -#endif - -/* read and check the IDHR chunk */ -void /* PRIVATE */ -png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte buf[13]; - png_uint_32 width, height; - int bit_depth, color_type, compression_type, filter_type; - int interlace_type; - - png_debug(1, "in png_handle_IHDR\n"); - - if (png_ptr->mode & PNG_HAVE_IHDR) - png_error(png_ptr, "Out of place IHDR"); - - /* check the length */ - if (length != 13) - png_error(png_ptr, "Invalid IHDR chunk"); - - png_ptr->mode |= PNG_HAVE_IHDR; - - png_crc_read(png_ptr, buf, 13); - png_crc_finish(png_ptr, 0); - - width = png_get_uint_31(png_ptr, buf); - height = png_get_uint_31(png_ptr, buf + 4); - bit_depth = buf[8]; - color_type = buf[9]; - compression_type = buf[10]; - filter_type = buf[11]; - interlace_type = buf[12]; - - /* set internal variables */ - png_ptr->width = width; - png_ptr->height = height; - png_ptr->bit_depth = (png_byte)bit_depth; - png_ptr->interlaced = (png_byte)interlace_type; - png_ptr->color_type = (png_byte)color_type; -#if defined(PNG_MNG_FEATURES_SUPPORTED) - png_ptr->filter_type = (png_byte)filter_type; -#endif - png_ptr->compression_type = (png_byte)compression_type; - - /* find number of channels */ - switch (png_ptr->color_type) - { - case PNG_COLOR_TYPE_GRAY: - case PNG_COLOR_TYPE_PALETTE: - png_ptr->channels = 1; - break; - case PNG_COLOR_TYPE_RGB: - png_ptr->channels = 3; - break; - case PNG_COLOR_TYPE_GRAY_ALPHA: - png_ptr->channels = 2; - break; - case PNG_COLOR_TYPE_RGB_ALPHA: - png_ptr->channels = 4; - break; - } - - /* set up other useful info */ - png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * - png_ptr->channels); - png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width); - png_debug1(3,"bit_depth = %d\n", png_ptr->bit_depth); - png_debug1(3,"channels = %d\n", png_ptr->channels); - png_debug1(3,"rowbytes = %lu\n", png_ptr->rowbytes); - png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, - color_type, interlace_type, compression_type, filter_type); -} - -/* read and check the palette */ -void /* PRIVATE */ -png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_color palette[PNG_MAX_PALETTE_LENGTH]; - int num, i; -#ifndef PNG_NO_POINTER_INDEXING - png_colorp pal_ptr; -#endif - - png_debug(1, "in png_handle_PLTE\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before PLTE"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid PLTE after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - png_error(png_ptr, "Duplicate PLTE chunk"); - - png_ptr->mode |= PNG_HAVE_PLTE; - - if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) - { - png_warning(png_ptr, - "Ignoring PLTE chunk in grayscale PNG"); - png_crc_finish(png_ptr, length); - return; - } -#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) - if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) - { - png_crc_finish(png_ptr, length); - return; - } -#endif - - if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3) - { - if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) - { - png_warning(png_ptr, "Invalid palette chunk"); - png_crc_finish(png_ptr, length); - return; - } - else - { - png_error(png_ptr, "Invalid palette chunk"); - } - } - - num = (int)length / 3; - -#ifndef PNG_NO_POINTER_INDEXING - for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++) - { - png_byte buf[3]; - - png_crc_read(png_ptr, buf, 3); - pal_ptr->red = buf[0]; - pal_ptr->green = buf[1]; - pal_ptr->blue = buf[2]; - } -#else - for (i = 0; i < num; i++) - { - png_byte buf[3]; - - png_crc_read(png_ptr, buf, 3); - /* don't depend upon png_color being any order */ - palette[i].red = buf[0]; - palette[i].green = buf[1]; - palette[i].blue = buf[2]; - } -#endif - - /* If we actually NEED the PLTE chunk (ie for a paletted image), we do - whatever the normal CRC configuration tells us. However, if we - have an RGB image, the PLTE can be considered ancillary, so - we will act as though it is. */ -#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) -#endif - { - png_crc_finish(png_ptr, 0); - } -#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) - else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */ - { - /* If we don't want to use the data from an ancillary chunk, - we have two options: an error abort, or a warning and we - ignore the data in this chunk (which should be OK, since - it's considered ancillary for a RGB or RGBA image). */ - if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE)) - { - if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) - { - png_chunk_error(png_ptr, "CRC error"); - } - else - { - png_chunk_warning(png_ptr, "CRC error"); - return; - } - } - /* Otherwise, we (optionally) emit a warning and use the chunk. */ - else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) - { - png_chunk_warning(png_ptr, "CRC error"); - } - } -#endif - - png_set_PLTE(png_ptr, info_ptr, palette, num); - -#if defined(PNG_READ_tRNS_SUPPORTED) - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) - { - if (png_ptr->num_trans > (png_uint_16)num) - { - png_warning(png_ptr, "Truncating incorrect tRNS chunk length"); - png_ptr->num_trans = (png_uint_16)num; - } - if (info_ptr->num_trans > (png_uint_16)num) - { - png_warning(png_ptr, "Truncating incorrect info tRNS chunk length"); - info_ptr->num_trans = (png_uint_16)num; - } - } - } -#endif - -} - -void /* PRIVATE */ -png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_debug(1, "in png_handle_IEND\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT)) - { - png_error(png_ptr, "No image in file"); - } - - png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND); - - if (length != 0) - { - png_warning(png_ptr, "Incorrect IEND chunk length"); - } - png_crc_finish(png_ptr, length); - - if (&info_ptr == NULL) /* quiet compiler warnings about unused info_ptr */ - return; -} - -#if defined(PNG_READ_gAMA_SUPPORTED) -void /* PRIVATE */ -png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_fixed_point igamma; -#ifdef PNG_FLOATING_POINT_SUPPORTED - float file_gamma; -#endif - png_byte buf[4]; - - png_debug(1, "in png_handle_gAMA\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before gAMA"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid gAMA after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Out of place gAMA chunk"); - - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) -#if defined(PNG_READ_sRGB_SUPPORTED) - && !(info_ptr->valid & PNG_INFO_sRGB) -#endif - ) - { - png_warning(png_ptr, "Duplicate gAMA chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 4) - { - png_warning(png_ptr, "Incorrect gAMA chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 4); - if (png_crc_finish(png_ptr, 0)) - return; - - igamma = (png_fixed_point)png_get_uint_32(buf); - /* check for zero gamma */ - if (igamma == 0) - { - png_warning(png_ptr, - "Ignoring gAMA chunk with gamma=0"); - return; - } - -#if defined(PNG_READ_sRGB_SUPPORTED) - if (info_ptr->valid & PNG_INFO_sRGB) - if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) - { - png_warning(png_ptr, - "Ignoring incorrect gAMA value when sRGB is also present"); -#ifndef PNG_NO_CONSOLE_IO - fprintf(stderr, "gamma = (%d/100000)\n", (int)igamma); -#endif - return; - } -#endif /* PNG_READ_sRGB_SUPPORTED */ - -#ifdef PNG_FLOATING_POINT_SUPPORTED - file_gamma = (float)igamma / (float)100000.0; -# ifdef PNG_READ_GAMMA_SUPPORTED - png_ptr->gamma = file_gamma; -# endif - png_set_gAMA(png_ptr, info_ptr, file_gamma); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_set_gAMA_fixed(png_ptr, info_ptr, igamma); -#endif -} -#endif - -#if defined(PNG_READ_sBIT_SUPPORTED) -void /* PRIVATE */ -png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_size_t truelen; - png_byte buf[4]; - - png_debug(1, "in png_handle_sBIT\n"); - - buf[0] = buf[1] = buf[2] = buf[3] = 0; - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before sBIT"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid sBIT after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - { - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Out of place sBIT chunk"); - } - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)) - { - png_warning(png_ptr, "Duplicate sBIT chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - truelen = 3; - else - truelen = (png_size_t)png_ptr->channels; - - if (length != truelen || length > 4) - { - png_warning(png_ptr, "Incorrect sBIT chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, truelen); - if (png_crc_finish(png_ptr, 0)) - return; - - if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) - { - png_ptr->sig_bit.red = buf[0]; - png_ptr->sig_bit.green = buf[1]; - png_ptr->sig_bit.blue = buf[2]; - png_ptr->sig_bit.alpha = buf[3]; - } - else - { - png_ptr->sig_bit.gray = buf[0]; - png_ptr->sig_bit.red = buf[0]; - png_ptr->sig_bit.green = buf[0]; - png_ptr->sig_bit.blue = buf[0]; - png_ptr->sig_bit.alpha = buf[1]; - } - png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit)); -} -#endif - -#if defined(PNG_READ_cHRM_SUPPORTED) -void /* PRIVATE */ -png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte buf[4]; -#ifdef PNG_FLOATING_POINT_SUPPORTED - float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; -#endif - png_fixed_point int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, - int_y_green, int_x_blue, int_y_blue; - - png_uint_32 uint_x, uint_y; - - png_debug(1, "in png_handle_cHRM\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before cHRM"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid cHRM after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Missing PLTE before cHRM"); - - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM) -#if defined(PNG_READ_sRGB_SUPPORTED) - && !(info_ptr->valid & PNG_INFO_sRGB) -#endif - ) - { - png_warning(png_ptr, "Duplicate cHRM chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 32) - { - png_warning(png_ptr, "Incorrect cHRM chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 4); - uint_x = png_get_uint_32(buf); - - png_crc_read(png_ptr, buf, 4); - uint_y = png_get_uint_32(buf); - - if (uint_x > 80000L || uint_y > 80000L || - uint_x + uint_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM white point"); - png_crc_finish(png_ptr, 24); - return; - } - int_x_white = (png_fixed_point)uint_x; - int_y_white = (png_fixed_point)uint_y; - - png_crc_read(png_ptr, buf, 4); - uint_x = png_get_uint_32(buf); - - png_crc_read(png_ptr, buf, 4); - uint_y = png_get_uint_32(buf); - - if (uint_x > 80000L || uint_y > 80000L || - uint_x + uint_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM red point"); - png_crc_finish(png_ptr, 16); - return; - } - int_x_red = (png_fixed_point)uint_x; - int_y_red = (png_fixed_point)uint_y; - - png_crc_read(png_ptr, buf, 4); - uint_x = png_get_uint_32(buf); - - png_crc_read(png_ptr, buf, 4); - uint_y = png_get_uint_32(buf); - - if (uint_x > 80000L || uint_y > 80000L || - uint_x + uint_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM green point"); - png_crc_finish(png_ptr, 8); - return; - } - int_x_green = (png_fixed_point)uint_x; - int_y_green = (png_fixed_point)uint_y; - - png_crc_read(png_ptr, buf, 4); - uint_x = png_get_uint_32(buf); - - png_crc_read(png_ptr, buf, 4); - uint_y = png_get_uint_32(buf); - - if (uint_x > 80000L || uint_y > 80000L || - uint_x + uint_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM blue point"); - png_crc_finish(png_ptr, 0); - return; - } - int_x_blue = (png_fixed_point)uint_x; - int_y_blue = (png_fixed_point)uint_y; - -#ifdef PNG_FLOATING_POINT_SUPPORTED - white_x = (float)int_x_white / (float)100000.0; - white_y = (float)int_y_white / (float)100000.0; - red_x = (float)int_x_red / (float)100000.0; - red_y = (float)int_y_red / (float)100000.0; - green_x = (float)int_x_green / (float)100000.0; - green_y = (float)int_y_green / (float)100000.0; - blue_x = (float)int_x_blue / (float)100000.0; - blue_y = (float)int_y_blue / (float)100000.0; -#endif - -#if defined(PNG_READ_sRGB_SUPPORTED) - if (info_ptr->valid & PNG_INFO_sRGB) - { - if (PNG_OUT_OF_RANGE(int_x_white, 31270, 1000) || - PNG_OUT_OF_RANGE(int_y_white, 32900, 1000) || - PNG_OUT_OF_RANGE(int_x_red, 64000L, 1000) || - PNG_OUT_OF_RANGE(int_y_red, 33000, 1000) || - PNG_OUT_OF_RANGE(int_x_green, 30000, 1000) || - PNG_OUT_OF_RANGE(int_y_green, 60000L, 1000) || - PNG_OUT_OF_RANGE(int_x_blue, 15000, 1000) || - PNG_OUT_OF_RANGE(int_y_blue, 6000, 1000)) - { - - png_warning(png_ptr, - "Ignoring incorrect cHRM value when sRGB is also present"); -#ifndef PNG_NO_CONSOLE_IO -#ifdef PNG_FLOATING_POINT_SUPPORTED - fprintf(stderr,"wx=%f, wy=%f, rx=%f, ry=%f\n", - white_x, white_y, red_x, red_y); - fprintf(stderr,"gx=%f, gy=%f, bx=%f, by=%f\n", - green_x, green_y, blue_x, blue_y); -#else - fprintf(stderr,"wx=%ld, wy=%ld, rx=%ld, ry=%ld\n", - int_x_white, int_y_white, int_x_red, int_y_red); - fprintf(stderr,"gx=%ld, gy=%ld, bx=%ld, by=%ld\n", - int_x_green, int_y_green, int_x_blue, int_y_blue); -#endif -#endif /* PNG_NO_CONSOLE_IO */ - } - png_crc_finish(png_ptr, 0); - return; - } -#endif /* PNG_READ_sRGB_SUPPORTED */ - -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_set_cHRM(png_ptr, info_ptr, - white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_set_cHRM_fixed(png_ptr, info_ptr, - int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, - int_y_green, int_x_blue, int_y_blue); -#endif - if (png_crc_finish(png_ptr, 0)) - return; -} -#endif - -#if defined(PNG_READ_sRGB_SUPPORTED) -void /* PRIVATE */ -png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - int intent; - png_byte buf[1]; - - png_debug(1, "in png_handle_sRGB\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before sRGB"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid sRGB after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Out of place sRGB chunk"); - - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) - { - png_warning(png_ptr, "Duplicate sRGB chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 1) - { - png_warning(png_ptr, "Incorrect sRGB chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 1); - if (png_crc_finish(png_ptr, 0)) - return; - - intent = buf[0]; - /* check for bad intent */ - if (intent >= PNG_sRGB_INTENT_LAST) - { - png_warning(png_ptr, "Unknown sRGB intent"); - return; - } - -#if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) - if ((info_ptr->valid & PNG_INFO_gAMA)) - { - png_fixed_point igamma; -#ifdef PNG_FIXED_POINT_SUPPORTED - igamma=info_ptr->int_gamma; -#else -# ifdef PNG_FLOATING_POINT_SUPPORTED - igamma=(png_fixed_point)(info_ptr->gamma * 100000.); -# endif -#endif - if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) - { - png_warning(png_ptr, - "Ignoring incorrect gAMA value when sRGB is also present"); -#ifndef PNG_NO_CONSOLE_IO -# ifdef PNG_FIXED_POINT_SUPPORTED - fprintf(stderr,"incorrect gamma=(%d/100000)\n",(int)png_ptr->int_gamma); -# else -# ifdef PNG_FLOATING_POINT_SUPPORTED - fprintf(stderr,"incorrect gamma=%f\n",png_ptr->gamma); -# endif -# endif -#endif - } - } -#endif /* PNG_READ_gAMA_SUPPORTED */ - -#ifdef PNG_READ_cHRM_SUPPORTED -#ifdef PNG_FIXED_POINT_SUPPORTED - if (info_ptr->valid & PNG_INFO_cHRM) - if (PNG_OUT_OF_RANGE(info_ptr->int_x_white, 31270, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_white, 32900, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_x_red, 64000L, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_red, 33000, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_x_green, 30000, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_green, 60000L, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_x_blue, 15000, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_blue, 6000, 1000)) - { - png_warning(png_ptr, - "Ignoring incorrect cHRM value when sRGB is also present"); - } -#endif /* PNG_FIXED_POINT_SUPPORTED */ -#endif /* PNG_READ_cHRM_SUPPORTED */ - - png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent); -} -#endif /* PNG_READ_sRGB_SUPPORTED */ - -#if defined(PNG_READ_iCCP_SUPPORTED) -void /* PRIVATE */ -png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -/* Note: this does not properly handle chunks that are > 64K under DOS */ -{ - png_charp chunkdata; - png_byte compression_type; - png_bytep pC; - png_charp profile; - png_uint_32 skip = 0; - png_uint_32 profile_size, profile_length; - png_size_t slength, prefix_length, data_length; - - png_debug(1, "in png_handle_iCCP\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before iCCP"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid iCCP after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Out of place iCCP chunk"); - - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)) - { - png_warning(png_ptr, "Duplicate iCCP chunk"); - png_crc_finish(png_ptr, length); - return; - } - -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "iCCP chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - chunkdata = (png_charp)png_malloc(png_ptr, length + 1); - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)chunkdata, slength); - - if (png_crc_finish(png_ptr, skip)) - { - png_free(png_ptr, chunkdata); - return; - } - - chunkdata[slength] = 0x00; - - for (profile = chunkdata; *profile; profile++) - /* empty loop to find end of name */ ; - - ++profile; - - /* there should be at least one zero (the compression type byte) - following the separator, and we should be on it */ - if ( profile >= chunkdata + slength) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "Malformed iCCP chunk"); - return; - } - - /* compression_type should always be zero */ - compression_type = *profile++; - if (compression_type) - { - png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk"); - compression_type=0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8 - wrote nonzero) */ - } - - prefix_length = profile - chunkdata; - chunkdata = png_decompress_chunk(png_ptr, compression_type, chunkdata, - slength, prefix_length, &data_length); - - profile_length = data_length - prefix_length; - - if ( prefix_length > data_length || profile_length < 4) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "Profile size field missing from iCCP chunk"); - return; - } - - /* Check the profile_size recorded in the first 32 bits of the ICC profile */ - pC = (png_bytep)(chunkdata+prefix_length); - profile_size = ((*(pC ))<<24) | - ((*(pC+1))<<16) | - ((*(pC+2))<< 8) | - ((*(pC+3)) ); - - if(profile_size < profile_length) - profile_length = profile_size; - - if(profile_size > profile_length) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "Ignoring truncated iCCP profile.\n"); - return; - } - - png_set_iCCP(png_ptr, info_ptr, chunkdata, compression_type, - chunkdata + prefix_length, profile_length); - png_free(png_ptr, chunkdata); -} -#endif /* PNG_READ_iCCP_SUPPORTED */ - -#if defined(PNG_READ_sPLT_SUPPORTED) -void /* PRIVATE */ -png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -/* Note: this does not properly handle chunks that are > 64K under DOS */ -{ - png_bytep chunkdata; - png_bytep entry_start; - png_sPLT_t new_palette; -#ifdef PNG_NO_POINTER_INDEXING - png_sPLT_entryp pp; -#endif - int data_length, entry_size, i; - png_uint_32 skip = 0; - png_size_t slength; - - png_debug(1, "in png_handle_sPLT\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before sPLT"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid sPLT after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "sPLT chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - chunkdata = (png_bytep)png_malloc(png_ptr, length + 1); - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)chunkdata, slength); - - if (png_crc_finish(png_ptr, skip)) - { - png_free(png_ptr, chunkdata); - return; - } - - chunkdata[slength] = 0x00; - - for (entry_start = chunkdata; *entry_start; entry_start++) - /* empty loop to find end of name */ ; - ++entry_start; - - /* a sample depth should follow the separator, and we should be on it */ - if (entry_start > chunkdata + slength) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "malformed sPLT chunk"); - return; - } - - new_palette.depth = *entry_start++; - entry_size = (new_palette.depth == 8 ? 6 : 10); - data_length = (slength - (entry_start - chunkdata)); - - /* integrity-check the data length */ - if (data_length % entry_size) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "sPLT chunk has bad length"); - return; - } - - new_palette.nentries = (png_uint_32) (data_length / entry_size); - if ((png_uint_32) new_palette.nentries > (png_uint_32) (PNG_SIZE_MAX / - png_sizeof(png_sPLT_entry))) - { - png_warning(png_ptr, "sPLT chunk too long"); - return; - } - new_palette.entries = (png_sPLT_entryp)png_malloc_warn( - png_ptr, new_palette.nentries * png_sizeof(png_sPLT_entry)); - if (new_palette.entries == NULL) - { - png_warning(png_ptr, "sPLT chunk requires too much memory"); - return; - } - -#ifndef PNG_NO_POINTER_INDEXING - for (i = 0; i < new_palette.nentries; i++) - { - png_sPLT_entryp pp = new_palette.entries + i; - - if (new_palette.depth == 8) - { - pp->red = *entry_start++; - pp->green = *entry_start++; - pp->blue = *entry_start++; - pp->alpha = *entry_start++; - } - else - { - pp->red = png_get_uint_16(entry_start); entry_start += 2; - pp->green = png_get_uint_16(entry_start); entry_start += 2; - pp->blue = png_get_uint_16(entry_start); entry_start += 2; - pp->alpha = png_get_uint_16(entry_start); entry_start += 2; - } - pp->frequency = png_get_uint_16(entry_start); entry_start += 2; - } -#else - pp = new_palette.entries; - for (i = 0; i < new_palette.nentries; i++) - { - - if (new_palette.depth == 8) - { - pp[i].red = *entry_start++; - pp[i].green = *entry_start++; - pp[i].blue = *entry_start++; - pp[i].alpha = *entry_start++; - } - else - { - pp[i].red = png_get_uint_16(entry_start); entry_start += 2; - pp[i].green = png_get_uint_16(entry_start); entry_start += 2; - pp[i].blue = png_get_uint_16(entry_start); entry_start += 2; - pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2; - } - pp->frequency = png_get_uint_16(entry_start); entry_start += 2; - } -#endif - - /* discard all chunk data except the name and stash that */ - new_palette.name = (png_charp)chunkdata; - - png_set_sPLT(png_ptr, info_ptr, &new_palette, 1); - - png_free(png_ptr, chunkdata); - png_free(png_ptr, new_palette.entries); -} -#endif /* PNG_READ_sPLT_SUPPORTED */ - -#if defined(PNG_READ_tRNS_SUPPORTED) -void /* PRIVATE */ -png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte readbuf[PNG_MAX_PALETTE_LENGTH]; - - png_debug(1, "in png_handle_tRNS\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before tRNS"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid tRNS after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) - { - png_warning(png_ptr, "Duplicate tRNS chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) - { - png_byte buf[2]; - - if (length != 2) - { - png_warning(png_ptr, "Incorrect tRNS chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 2); - png_ptr->num_trans = 1; - png_ptr->trans_values.gray = png_get_uint_16(buf); - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) - { - png_byte buf[6]; - - if (length != 6) - { - png_warning(png_ptr, "Incorrect tRNS chunk length"); - png_crc_finish(png_ptr, length); - return; - } - png_crc_read(png_ptr, buf, (png_size_t)length); - png_ptr->num_trans = 1; - png_ptr->trans_values.red = png_get_uint_16(buf); - png_ptr->trans_values.green = png_get_uint_16(buf + 2); - png_ptr->trans_values.blue = png_get_uint_16(buf + 4); - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (!(png_ptr->mode & PNG_HAVE_PLTE)) - { - /* Should be an error, but we can cope with it. */ - png_warning(png_ptr, "Missing PLTE before tRNS"); - } - if (length > (png_uint_32)png_ptr->num_palette || - length > PNG_MAX_PALETTE_LENGTH) - { - png_warning(png_ptr, "Incorrect tRNS chunk length"); - png_crc_finish(png_ptr, length); - return; - } - if (length == 0) - { - png_warning(png_ptr, "Zero length tRNS chunk"); - png_crc_finish(png_ptr, length); - return; - } - png_crc_read(png_ptr, readbuf, (png_size_t)length); - png_ptr->num_trans = (png_uint_16)length; - } - else - { - png_warning(png_ptr, "tRNS chunk not allowed with alpha channel"); - png_crc_finish(png_ptr, length); - return; - } - - if (png_crc_finish(png_ptr, 0)) - return; - - png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans, - &(png_ptr->trans_values)); -} -#endif - -#if defined(PNG_READ_bKGD_SUPPORTED) -void /* PRIVATE */ -png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_size_t truelen; - png_byte buf[6]; - - png_debug(1, "in png_handle_bKGD\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before bKGD"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid bKGD after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) - { - png_warning(png_ptr, "Missing PLTE before bKGD"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)) - { - png_warning(png_ptr, "Duplicate bKGD chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - truelen = 1; - else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) - truelen = 6; - else - truelen = 2; - - if (length != truelen) - { - png_warning(png_ptr, "Incorrect bKGD chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, truelen); - if (png_crc_finish(png_ptr, 0)) - return; - - /* We convert the index value into RGB components so that we can allow - * arbitrary RGB values for background when we have transparency, and - * so it is easy to determine the RGB values of the background color - * from the info_ptr struct. */ - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - png_ptr->background.index = buf[0]; - if(info_ptr->num_palette) - { - if(buf[0] > info_ptr->num_palette) - { - png_warning(png_ptr, "Incorrect bKGD chunk index value"); - return; - } - png_ptr->background.red = - (png_uint_16)png_ptr->palette[buf[0]].red; - png_ptr->background.green = - (png_uint_16)png_ptr->palette[buf[0]].green; - png_ptr->background.blue = - (png_uint_16)png_ptr->palette[buf[0]].blue; - } - } - else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */ - { - png_ptr->background.red = - png_ptr->background.green = - png_ptr->background.blue = - png_ptr->background.gray = png_get_uint_16(buf); - } - else - { - png_ptr->background.red = png_get_uint_16(buf); - png_ptr->background.green = png_get_uint_16(buf + 2); - png_ptr->background.blue = png_get_uint_16(buf + 4); - } - - png_set_bKGD(png_ptr, info_ptr, &(png_ptr->background)); -} -#endif - -#if defined(PNG_READ_hIST_SUPPORTED) -void /* PRIVATE */ -png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - unsigned int num, i; - png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH]; - - png_debug(1, "in png_handle_hIST\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before hIST"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid hIST after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (!(png_ptr->mode & PNG_HAVE_PLTE)) - { - png_warning(png_ptr, "Missing PLTE before hIST"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)) - { - png_warning(png_ptr, "Duplicate hIST chunk"); - png_crc_finish(png_ptr, length); - return; - } - - num = length / 2 ; - if (num != (unsigned int) png_ptr->num_palette || num > - (unsigned int) PNG_MAX_PALETTE_LENGTH) - { - png_warning(png_ptr, "Incorrect hIST chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - for (i = 0; i < num; i++) - { - png_byte buf[2]; - - png_crc_read(png_ptr, buf, 2); - readbuf[i] = png_get_uint_16(buf); - } - - if (png_crc_finish(png_ptr, 0)) - return; - - png_set_hIST(png_ptr, info_ptr, readbuf); -} -#endif - -#if defined(PNG_READ_pHYs_SUPPORTED) -void /* PRIVATE */ -png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte buf[9]; - png_uint_32 res_x, res_y; - int unit_type; - - png_debug(1, "in png_handle_pHYs\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before pHYs"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid pHYs after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) - { - png_warning(png_ptr, "Duplicate pHYs chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 9) - { - png_warning(png_ptr, "Incorrect pHYs chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 9); - if (png_crc_finish(png_ptr, 0)) - return; - - res_x = png_get_uint_32(buf); - res_y = png_get_uint_32(buf + 4); - unit_type = buf[8]; - png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type); -} -#endif - -#if defined(PNG_READ_oFFs_SUPPORTED) -void /* PRIVATE */ -png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte buf[9]; - png_int_32 offset_x, offset_y; - int unit_type; - - png_debug(1, "in png_handle_oFFs\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before oFFs"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid oFFs after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) - { - png_warning(png_ptr, "Duplicate oFFs chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 9) - { - png_warning(png_ptr, "Incorrect oFFs chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 9); - if (png_crc_finish(png_ptr, 0)) - return; - - offset_x = png_get_int_32(buf); - offset_y = png_get_int_32(buf + 4); - unit_type = buf[8]; - png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type); -} -#endif - -#if defined(PNG_READ_pCAL_SUPPORTED) -/* read the pCAL chunk (described in the PNG Extensions document) */ -void /* PRIVATE */ -png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_charp purpose; - png_int_32 X0, X1; - png_byte type, nparams; - png_charp buf, units, endptr; - png_charpp params; - png_size_t slength; - int i; - - png_debug(1, "in png_handle_pCAL\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before pCAL"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid pCAL after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)) - { - png_warning(png_ptr, "Duplicate pCAL chunk"); - png_crc_finish(png_ptr, length); - return; - } - - png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)\n", - length + 1); - purpose = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (purpose == NULL) - { - png_warning(png_ptr, "No memory for pCAL purpose."); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)purpose, slength); - - if (png_crc_finish(png_ptr, 0)) - { - png_free(png_ptr, purpose); - return; - } - - purpose[slength] = 0x00; /* null terminate the last string */ - - png_debug(3, "Finding end of pCAL purpose string\n"); - for (buf = purpose; *buf; buf++) - /* empty loop */ ; - - endptr = purpose + slength; - - /* We need to have at least 12 bytes after the purpose string - in order to get the parameter information. */ - if (endptr <= buf + 12) - { - png_warning(png_ptr, "Invalid pCAL data"); - png_free(png_ptr, purpose); - return; - } - - png_debug(3, "Reading pCAL X0, X1, type, nparams, and units\n"); - X0 = png_get_int_32((png_bytep)buf+1); - X1 = png_get_int_32((png_bytep)buf+5); - type = buf[9]; - nparams = buf[10]; - units = buf + 11; - - png_debug(3, "Checking pCAL equation type and number of parameters\n"); - /* Check that we have the right number of parameters for known - equation types. */ - if ((type == PNG_EQUATION_LINEAR && nparams != 2) || - (type == PNG_EQUATION_BASE_E && nparams != 3) || - (type == PNG_EQUATION_ARBITRARY && nparams != 3) || - (type == PNG_EQUATION_HYPERBOLIC && nparams != 4)) - { - png_warning(png_ptr, "Invalid pCAL parameters for equation type"); - png_free(png_ptr, purpose); - return; - } - else if (type >= PNG_EQUATION_LAST) - { - png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); - } - - for (buf = units; *buf; buf++) - /* Empty loop to move past the units string. */ ; - - png_debug(3, "Allocating pCAL parameters array\n"); - params = (png_charpp)png_malloc_warn(png_ptr, (png_uint_32)(nparams - *png_sizeof(png_charp))) ; - if (params == NULL) - { - png_free(png_ptr, purpose); - png_warning(png_ptr, "No memory for pCAL params."); - return; - } - - /* Get pointers to the start of each parameter string. */ - for (i = 0; i < (int)nparams; i++) - { - buf++; /* Skip the null string terminator from previous parameter. */ - - png_debug1(3, "Reading pCAL parameter %d\n", i); - for (params[i] = buf; *buf != 0x00 && buf <= endptr; buf++) - /* Empty loop to move past each parameter string */ ; - - /* Make sure we haven't run out of data yet */ - if (buf > endptr) - { - png_warning(png_ptr, "Invalid pCAL data"); - png_free(png_ptr, purpose); - png_free(png_ptr, params); - return; - } - } - - png_set_pCAL(png_ptr, info_ptr, purpose, X0, X1, type, nparams, - units, params); - - png_free(png_ptr, purpose); - png_free(png_ptr, params); -} -#endif - -#if defined(PNG_READ_sCAL_SUPPORTED) -/* read the sCAL chunk */ -void /* PRIVATE */ -png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_charp buffer, ep; -#ifdef PNG_FLOATING_POINT_SUPPORTED - double width, height; - png_charp vp; -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_charp swidth, sheight; -#endif -#endif - png_size_t slength; - - png_debug(1, "in png_handle_sCAL\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before sCAL"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid sCAL after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) - { - png_warning(png_ptr, "Duplicate sCAL chunk"); - png_crc_finish(png_ptr, length); - return; - } - - png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)\n", - length + 1); - buffer = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (buffer == NULL) - { - png_warning(png_ptr, "Out of memory while processing sCAL chunk"); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)buffer, slength); - - if (png_crc_finish(png_ptr, 0)) - { - png_free(png_ptr, buffer); - return; - } - - buffer[slength] = 0x00; /* null terminate the last string */ - - ep = buffer + 1; /* skip unit byte */ - -#ifdef PNG_FLOATING_POINT_SUPPORTED - width = strtod(ep, &vp); - if (*vp) - { - png_warning(png_ptr, "malformed width string in sCAL chunk"); - return; - } -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - swidth = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); - if (swidth == NULL) - { - png_warning(png_ptr, "Out of memory while processing sCAL chunk width"); - return; - } - png_memcpy(swidth, ep, (png_size_t)png_strlen(ep)); -#endif -#endif - - for (ep = buffer; *ep; ep++) - /* empty loop */ ; - ep++; - -#ifdef PNG_FLOATING_POINT_SUPPORTED - height = strtod(ep, &vp); - if (*vp) - { - png_warning(png_ptr, "malformed height string in sCAL chunk"); - return; - } -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - sheight = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); - if (swidth == NULL) - { - png_warning(png_ptr, "Out of memory while processing sCAL chunk height"); - return; - } - png_memcpy(sheight, ep, (png_size_t)png_strlen(ep)); -#endif -#endif - - if (buffer + slength < ep -#ifdef PNG_FLOATING_POINT_SUPPORTED - || width <= 0. || height <= 0. -#endif - ) - { - png_warning(png_ptr, "Invalid sCAL data"); - png_free(png_ptr, buffer); -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); - png_free(png_ptr, sheight); -#endif - return; - } - - -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_set_sCAL(png_ptr, info_ptr, buffer[0], width, height); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_set_sCAL_s(png_ptr, info_ptr, buffer[0], swidth, sheight); -#endif -#endif - - png_free(png_ptr, buffer); -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); - png_free(png_ptr, sheight); -#endif -} -#endif - -#if defined(PNG_READ_tIME_SUPPORTED) -void /* PRIVATE */ -png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte buf[7]; - png_time mod_time; - - png_debug(1, "in png_handle_tIME\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Out of place tIME chunk"); - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)) - { - png_warning(png_ptr, "Duplicate tIME chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - - if (length != 7) - { - png_warning(png_ptr, "Incorrect tIME chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 7); - if (png_crc_finish(png_ptr, 0)) - return; - - mod_time.second = buf[6]; - mod_time.minute = buf[5]; - mod_time.hour = buf[4]; - mod_time.day = buf[3]; - mod_time.month = buf[2]; - mod_time.year = png_get_uint_16(buf); - - png_set_tIME(png_ptr, info_ptr, &mod_time); -} -#endif - -#if defined(PNG_READ_tEXt_SUPPORTED) -/* Note: this does not properly handle chunks that are > 64K under DOS */ -void /* PRIVATE */ -png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_textp text_ptr; - png_charp key; - png_charp text; - png_uint_32 skip = 0; - png_size_t slength; - int ret; - - png_debug(1, "in png_handle_tEXt\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before tEXt"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "tEXt chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - key = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (key == NULL) - { - png_warning(png_ptr, "No memory to process text chunk."); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)key, slength); - - if (png_crc_finish(png_ptr, skip)) - { - png_free(png_ptr, key); - return; - } - - key[slength] = 0x00; - - for (text = key; *text; text++) - /* empty loop to find end of key */ ; - - if (text != key + slength) - text++; - - text_ptr = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)png_sizeof(png_text)); - if (text_ptr == NULL) - { - png_warning(png_ptr, "Not enough memory to process text chunk."); - png_free(png_ptr, key); - return; - } - text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; - text_ptr->key = key; -#ifdef PNG_iTXt_SUPPORTED - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->itxt_length = 0; -#endif - text_ptr->text = text; - text_ptr->text_length = png_strlen(text); - - ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - if (ret) - png_warning(png_ptr, "Insufficient memory to process text chunk."); -} -#endif - -#if defined(PNG_READ_zTXt_SUPPORTED) -/* note: this does not correctly handle chunks that are > 64K under DOS */ -void /* PRIVATE */ -png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_textp text_ptr; - png_charp chunkdata; - png_charp text; - int comp_type; - int ret; - png_size_t slength, prefix_len, data_len; - - png_debug(1, "in png_handle_zTXt\n"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before zTXt"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - -#ifdef PNG_MAX_MALLOC_64K - /* We will no doubt have problems with chunks even half this size, but - there is no hard and fast rule to tell us where to stop. */ - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr,"zTXt chunk too large to fit in memory"); - png_crc_finish(png_ptr, length); - return; - } -#endif - - chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (chunkdata == NULL) - { - png_warning(png_ptr,"Out of memory processing zTXt chunk."); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)chunkdata, slength); - if (png_crc_finish(png_ptr, 0)) - { - png_free(png_ptr, chunkdata); - return; - } - - chunkdata[slength] = 0x00; - - for (text = chunkdata; *text; text++) - /* empty loop */ ; - - /* zTXt must have some text after the chunkdataword */ - if (text == chunkdata + slength) - { - comp_type = PNG_TEXT_COMPRESSION_NONE; - png_warning(png_ptr, "Zero length zTXt chunk"); - } - else - { - comp_type = *(++text); - if (comp_type != PNG_TEXT_COMPRESSION_zTXt) - { - png_warning(png_ptr, "Unknown compression type in zTXt chunk"); - comp_type = PNG_TEXT_COMPRESSION_zTXt; - } - text++; /* skip the compression_method byte */ - } - prefix_len = text - chunkdata; - - chunkdata = (png_charp)png_decompress_chunk(png_ptr, comp_type, chunkdata, - (png_size_t)length, prefix_len, &data_len); - - text_ptr = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)png_sizeof(png_text)); - if (text_ptr == NULL) - { - png_warning(png_ptr,"Not enough memory to process zTXt chunk."); - png_free(png_ptr, chunkdata); - return; - } - text_ptr->compression = comp_type; - text_ptr->key = chunkdata; -#ifdef PNG_iTXt_SUPPORTED - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->itxt_length = 0; -#endif - text_ptr->text = chunkdata + prefix_len; - text_ptr->text_length = data_len; - - ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, text_ptr); - png_free(png_ptr, chunkdata); - if (ret) - png_error(png_ptr, "Insufficient memory to store zTXt chunk."); -} -#endif - -#if defined(PNG_READ_iTXt_SUPPORTED) -/* note: this does not correctly handle chunks that are > 64K under DOS */ -void /* PRIVATE */ -png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_textp text_ptr; - png_charp chunkdata; - png_charp key, lang, text, lang_key; - int comp_flag; - int comp_type = 0; - int ret; - png_size_t slength, prefix_len, data_len; - - png_debug(1, "in png_handle_iTXt\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before iTXt"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - -#ifdef PNG_MAX_MALLOC_64K - /* We will no doubt have problems with chunks even half this size, but - there is no hard and fast rule to tell us where to stop. */ - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr,"iTXt chunk too large to fit in memory"); - png_crc_finish(png_ptr, length); - return; - } -#endif - - chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (chunkdata == NULL) - { - png_warning(png_ptr, "No memory to process iTXt chunk."); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)chunkdata, slength); - if (png_crc_finish(png_ptr, 0)) - { - png_free(png_ptr, chunkdata); - return; - } - - chunkdata[slength] = 0x00; - - for (lang = chunkdata; *lang; lang++) - /* empty loop */ ; - lang++; /* skip NUL separator */ - - /* iTXt must have a language tag (possibly empty), two compression bytes, - translated keyword (possibly empty), and possibly some text after the - keyword */ - - if (lang >= chunkdata + slength) - { - comp_flag = PNG_TEXT_COMPRESSION_NONE; - png_warning(png_ptr, "Zero length iTXt chunk"); - } - else - { - comp_flag = *lang++; - comp_type = *lang++; - } - - for (lang_key = lang; *lang_key; lang_key++) - /* empty loop */ ; - lang_key++; /* skip NUL separator */ - - for (text = lang_key; *text; text++) - /* empty loop */ ; - text++; /* skip NUL separator */ - - prefix_len = text - chunkdata; - - key=chunkdata; - if (comp_flag) - chunkdata = png_decompress_chunk(png_ptr, comp_type, chunkdata, - (size_t)length, prefix_len, &data_len); - else - data_len=png_strlen(chunkdata + prefix_len); - text_ptr = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)png_sizeof(png_text)); - if (text_ptr == NULL) - { - png_warning(png_ptr,"Not enough memory to process iTXt chunk."); - png_free(png_ptr, chunkdata); - return; - } - text_ptr->compression = (int)comp_flag + 1; - text_ptr->lang_key = chunkdata+(lang_key-key); - text_ptr->lang = chunkdata+(lang-key); - text_ptr->itxt_length = data_len; - text_ptr->text_length = 0; - text_ptr->key = chunkdata; - text_ptr->text = chunkdata + prefix_len; - - ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, text_ptr); - png_free(png_ptr, chunkdata); - if (ret) - png_error(png_ptr, "Insufficient memory to store iTXt chunk."); -} -#endif - -/* This function is called when we haven't found a handler for a - chunk. If there isn't a problem with the chunk itself (ie bad - chunk name, CRC, or a critical chunk), the chunk is silently ignored - -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which - case it will be saved away to be written out later. */ -void /* PRIVATE */ -png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_uint_32 skip = 0; - - png_debug(1, "in png_handle_unknown\n"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - { -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IDAT; -#endif - if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* not an IDAT */ - png_ptr->mode |= PNG_AFTER_IDAT; - } - - png_check_chunk_name(png_ptr, png_ptr->chunk_name); - - if (!(png_ptr->chunk_name[0] & 0x20)) - { -#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) - && png_ptr->read_user_chunk_fn == NULL -#endif - ) -#endif - png_chunk_error(png_ptr, "unknown critical chunk"); - } - -#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) - { - png_unknown_chunk chunk; - -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "unknown chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - png_strcpy((png_charp)chunk.name, (png_charp)png_ptr->chunk_name); - chunk.data = (png_bytep)png_malloc(png_ptr, length); - chunk.size = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)chunk.data, length); -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) - if(png_ptr->read_user_chunk_fn != NULL) - { - /* callback to user unknown chunk handler */ - if ((*(png_ptr->read_user_chunk_fn)) (png_ptr, &chunk) <= 0) - { - if (!(png_ptr->chunk_name[0] & 0x20)) - if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS) - { - png_free(png_ptr, chunk.data); - png_chunk_error(png_ptr, "unknown critical chunk"); - } - png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1); - } - } - else -#endif - png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1); - png_free(png_ptr, chunk.data); - } - else -#endif - skip = length; - - png_crc_finish(png_ptr, skip); - -#if !defined(PNG_READ_USER_CHUNKS_SUPPORTED) - if (&info_ptr == NULL) /* quiet compiler warnings about unused info_ptr */ - return; -#endif -} - -/* This function is called to verify that a chunk name is valid. - This function can't have the "critical chunk check" incorporated - into it, since in the future we will need to be able to call user - functions to handle unknown critical chunks after we check that - the chunk name itself is valid. */ - -#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) - -void /* PRIVATE */ -png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name) -{ - png_debug(1, "in png_check_chunk_name\n"); - if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) || - isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3])) - { - png_chunk_error(png_ptr, "invalid chunk type"); - } -} - -/* Combines the row recently read in with the existing pixels in the - row. This routine takes care of alpha and transparency if requested. - This routine also handles the two methods of progressive display - of interlaced images, depending on the mask value. - The mask value describes which pixels are to be combined with - the row. The pattern always repeats every 8 pixels, so just 8 - bits are needed. A one indicates the pixel is to be combined, - a zero indicates the pixel is to be skipped. This is in addition - to any alpha or transparency value associated with the pixel. If - you want all pixels to be combined, pass 0xff (255) in mask. */ -#ifndef PNG_HAVE_ASSEMBLER_COMBINE_ROW -void /* PRIVATE */ -png_combine_row(png_structp png_ptr, png_bytep row, int mask) -{ - png_debug(1,"in png_combine_row\n"); - if (mask == 0xff) - { - png_memcpy(row, png_ptr->row_buf + 1, - PNG_ROWBYTES(png_ptr->row_info.pixel_depth, png_ptr->width)); - } - else - { - switch (png_ptr->row_info.pixel_depth) - { - case 1: - { - png_bytep sp = png_ptr->row_buf + 1; - png_bytep dp = row; - int s_inc, s_start, s_end; - int m = 0x80; - int shift; - png_uint_32 i; - png_uint_32 row_width = png_ptr->width; - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 7; - s_inc = 1; - } - else -#endif - { - s_start = 7; - s_end = 0; - s_inc = -1; - } - - shift = s_start; - - for (i = 0; i < row_width; i++) - { - if (m & mask) - { - int value; - - value = (*sp >> shift) & 0x01; - *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - case 2: - { - png_bytep sp = png_ptr->row_buf + 1; - png_bytep dp = row; - int s_start, s_end, s_inc; - int m = 0x80; - int shift; - png_uint_32 i; - png_uint_32 row_width = png_ptr->width; - int value; - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 6; - s_inc = 2; - } - else -#endif - { - s_start = 6; - s_end = 0; - s_inc = -2; - } - - shift = s_start; - - for (i = 0; i < row_width; i++) - { - if (m & mask) - { - value = (*sp >> shift) & 0x03; - *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - case 4: - { - png_bytep sp = png_ptr->row_buf + 1; - png_bytep dp = row; - int s_start, s_end, s_inc; - int m = 0x80; - int shift; - png_uint_32 i; - png_uint_32 row_width = png_ptr->width; - int value; - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 4; - s_inc = 4; - } - else -#endif - { - s_start = 4; - s_end = 0; - s_inc = -4; - } - shift = s_start; - - for (i = 0; i < row_width; i++) - { - if (m & mask) - { - value = (*sp >> shift) & 0xf; - *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - default: - { - png_bytep sp = png_ptr->row_buf + 1; - png_bytep dp = row; - png_size_t pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); - png_uint_32 i; - png_uint_32 row_width = png_ptr->width; - png_byte m = 0x80; - - - for (i = 0; i < row_width; i++) - { - if (m & mask) - { - png_memcpy(dp, sp, pixel_bytes); - } - - sp += pixel_bytes; - dp += pixel_bytes; - - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - } - } -} -#endif /* !PNG_HAVE_ASSEMBLER_COMBINE_ROW */ - -#ifdef PNG_READ_INTERLACING_SUPPORTED -#ifndef PNG_HAVE_ASSEMBLER_READ_INTERLACE /* else in pngvcrd.c, pnggccrd.c */ -/* OLD pre-1.0.9 interface: -void png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, - png_uint_32 transformations) - */ -void /* PRIVATE */ -png_do_read_interlace(png_structp png_ptr) -{ - png_row_infop row_info = &(png_ptr->row_info); - png_bytep row = png_ptr->row_buf + 1; - int pass = png_ptr->pass; - png_uint_32 transformations = png_ptr->transformations; -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - /* offset to next interlace block */ - const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -#endif - - png_debug(1,"in png_do_read_interlace (stock C version)\n"); - if (row != NULL && row_info != NULL) - { - png_uint_32 final_width; - - final_width = row_info->width * png_pass_inc[pass]; - - switch (row_info->pixel_depth) - { - case 1: - { - png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3); - png_bytep dp = row + (png_size_t)((final_width - 1) >> 3); - int sshift, dshift; - int s_start, s_end, s_inc; - int jstop = png_pass_inc[pass]; - png_byte v; - png_uint_32 i; - int j; - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (transformations & PNG_PACKSWAP) - { - sshift = (int)((row_info->width + 7) & 0x07); - dshift = (int)((final_width + 7) & 0x07); - s_start = 7; - s_end = 0; - s_inc = -1; - } - else -#endif - { - sshift = 7 - (int)((row_info->width + 7) & 0x07); - dshift = 7 - (int)((final_width + 7) & 0x07); - s_start = 0; - s_end = 7; - s_inc = 1; - } - - for (i = 0; i < row_info->width; i++) - { - v = (png_byte)((*sp >> sshift) & 0x01); - for (j = 0; j < jstop; j++) - { - *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - else - dshift += s_inc; - } - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - else - sshift += s_inc; - } - break; - } - case 2: - { - png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2); - png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2); - int sshift, dshift; - int s_start, s_end, s_inc; - int jstop = png_pass_inc[pass]; - png_uint_32 i; - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (transformations & PNG_PACKSWAP) - { - sshift = (int)(((row_info->width + 3) & 0x03) << 1); - dshift = (int)(((final_width + 3) & 0x03) << 1); - s_start = 6; - s_end = 0; - s_inc = -2; - } - else -#endif - { - sshift = (int)((3 - ((row_info->width + 3) & 0x03)) << 1); - dshift = (int)((3 - ((final_width + 3) & 0x03)) << 1); - s_start = 0; - s_end = 6; - s_inc = 2; - } - - for (i = 0; i < row_info->width; i++) - { - png_byte v; - int j; - - v = (png_byte)((*sp >> sshift) & 0x03); - for (j = 0; j < jstop; j++) - { - *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - else - dshift += s_inc; - } - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - else - sshift += s_inc; - } - break; - } - case 4: - { - png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1); - png_bytep dp = row + (png_size_t)((final_width - 1) >> 1); - int sshift, dshift; - int s_start, s_end, s_inc; - png_uint_32 i; - int jstop = png_pass_inc[pass]; - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (transformations & PNG_PACKSWAP) - { - sshift = (int)(((row_info->width + 1) & 0x01) << 2); - dshift = (int)(((final_width + 1) & 0x01) << 2); - s_start = 4; - s_end = 0; - s_inc = -4; - } - else -#endif - { - sshift = (int)((1 - ((row_info->width + 1) & 0x01)) << 2); - dshift = (int)((1 - ((final_width + 1) & 0x01)) << 2); - s_start = 0; - s_end = 4; - s_inc = 4; - } - - for (i = 0; i < row_info->width; i++) - { - png_byte v = (png_byte)((*sp >> sshift) & 0xf); - int j; - - for (j = 0; j < jstop; j++) - { - *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - else - dshift += s_inc; - } - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - else - sshift += s_inc; - } - break; - } - default: - { - png_size_t pixel_bytes = (row_info->pixel_depth >> 3); - png_bytep sp = row + (png_size_t)(row_info->width - 1) * pixel_bytes; - png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes; - - int jstop = png_pass_inc[pass]; - png_uint_32 i; - - for (i = 0; i < row_info->width; i++) - { - png_byte v[8]; - int j; - - png_memcpy(v, sp, pixel_bytes); - for (j = 0; j < jstop; j++) - { - png_memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - sp -= pixel_bytes; - } - break; - } - } - row_info->width = final_width; - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,final_width); - } -#if !defined(PNG_READ_PACKSWAP_SUPPORTED) - if (&transformations == NULL) /* silence compiler warning */ - return; -#endif -} -#endif /* !PNG_HAVE_ASSEMBLER_READ_INTERLACE */ -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - -#ifndef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW -void /* PRIVATE */ -png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, - png_bytep prev_row, int filter) -{ - png_debug(1, "in png_read_filter_row\n"); - png_debug2(2,"row = %lu, filter = %d\n", png_ptr->row_number, filter); - switch (filter) - { - case PNG_FILTER_VALUE_NONE: - break; - case PNG_FILTER_VALUE_SUB: - { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_bytep rp = row + bpp; - png_bytep lp = row; - - for (i = bpp; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); - rp++; - } - break; - } - case PNG_FILTER_VALUE_UP: - { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_bytep rp = row; - png_bytep pp = prev_row; - - for (i = 0; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); - rp++; - } - break; - } - case PNG_FILTER_VALUE_AVG: - { - png_uint_32 i; - png_bytep rp = row; - png_bytep pp = prev_row; - png_bytep lp = row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 istop = row_info->rowbytes - bpp; - - for (i = 0; i < bpp; i++) - { - *rp = (png_byte)(((int)(*rp) + - ((int)(*pp++) / 2 )) & 0xff); - rp++; - } - - for (i = 0; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + - (int)(*pp++ + *lp++) / 2 ) & 0xff); - rp++; - } - break; - } - case PNG_FILTER_VALUE_PAETH: - { - png_uint_32 i; - png_bytep rp = row; - png_bytep pp = prev_row; - png_bytep lp = row; - png_bytep cp = prev_row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 istop=row_info->rowbytes - bpp; - - for (i = 0; i < bpp; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); - rp++; - } - - for (i = 0; i < istop; i++) /* use leftover rp,pp */ - { - int a, b, c, pa, pb, pc, p; - - a = *lp++; - b = *pp++; - c = *cp++; - - p = b - c; - pc = a - c; - -#ifdef PNG_USE_ABS - pa = abs(p); - pb = abs(pc); - pc = abs(p + pc); -#else - pa = p < 0 ? -p : p; - pb = pc < 0 ? -pc : pc; - pc = (p + pc) < 0 ? -(p + pc) : p + pc; -#endif - - /* - if (pa <= pb && pa <= pc) - p = a; - else if (pb <= pc) - p = b; - else - p = c; - */ - - p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; - - *rp = (png_byte)(((int)(*rp) + p) & 0xff); - rp++; - } - break; - } - default: - png_warning(png_ptr, "Ignoring bad adaptive filter type"); - *row=0; - break; - } -} -#endif /* !PNG_HAVE_ASSEMBLER_READ_FILTER_ROW */ - -void /* PRIVATE */ -png_read_finish_row(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - const int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - const int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - const int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif - - png_debug(1, "in png_read_finish_row\n"); - png_ptr->row_number++; - if (png_ptr->row_number < png_ptr->num_rows) - return; - - if (png_ptr->interlaced) - { - png_ptr->row_number = 0; - png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1); - do - { - png_ptr->pass++; - if (png_ptr->pass >= 7) - break; - png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - - png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, - png_ptr->iwidth) + 1; - - if (!(png_ptr->transformations & PNG_INTERLACE)) - { - png_ptr->num_rows = (png_ptr->height + - png_pass_yinc[png_ptr->pass] - 1 - - png_pass_ystart[png_ptr->pass]) / - png_pass_yinc[png_ptr->pass]; - if (!(png_ptr->num_rows)) - continue; - } - else /* if (png_ptr->transformations & PNG_INTERLACE) */ - break; - } while (png_ptr->iwidth == 0); - - if (png_ptr->pass < 7) - return; - } - - if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) - { -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IDAT; -#endif - char extra; - int ret; - - png_ptr->zstream.next_out = (Byte *)&extra; - png_ptr->zstream.avail_out = (uInt)1; - for(;;) - { - if (!(png_ptr->zstream.avail_in)) - { - while (!png_ptr->idat_size) - { - png_byte chunk_length[4]; - - png_crc_finish(png_ptr, 0); - - png_read_data(png_ptr, chunk_length, 4); - png_ptr->idat_size = png_get_uint_31(png_ptr, chunk_length); - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) - png_error(png_ptr, "Not enough image data"); - - } - png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_in = png_ptr->zbuf; - if (png_ptr->zbuf_size > png_ptr->idat_size) - png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; - png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in); - png_ptr->idat_size -= png_ptr->zstream.avail_in; - } - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret == Z_STREAM_END) - { - if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in || - png_ptr->idat_size) - png_warning(png_ptr, "Extra compressed data"); - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - if (ret != Z_OK) - png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : - "Decompression Error"); - - if (!(png_ptr->zstream.avail_out)) - { - png_warning(png_ptr, "Extra compressed data."); - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - - } - png_ptr->zstream.avail_out = 0; - } - - if (png_ptr->idat_size || png_ptr->zstream.avail_in) - png_warning(png_ptr, "Extra compression data"); - - inflateReset(&png_ptr->zstream); - - png_ptr->mode |= PNG_AFTER_IDAT; -} - -void /* PRIVATE */ -png_read_start_row(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - const int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - const int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - const int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif - - int max_pixel_depth; - png_uint_32 row_bytes; - - png_debug(1, "in png_read_start_row\n"); - png_ptr->zstream.avail_in = 0; - png_init_read_transformations(png_ptr); - if (png_ptr->interlaced) - { - if (!(png_ptr->transformations & PNG_INTERLACE)) - png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - - png_pass_ystart[0]) / png_pass_yinc[0]; - else - png_ptr->num_rows = png_ptr->height; - - png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - - row_bytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->iwidth) + 1; - - png_ptr->irowbytes = (png_size_t)row_bytes; - if((png_uint_32)png_ptr->irowbytes != row_bytes) - png_error(png_ptr, "Rowbytes overflow in png_read_start_row"); - } - else - { - png_ptr->num_rows = png_ptr->height; - png_ptr->iwidth = png_ptr->width; - png_ptr->irowbytes = png_ptr->rowbytes + 1; - } - max_pixel_depth = png_ptr->pixel_depth; - -#if defined(PNG_READ_PACK_SUPPORTED) - if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8) - max_pixel_depth = 8; -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) - if (png_ptr->transformations & PNG_EXPAND) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (png_ptr->num_trans) - max_pixel_depth = 32; - else - max_pixel_depth = 24; - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) - { - if (max_pixel_depth < 8) - max_pixel_depth = 8; - if (png_ptr->num_trans) - max_pixel_depth *= 2; - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) - { - if (png_ptr->num_trans) - { - max_pixel_depth *= 4; - max_pixel_depth /= 3; - } - } - } -#endif - -#if defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & (PNG_FILLER)) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - max_pixel_depth = 32; - else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) - { - if (max_pixel_depth <= 8) - max_pixel_depth = 16; - else - max_pixel_depth = 32; - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) - { - if (max_pixel_depth <= 32) - max_pixel_depth = 32; - else - max_pixel_depth = 64; - } - } -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) - if (png_ptr->transformations & PNG_GRAY_TO_RGB) - { - if ( -#if defined(PNG_READ_EXPAND_SUPPORTED) - (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || -#endif -#if defined(PNG_READ_FILLER_SUPPORTED) - (png_ptr->transformations & (PNG_FILLER)) || -#endif - png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - if (max_pixel_depth <= 16) - max_pixel_depth = 32; - else - max_pixel_depth = 64; - } - else - { - if (max_pixel_depth <= 8) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - max_pixel_depth = 32; - else - max_pixel_depth = 24; - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - max_pixel_depth = 64; - else - max_pixel_depth = 48; - } - } -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \ -defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) - if(png_ptr->transformations & PNG_USER_TRANSFORM) - { - int user_pixel_depth=png_ptr->user_transform_depth* - png_ptr->user_transform_channels; - if(user_pixel_depth > max_pixel_depth) - max_pixel_depth=user_pixel_depth; - } -#endif - - /* align the width on the next larger 8 pixels. Mainly used - for interlacing */ - row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7)); - /* calculate the maximum bytes needed, adding a byte and a pixel - for safety's sake */ - row_bytes = PNG_ROWBYTES(max_pixel_depth,row_bytes) + - 1 + ((max_pixel_depth + 7) >> 3); -#ifdef PNG_MAX_MALLOC_64K - if (row_bytes > (png_uint_32)65536L) - png_error(png_ptr, "This image requires a row greater than 64KB"); -#endif - png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes+64); - png_ptr->row_buf = png_ptr->big_row_buf+32; -#if defined(PNG_DEBUG) && defined(PNG_USE_PNGGCCRD) - png_ptr->row_buf_size = row_bytes; -#endif - -#ifdef PNG_MAX_MALLOC_64K - if ((png_uint_32)png_ptr->rowbytes + 1 > (png_uint_32)65536L) - png_error(png_ptr, "This image requires a row greater than 64KB"); -#endif - if ((png_uint_32)png_ptr->rowbytes > PNG_SIZE_MAX - 1) - png_error(png_ptr, "Row has too many bytes to allocate in memory."); - png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)( - png_ptr->rowbytes + 1)); - - png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1); - - png_debug1(3, "width = %lu,\n", png_ptr->width); - png_debug1(3, "height = %lu,\n", png_ptr->height); - png_debug1(3, "iwidth = %lu,\n", png_ptr->iwidth); - png_debug1(3, "num_rows = %lu\n", png_ptr->num_rows); - png_debug1(3, "rowbytes = %lu,\n", png_ptr->rowbytes); - png_debug1(3, "irowbytes = %lu,\n", png_ptr->irowbytes); - - png_ptr->flags |= PNG_FLAG_ROW_INIT; -} diff --git a/src/SFML/Graphics/libpng/pngset.c b/src/SFML/Graphics/libpng/pngset.c deleted file mode 100644 index d88363fc..00000000 --- a/src/SFML/Graphics/libpng/pngset.c +++ /dev/null @@ -1,1219 +0,0 @@ - -/* pngset.c - storage of image information into info struct - * - * libpng 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * The functions here are used during reads to store data from the file - * into the info struct, and during writes to store application data - * into the info struct for writing into the file. This abstracts the - * info struct and allows us to change the structure in the future. - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_bKGD_SUPPORTED) -void PNGAPI -png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background) -{ - png_debug1(1, "in %s storage function\n", "bKGD"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16)); - info_ptr->valid |= PNG_INFO_bKGD; -} -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_cHRM(png_structp png_ptr, png_infop info_ptr, - double white_x, double white_y, double red_x, double red_y, - double green_x, double green_y, double blue_x, double blue_y) -{ - png_debug1(1, "in %s storage function\n", "cHRM"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (white_x < 0.0 || white_y < 0.0 || - red_x < 0.0 || red_y < 0.0 || - green_x < 0.0 || green_y < 0.0 || - blue_x < 0.0 || blue_y < 0.0) - { - png_warning(png_ptr, - "Ignoring attempt to set negative chromaticity value"); - return; - } - if (white_x > 21474.83 || white_y > 21474.83 || - red_x > 21474.83 || red_y > 21474.83 || - green_x > 21474.83 || green_y > 21474.83 || - blue_x > 21474.83 || blue_y > 21474.83) - { - png_warning(png_ptr, - "Ignoring attempt to set chromaticity value exceeding 21474.83"); - return; - } - - info_ptr->x_white = (float)white_x; - info_ptr->y_white = (float)white_y; - info_ptr->x_red = (float)red_x; - info_ptr->y_red = (float)red_y; - info_ptr->x_green = (float)green_x; - info_ptr->y_green = (float)green_y; - info_ptr->x_blue = (float)blue_x; - info_ptr->y_blue = (float)blue_y; -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_x_white = (png_fixed_point)(white_x*100000.+0.5); - info_ptr->int_y_white = (png_fixed_point)(white_y*100000.+0.5); - info_ptr->int_x_red = (png_fixed_point)( red_x*100000.+0.5); - info_ptr->int_y_red = (png_fixed_point)( red_y*100000.+0.5); - info_ptr->int_x_green = (png_fixed_point)(green_x*100000.+0.5); - info_ptr->int_y_green = (png_fixed_point)(green_y*100000.+0.5); - info_ptr->int_x_blue = (png_fixed_point)( blue_x*100000.+0.5); - info_ptr->int_y_blue = (png_fixed_point)( blue_y*100000.+0.5); -#endif - info_ptr->valid |= PNG_INFO_cHRM; -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -void PNGAPI -png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, - png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, - png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, - png_fixed_point blue_x, png_fixed_point blue_y) -{ - png_debug1(1, "in %s storage function\n", "cHRM"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (white_x < 0 || white_y < 0 || - red_x < 0 || red_y < 0 || - green_x < 0 || green_y < 0 || - blue_x < 0 || blue_y < 0) - { - png_warning(png_ptr, - "Ignoring attempt to set negative chromaticity value"); - return; - } - if (white_x > (double) PNG_UINT_31_MAX || - white_y > (double) PNG_UINT_31_MAX || - red_x > (double) PNG_UINT_31_MAX || - red_y > (double) PNG_UINT_31_MAX || - green_x > (double) PNG_UINT_31_MAX || - green_y > (double) PNG_UINT_31_MAX || - blue_x > (double) PNG_UINT_31_MAX || - blue_y > (double) PNG_UINT_31_MAX) - { - png_warning(png_ptr, - "Ignoring attempt to set chromaticity value exceeding 21474.83"); - return; - } - info_ptr->int_x_white = white_x; - info_ptr->int_y_white = white_y; - info_ptr->int_x_red = red_x; - info_ptr->int_y_red = red_y; - info_ptr->int_x_green = green_x; - info_ptr->int_y_green = green_y; - info_ptr->int_x_blue = blue_x; - info_ptr->int_y_blue = blue_y; -#ifdef PNG_FLOATING_POINT_SUPPORTED - info_ptr->x_white = (float)(white_x/100000.); - info_ptr->y_white = (float)(white_y/100000.); - info_ptr->x_red = (float)( red_x/100000.); - info_ptr->y_red = (float)( red_y/100000.); - info_ptr->x_green = (float)(green_x/100000.); - info_ptr->y_green = (float)(green_y/100000.); - info_ptr->x_blue = (float)( blue_x/100000.); - info_ptr->y_blue = (float)( blue_y/100000.); -#endif - info_ptr->valid |= PNG_INFO_cHRM; -} -#endif -#endif - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma) -{ - double gamma; - png_debug1(1, "in %s storage function\n", "gAMA"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* Check for overflow */ - if (file_gamma > 21474.83) - { - png_warning(png_ptr, "Limiting gamma to 21474.83"); - gamma=21474.83; - } - else - gamma=file_gamma; - info_ptr->gamma = (float)gamma; -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_gamma = (int)(gamma*100000.+.5); -#endif - info_ptr->valid |= PNG_INFO_gAMA; - if(gamma == 0.0) - png_warning(png_ptr, "Setting gamma=0"); -} -#endif -void PNGAPI -png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point - int_gamma) -{ - png_fixed_point gamma; - - png_debug1(1, "in %s storage function\n", "gAMA"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (int_gamma > (png_fixed_point) PNG_UINT_31_MAX) - { - png_warning(png_ptr, "Limiting gamma to 21474.83"); - gamma=PNG_UINT_31_MAX; - } - else - { - if (int_gamma < 0) - { - png_warning(png_ptr, "Setting negative gamma to zero"); - gamma=0; - } - else - gamma=int_gamma; - } -#ifdef PNG_FLOATING_POINT_SUPPORTED - info_ptr->gamma = (float)(gamma/100000.); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_gamma = gamma; -#endif - info_ptr->valid |= PNG_INFO_gAMA; - if(gamma == 0) - png_warning(png_ptr, "Setting gamma=0"); -} -#endif - -#if defined(PNG_hIST_SUPPORTED) -void PNGAPI -png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist) -{ - int i; - - png_debug1(1, "in %s storage function\n", "hIST"); - if (png_ptr == NULL || info_ptr == NULL) - return; - if (info_ptr->num_palette == 0) - { - png_warning(png_ptr, - "Palette size 0, hIST allocation skipped."); - return; - } - -#ifdef PNG_FREE_ME_SUPPORTED - png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); -#endif - /* Changed from info->num_palette to 256 in version 1.2.1 */ - png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr, - (png_uint_32)(256 * png_sizeof (png_uint_16))); - if (png_ptr->hist == NULL) - { - png_warning(png_ptr, "Insufficient memory for hIST chunk data."); - return; - } - - for (i = 0; i < info_ptr->num_palette; i++) - png_ptr->hist[i] = hist[i]; - info_ptr->hist = png_ptr->hist; - info_ptr->valid |= PNG_INFO_hIST; - -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_HIST; -#else - png_ptr->flags |= PNG_FLAG_FREE_HIST; -#endif -} -#endif - -void PNGAPI -png_set_IHDR(png_structp png_ptr, png_infop info_ptr, - png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_type, int compression_type, - int filter_type) -{ - png_debug1(1, "in %s storage function\n", "IHDR"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* check for width and height valid values */ - if (width == 0 || height == 0) - png_error(png_ptr, "Image width or height is zero in IHDR"); -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - if (width > png_ptr->user_width_max || height > png_ptr->user_height_max) - png_error(png_ptr, "image size exceeds user limits in IHDR"); -#else - if (width > PNG_USER_WIDTH_MAX || height > PNG_USER_HEIGHT_MAX) - png_error(png_ptr, "image size exceeds user limits in IHDR"); -#endif - if (width > PNG_UINT_31_MAX || height > PNG_UINT_31_MAX) - png_error(png_ptr, "Invalid image size in IHDR"); - if ( width > (PNG_UINT_32_MAX - >> 3) /* 8-byte RGBA pixels */ - - 64 /* bigrowbuf hack */ - - 1 /* filter byte */ - - 7*8 /* rounding of width to multiple of 8 pixels */ - - 8) /* extra max_pixel_depth pad */ - png_warning(png_ptr, "Width is too large for libpng to process pixels"); - - /* check other values */ - if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 && - bit_depth != 8 && bit_depth != 16) - png_error(png_ptr, "Invalid bit depth in IHDR"); - - if (color_type < 0 || color_type == 1 || - color_type == 5 || color_type > 6) - png_error(png_ptr, "Invalid color type in IHDR"); - - if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) || - ((color_type == PNG_COLOR_TYPE_RGB || - color_type == PNG_COLOR_TYPE_GRAY_ALPHA || - color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8)) - png_error(png_ptr, "Invalid color type/bit depth combination in IHDR"); - - if (interlace_type >= PNG_INTERLACE_LAST) - png_error(png_ptr, "Unknown interlace method in IHDR"); - - if (compression_type != PNG_COMPRESSION_TYPE_BASE) - png_error(png_ptr, "Unknown compression method in IHDR"); - -#if defined(PNG_MNG_FEATURES_SUPPORTED) - /* Accept filter_method 64 (intrapixel differencing) only if - * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and - * 2. Libpng did not read a PNG signature (this filter_method is only - * used in PNG datastreams that are embedded in MNG datastreams) and - * 3. The application called png_permit_mng_features with a mask that - * included PNG_FLAG_MNG_FILTER_64 and - * 4. The filter_method is 64 and - * 5. The color_type is RGB or RGBA - */ - if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted) - png_warning(png_ptr,"MNG features are not allowed in a PNG datastream\n"); - if(filter_type != PNG_FILTER_TYPE_BASE) - { - if(!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && - ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && - (color_type == PNG_COLOR_TYPE_RGB || - color_type == PNG_COLOR_TYPE_RGB_ALPHA))) - png_error(png_ptr, "Unknown filter method in IHDR"); - if(png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) - png_warning(png_ptr, "Invalid filter method in IHDR"); - } -#else - if(filter_type != PNG_FILTER_TYPE_BASE) - png_error(png_ptr, "Unknown filter method in IHDR"); -#endif - - info_ptr->width = width; - info_ptr->height = height; - info_ptr->bit_depth = (png_byte)bit_depth; - info_ptr->color_type =(png_byte) color_type; - info_ptr->compression_type = (png_byte)compression_type; - info_ptr->filter_type = (png_byte)filter_type; - info_ptr->interlace_type = (png_byte)interlace_type; - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - info_ptr->channels = 1; - else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) - info_ptr->channels = 3; - else - info_ptr->channels = 1; - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) - info_ptr->channels++; - info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); - - /* check for potential overflow */ - if ( width > (PNG_UINT_32_MAX - >> 3) /* 8-byte RGBA pixels */ - - 64 /* bigrowbuf hack */ - - 1 /* filter byte */ - - 7*8 /* rounding of width to multiple of 8 pixels */ - - 8) /* extra max_pixel_depth pad */ - info_ptr->rowbytes = (png_size_t)0; - else - info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,width); -} - -#if defined(PNG_oFFs_SUPPORTED) -void PNGAPI -png_set_oFFs(png_structp png_ptr, png_infop info_ptr, - png_int_32 offset_x, png_int_32 offset_y, int unit_type) -{ - png_debug1(1, "in %s storage function\n", "oFFs"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->x_offset = offset_x; - info_ptr->y_offset = offset_y; - info_ptr->offset_unit_type = (png_byte)unit_type; - info_ptr->valid |= PNG_INFO_oFFs; -} -#endif - -#if defined(PNG_pCAL_SUPPORTED) -void PNGAPI -png_set_pCAL(png_structp png_ptr, png_infop info_ptr, - png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, - png_charp units, png_charpp params) -{ - png_uint_32 length; - int i; - - png_debug1(1, "in %s storage function\n", "pCAL"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - length = png_strlen(purpose) + 1; - png_debug1(3, "allocating purpose for info (%lu bytes)\n", length); - info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length); - if (info_ptr->pcal_purpose == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL purpose."); - return; - } - png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length); - - png_debug(3, "storing X0, X1, type, and nparams in info\n"); - info_ptr->pcal_X0 = X0; - info_ptr->pcal_X1 = X1; - info_ptr->pcal_type = (png_byte)type; - info_ptr->pcal_nparams = (png_byte)nparams; - - length = png_strlen(units) + 1; - png_debug1(3, "allocating units for info (%lu bytes)\n", length); - info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length); - if (info_ptr->pcal_units == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL units."); - return; - } - png_memcpy(info_ptr->pcal_units, units, (png_size_t)length); - - info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr, - (png_uint_32)((nparams + 1) * png_sizeof(png_charp))); - if (info_ptr->pcal_params == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL params."); - return; - } - - info_ptr->pcal_params[nparams] = NULL; - - for (i = 0; i < nparams; i++) - { - length = png_strlen(params[i]) + 1; - png_debug2(3, "allocating parameter %d for info (%lu bytes)\n", i, length); - info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length); - if (info_ptr->pcal_params[i] == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL parameter."); - return; - } - png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length); - } - - info_ptr->valid |= PNG_INFO_pCAL; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_PCAL; -#endif -} -#endif - -#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_sCAL(png_structp png_ptr, png_infop info_ptr, - int unit, double width, double height) -{ - png_debug1(1, "in %s storage function\n", "sCAL"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->scal_unit = (png_byte)unit; - info_ptr->scal_pixel_width = width; - info_ptr->scal_pixel_height = height; - - info_ptr->valid |= PNG_INFO_sCAL; -} -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -void PNGAPI -png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr, - int unit, png_charp swidth, png_charp sheight) -{ - png_uint_32 length; - - png_debug1(1, "in %s storage function\n", "sCAL"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->scal_unit = (png_byte)unit; - - length = png_strlen(swidth) + 1; - png_debug1(3, "allocating unit for info (%d bytes)\n", length); - info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length); - if (info_ptr->scal_s_width == NULL) - { - png_warning(png_ptr, "Memory allocation failed while processing sCAL."); - } - png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length); - - length = png_strlen(sheight) + 1; - png_debug1(3, "allocating unit for info (%d bytes)\n", length); - info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length); - if (info_ptr->scal_s_height == NULL) - { - png_free (png_ptr, info_ptr->scal_s_width); - png_warning(png_ptr, "Memory allocation failed while processing sCAL."); - } - png_memcpy(info_ptr->scal_s_height, sheight, (png_size_t)length); - - info_ptr->valid |= PNG_INFO_sCAL; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_SCAL; -#endif -} -#endif -#endif -#endif - -#if defined(PNG_pHYs_SUPPORTED) -void PNGAPI -png_set_pHYs(png_structp png_ptr, png_infop info_ptr, - png_uint_32 res_x, png_uint_32 res_y, int unit_type) -{ - png_debug1(1, "in %s storage function\n", "pHYs"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->x_pixels_per_unit = res_x; - info_ptr->y_pixels_per_unit = res_y; - info_ptr->phys_unit_type = (png_byte)unit_type; - info_ptr->valid |= PNG_INFO_pHYs; -} -#endif - -void PNGAPI -png_set_PLTE(png_structp png_ptr, png_infop info_ptr, - png_colorp palette, int num_palette) -{ - - png_debug1(1, "in %s storage function\n", "PLTE"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* - * It may not actually be necessary to set png_ptr->palette here; - * we do it for backward compatibility with the way the png_handle_tRNS - * function used to do the allocation. - */ -#ifdef PNG_FREE_ME_SUPPORTED - png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); -#endif - - /* Changed in libpng-1.2.1 to allocate 256 instead of num_palette entries, - in case of an invalid PNG file that has too-large sample values. */ - png_ptr->palette = (png_colorp)png_malloc(png_ptr, - 256 * png_sizeof(png_color)); - png_memset(png_ptr->palette, 0, 256 * png_sizeof(png_color)); - png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof (png_color)); - info_ptr->palette = png_ptr->palette; - info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; - -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_PLTE; -#else - png_ptr->flags |= PNG_FLAG_FREE_PLTE; -#endif - - info_ptr->valid |= PNG_INFO_PLTE; -} - -#if defined(PNG_sBIT_SUPPORTED) -void PNGAPI -png_set_sBIT(png_structp png_ptr, png_infop info_ptr, - png_color_8p sig_bit) -{ - png_debug1(1, "in %s storage function\n", "sBIT"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof (png_color_8)); - info_ptr->valid |= PNG_INFO_sBIT; -} -#endif - -#if defined(PNG_sRGB_SUPPORTED) -void PNGAPI -png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent) -{ - png_debug1(1, "in %s storage function\n", "sRGB"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->srgb_intent = (png_byte)intent; - info_ptr->valid |= PNG_INFO_sRGB; -} - -void PNGAPI -png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr, - int intent) -{ -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED - float file_gamma; -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_fixed_point int_file_gamma; -#endif -#endif -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED - float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, - int_green_y, int_blue_x, int_blue_y; -#endif -#endif - png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - png_set_sRGB(png_ptr, info_ptr, intent); - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED - file_gamma = (float).45455; - png_set_gAMA(png_ptr, info_ptr, file_gamma); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - int_file_gamma = 45455L; - png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); -#endif -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FIXED_POINT_SUPPORTED - int_white_x = 31270L; - int_white_y = 32900L; - int_red_x = 64000L; - int_red_y = 33000L; - int_green_x = 30000L; - int_green_y = 60000L; - int_blue_x = 15000L; - int_blue_y = 6000L; - - png_set_cHRM_fixed(png_ptr, info_ptr, - int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, int_green_y, - int_blue_x, int_blue_y); -#endif -#ifdef PNG_FLOATING_POINT_SUPPORTED - white_x = (float).3127; - white_y = (float).3290; - red_x = (float).64; - red_y = (float).33; - green_x = (float).30; - green_y = (float).60; - blue_x = (float).15; - blue_y = (float).06; - - png_set_cHRM(png_ptr, info_ptr, - white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); -#endif -#endif -} -#endif - - -#if defined(PNG_iCCP_SUPPORTED) -void PNGAPI -png_set_iCCP(png_structp png_ptr, png_infop info_ptr, - png_charp name, int compression_type, - png_charp profile, png_uint_32 proflen) -{ - png_charp new_iccp_name; - png_charp new_iccp_profile; - - png_debug1(1, "in %s storage function\n", "iCCP"); - if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL) - return; - - new_iccp_name = (png_charp)png_malloc_warn(png_ptr, png_strlen(name)+1); - if (new_iccp_name == NULL) - { - png_warning(png_ptr, "Insufficient memory to process iCCP chunk."); - return; - } - png_strcpy(new_iccp_name, name); - new_iccp_profile = (png_charp)png_malloc_warn(png_ptr, proflen); - if (new_iccp_profile == NULL) - { - png_free (png_ptr, new_iccp_name); - png_warning(png_ptr, "Insufficient memory to process iCCP profile."); - return; - } - png_memcpy(new_iccp_profile, profile, (png_size_t)proflen); - - png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0); - - info_ptr->iccp_proflen = proflen; - info_ptr->iccp_name = new_iccp_name; - info_ptr->iccp_profile = new_iccp_profile; - /* Compression is always zero but is here so the API and info structure - * does not have to change if we introduce multiple compression types */ - info_ptr->iccp_compression = (png_byte)compression_type; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_ICCP; -#endif - info_ptr->valid |= PNG_INFO_iCCP; -} -#endif - -#if defined(PNG_TEXT_SUPPORTED) -void PNGAPI -png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, - int num_text) -{ - int ret; - ret=png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); - if (ret) - png_error(png_ptr, "Insufficient memory to store text"); -} - -int /* PRIVATE */ -png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, - int num_text) -{ - int i; - - png_debug1(1, "in %s storage function\n", (png_ptr->chunk_name[0] == '\0' ? - "text" : (png_const_charp)png_ptr->chunk_name)); - - if (png_ptr == NULL || info_ptr == NULL || num_text == 0) - return(0); - - /* Make sure we have enough space in the "text" array in info_struct - * to hold all of the incoming text_ptr objects. - */ - if (info_ptr->num_text + num_text > info_ptr->max_text) - { - if (info_ptr->text != NULL) - { - png_textp old_text; - int old_max; - - old_max = info_ptr->max_text; - info_ptr->max_text = info_ptr->num_text + num_text + 8; - old_text = info_ptr->text; - info_ptr->text = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)(info_ptr->max_text * png_sizeof (png_text))); - if (info_ptr->text == NULL) - { - png_free(png_ptr, old_text); - return(1); - } - png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * - png_sizeof(png_text))); - png_free(png_ptr, old_text); - } - else - { - info_ptr->max_text = num_text + 8; - info_ptr->num_text = 0; - info_ptr->text = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)(info_ptr->max_text * png_sizeof (png_text))); - if (info_ptr->text == NULL) - return(1); -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_TEXT; -#endif - } - png_debug1(3, "allocated %d entries for info_ptr->text\n", - info_ptr->max_text); - } - for (i = 0; i < num_text; i++) - { - png_size_t text_length,key_len; - png_size_t lang_len,lang_key_len; - png_textp textp = &(info_ptr->text[info_ptr->num_text]); - - if (text_ptr[i].key == NULL) - continue; - - key_len = png_strlen(text_ptr[i].key); - - if(text_ptr[i].compression <= 0) - { - lang_len = 0; - lang_key_len = 0; - } - else -#ifdef PNG_iTXt_SUPPORTED - { - /* set iTXt data */ - if (text_ptr[i].lang != NULL) - lang_len = png_strlen(text_ptr[i].lang); - else - lang_len = 0; - if (text_ptr[i].lang_key != NULL) - lang_key_len = png_strlen(text_ptr[i].lang_key); - else - lang_key_len = 0; - } -#else - { - png_warning(png_ptr, "iTXt chunk not supported."); - continue; - } -#endif - - if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0') - { - text_length = 0; -#ifdef PNG_iTXt_SUPPORTED - if(text_ptr[i].compression > 0) - textp->compression = PNG_ITXT_COMPRESSION_NONE; - else -#endif - textp->compression = PNG_TEXT_COMPRESSION_NONE; - } - else - { - text_length = png_strlen(text_ptr[i].text); - textp->compression = text_ptr[i].compression; - } - - textp->key = (png_charp)png_malloc_warn(png_ptr, - (png_uint_32)(key_len + text_length + lang_len + lang_key_len + 4)); - if (textp->key == NULL) - return(1); - png_debug2(2, "Allocated %lu bytes at %x in png_set_text\n", - (png_uint_32)(key_len + lang_len + lang_key_len + text_length + 4), - (int)textp->key); - - png_memcpy(textp->key, text_ptr[i].key, - (png_size_t)(key_len)); - *(textp->key+key_len) = '\0'; -#ifdef PNG_iTXt_SUPPORTED - if (text_ptr[i].compression > 0) - { - textp->lang=textp->key + key_len + 1; - png_memcpy(textp->lang, text_ptr[i].lang, lang_len); - *(textp->lang+lang_len) = '\0'; - textp->lang_key=textp->lang + lang_len + 1; - png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len); - *(textp->lang_key+lang_key_len) = '\0'; - textp->text=textp->lang_key + lang_key_len + 1; - } - else -#endif - { -#ifdef PNG_iTXt_SUPPORTED - textp->lang=NULL; - textp->lang_key=NULL; -#endif - textp->text=textp->key + key_len + 1; - } - if(text_length) - png_memcpy(textp->text, text_ptr[i].text, - (png_size_t)(text_length)); - *(textp->text+text_length) = '\0'; - -#ifdef PNG_iTXt_SUPPORTED - if(textp->compression > 0) - { - textp->text_length = 0; - textp->itxt_length = text_length; - } - else -#endif - { - textp->text_length = text_length; -#ifdef PNG_iTXt_SUPPORTED - textp->itxt_length = 0; -#endif - } - info_ptr->text[info_ptr->num_text]= *textp; - info_ptr->num_text++; - png_debug1(3, "transferred text chunk %d\n", info_ptr->num_text); - } - return(0); -} -#endif - -#if defined(PNG_tIME_SUPPORTED) -void PNGAPI -png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time) -{ - png_debug1(1, "in %s storage function\n", "tIME"); - if (png_ptr == NULL || info_ptr == NULL || - (png_ptr->mode & PNG_WROTE_tIME)) - return; - - png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof (png_time)); - info_ptr->valid |= PNG_INFO_tIME; -} -#endif - -#if defined(PNG_tRNS_SUPPORTED) -void PNGAPI -png_set_tRNS(png_structp png_ptr, png_infop info_ptr, - png_bytep trans, int num_trans, png_color_16p trans_values) -{ - png_debug1(1, "in %s storage function\n", "tRNS"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (trans != NULL) - { - /* - * It may not actually be necessary to set png_ptr->trans here; - * we do it for backward compatibility with the way the png_handle_tRNS - * function used to do the allocation. - */ -#ifdef PNG_FREE_ME_SUPPORTED - png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); -#endif - /* Changed from num_trans to 256 in version 1.2.1 */ - png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans); -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_TRNS; -#else - png_ptr->flags |= PNG_FLAG_FREE_TRNS; -#endif - } - - if (trans_values != NULL) - { - png_memcpy(&(info_ptr->trans_values), trans_values, - png_sizeof(png_color_16)); - if (num_trans == 0) - num_trans = 1; - } - info_ptr->num_trans = (png_uint_16)num_trans; - info_ptr->valid |= PNG_INFO_tRNS; -} -#endif - -#if defined(PNG_sPLT_SUPPORTED) -void PNGAPI -png_set_sPLT(png_structp png_ptr, - png_infop info_ptr, png_sPLT_tp entries, int nentries) -{ - png_sPLT_tp np; - int i; - - np = (png_sPLT_tp)png_malloc_warn(png_ptr, - (info_ptr->splt_palettes_num + nentries) * png_sizeof(png_sPLT_t)); - if (np == NULL) - { - png_warning(png_ptr, "No memory for sPLT palettes."); - return; - } - - png_memcpy(np, info_ptr->splt_palettes, - info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t)); - png_free(png_ptr, info_ptr->splt_palettes); - info_ptr->splt_palettes=NULL; - - for (i = 0; i < nentries; i++) - { - png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; - png_sPLT_tp from = entries + i; - - to->name = (png_charp)png_malloc(png_ptr, - png_strlen(from->name) + 1); - /* TODO: use png_malloc_warn */ - png_strcpy(to->name, from->name); - to->entries = (png_sPLT_entryp)png_malloc(png_ptr, - from->nentries * png_sizeof(png_sPLT_t)); - /* TODO: use png_malloc_warn */ - png_memcpy(to->entries, from->entries, - from->nentries * png_sizeof(png_sPLT_t)); - to->nentries = from->nentries; - to->depth = from->depth; - } - - info_ptr->splt_palettes = np; - info_ptr->splt_palettes_num += nentries; - info_ptr->valid |= PNG_INFO_sPLT; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_SPLT; -#endif -} -#endif /* PNG_sPLT_SUPPORTED */ - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -void PNGAPI -png_set_unknown_chunks(png_structp png_ptr, - png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns) -{ - png_unknown_chunkp np; - int i; - - if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0) - return; - - np = (png_unknown_chunkp)png_malloc_warn(png_ptr, - (info_ptr->unknown_chunks_num + num_unknowns) * - png_sizeof(png_unknown_chunk)); - if (np == NULL) - { - png_warning(png_ptr, "Out of memory while processing unknown chunk."); - return; - } - - png_memcpy(np, info_ptr->unknown_chunks, - info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk)); - png_free(png_ptr, info_ptr->unknown_chunks); - info_ptr->unknown_chunks=NULL; - - for (i = 0; i < num_unknowns; i++) - { - png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; - png_unknown_chunkp from = unknowns + i; - - png_strncpy((png_charp)to->name, (png_charp)from->name, 5); - to->data = (png_bytep)png_malloc_warn(png_ptr, from->size); - if (to->data == NULL) - { - png_warning(png_ptr, "Out of memory processing unknown chunk."); - } - else - { - png_memcpy(to->data, from->data, from->size); - to->size = from->size; - - /* note our location in the read or write sequence */ - to->location = (png_byte)(png_ptr->mode & 0xff); - } - } - - info_ptr->unknown_chunks = np; - info_ptr->unknown_chunks_num += num_unknowns; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_UNKN; -#endif -} -void PNGAPI -png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr, - int chunk, int location) -{ - if(png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk < - (int)info_ptr->unknown_chunks_num) - info_ptr->unknown_chunks[chunk].location = (png_byte)location; -} -#endif - -#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ - defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) -void PNGAPI -png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted) -{ - /* This function is deprecated in favor of png_permit_mng_features() - and will be removed from libpng-2.0.0 */ - png_debug(1, "in png_permit_empty_plte, DEPRECATED.\n"); - if (png_ptr == NULL) - return; - png_ptr->mng_features_permitted = (png_byte) - ((png_ptr->mng_features_permitted & (~(PNG_FLAG_MNG_EMPTY_PLTE))) | - ((empty_plte_permitted & PNG_FLAG_MNG_EMPTY_PLTE))); -} -#endif - -#if defined(PNG_MNG_FEATURES_SUPPORTED) -png_uint_32 PNGAPI -png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features) -{ - png_debug(1, "in png_permit_mng_features\n"); - if (png_ptr == NULL) - return (png_uint_32)0; - png_ptr->mng_features_permitted = - (png_byte)(mng_features & PNG_ALL_MNG_FEATURES); - return (png_uint_32)png_ptr->mng_features_permitted; -} -#endif - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -void PNGAPI -png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep - chunk_list, int num_chunks) -{ - png_bytep new_list, p; - int i, old_num_chunks; - if (num_chunks == 0) - { - if(keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE) - png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS; - else - png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; - - if(keep == PNG_HANDLE_CHUNK_ALWAYS) - png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS; - else - png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS; - return; - } - if (chunk_list == NULL) - return; - old_num_chunks=png_ptr->num_chunk_list; - new_list=(png_bytep)png_malloc(png_ptr, - (png_uint_32)(5*(num_chunks+old_num_chunks))); - if(png_ptr->chunk_list != NULL) - { - png_memcpy(new_list, png_ptr->chunk_list, - (png_size_t)(5*old_num_chunks)); - png_free(png_ptr, png_ptr->chunk_list); - png_ptr->chunk_list=NULL; - } - png_memcpy(new_list+5*old_num_chunks, chunk_list, - (png_size_t)(5*num_chunks)); - for (p=new_list+5*old_num_chunks+4, i=0; inum_chunk_list=old_num_chunks+num_chunks; - png_ptr->chunk_list=new_list; -#ifdef PNG_FREE_ME_SUPPORTED - png_ptr->free_me |= PNG_FREE_LIST; -#endif -} -#endif - -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) -void PNGAPI -png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr, - png_user_chunk_ptr read_user_chunk_fn) -{ - png_debug(1, "in png_set_read_user_chunk_fn\n"); - png_ptr->read_user_chunk_fn = read_user_chunk_fn; - png_ptr->user_chunk_ptr = user_chunk_ptr; -} -#endif - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -void PNGAPI -png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers) -{ - png_debug1(1, "in %s storage function\n", "rows"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - if(info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers)) - png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); - info_ptr->row_pointers = row_pointers; - if(row_pointers) - info_ptr->valid |= PNG_INFO_IDAT; -} -#endif - -#ifdef PNG_WRITE_SUPPORTED -void PNGAPI -png_set_compression_buffer_size(png_structp png_ptr, png_uint_32 size) -{ - if(png_ptr->zbuf) - png_free(png_ptr, png_ptr->zbuf); - png_ptr->zbuf_size = (png_size_t)size; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; -} -#endif - -void PNGAPI -png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask) -{ - if (png_ptr && info_ptr) - info_ptr->valid &= ~(mask); -} - - -#ifndef PNG_1_0_X -#ifdef PNG_ASSEMBLER_CODE_SUPPORTED -/* this function was added to libpng 1.2.0 and should always exist by default */ -void PNGAPI -png_set_asm_flags (png_structp png_ptr, png_uint_32 asm_flags) -{ - png_uint_32 settable_asm_flags; - png_uint_32 settable_mmx_flags; - - settable_mmx_flags = -#ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW - PNG_ASM_FLAG_MMX_READ_COMBINE_ROW | -#endif -#ifdef PNG_HAVE_ASSEMBLER_READ_INTERLACE - PNG_ASM_FLAG_MMX_READ_INTERLACE | -#endif -#ifdef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW - PNG_ASM_FLAG_MMX_READ_FILTER_SUB | - PNG_ASM_FLAG_MMX_READ_FILTER_UP | - PNG_ASM_FLAG_MMX_READ_FILTER_AVG | - PNG_ASM_FLAG_MMX_READ_FILTER_PAETH | -#endif - 0; - - /* could be some non-MMX ones in the future, but not currently: */ - settable_asm_flags = settable_mmx_flags; - - if (!(png_ptr->asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_COMPILED) || - !(png_ptr->asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU)) - { - /* clear all MMX flags if MMX isn't supported */ - settable_asm_flags &= ~settable_mmx_flags; - png_ptr->asm_flags &= ~settable_mmx_flags; - } - - /* we're replacing the settable bits with those passed in by the user, - * so first zero them out of the master copy, then logical-OR in the - * allowed subset that was requested */ - - png_ptr->asm_flags &= ~settable_asm_flags; /* zero them */ - png_ptr->asm_flags |= (asm_flags & settable_asm_flags); /* set them */ -} -#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ - -#ifdef PNG_ASSEMBLER_CODE_SUPPORTED -/* this function was added to libpng 1.2.0 */ -void PNGAPI -png_set_mmx_thresholds (png_structp png_ptr, - png_byte mmx_bitdepth_threshold, - png_uint_32 mmx_rowbytes_threshold) -{ - png_ptr->mmx_bitdepth_threshold = mmx_bitdepth_threshold; - png_ptr->mmx_rowbytes_threshold = mmx_rowbytes_threshold; -} -#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ - -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -/* this function was added to libpng 1.2.6 */ -void PNGAPI -png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max, - png_uint_32 user_height_max) -{ - /* Images with dimensions larger than these limits will be - * rejected by png_set_IHDR(). To accept any PNG datastream - * regardless of dimensions, set both limits to 0x7ffffffL. - */ - png_ptr->user_width_max = user_width_max; - png_ptr->user_height_max = user_height_max; -} -#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ - -#endif /* ?PNG_1_0_X */ diff --git a/src/SFML/Graphics/libpng/pngtrans.c b/src/SFML/Graphics/libpng/pngtrans.c deleted file mode 100644 index 92781312..00000000 --- a/src/SFML/Graphics/libpng/pngtrans.c +++ /dev/null @@ -1,650 +0,0 @@ - -/* pngtrans.c - transforms the data in a row (used by both readers and writers) - * - * libpng 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* turn on BGR-to-RGB mapping */ -void PNGAPI -png_set_bgr(png_structp png_ptr) -{ - png_debug(1, "in png_set_bgr\n"); - png_ptr->transformations |= PNG_BGR; -} -#endif - -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -/* turn on 16 bit byte swapping */ -void PNGAPI -png_set_swap(png_structp png_ptr) -{ - png_debug(1, "in png_set_swap\n"); - if (png_ptr->bit_depth == 16) - png_ptr->transformations |= PNG_SWAP_BYTES; -} -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) -/* turn on pixel packing */ -void PNGAPI -png_set_packing(png_structp png_ptr) -{ - png_debug(1, "in png_set_packing\n"); - if (png_ptr->bit_depth < 8) - { - png_ptr->transformations |= PNG_PACK; - png_ptr->usr_bit_depth = 8; - } -} -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) -/* turn on packed pixel swapping */ -void PNGAPI -png_set_packswap(png_structp png_ptr) -{ - png_debug(1, "in png_set_packswap\n"); - if (png_ptr->bit_depth < 8) - png_ptr->transformations |= PNG_PACKSWAP; -} -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) -void PNGAPI -png_set_shift(png_structp png_ptr, png_color_8p true_bits) -{ - png_debug(1, "in png_set_shift\n"); - png_ptr->transformations |= PNG_SHIFT; - png_ptr->shift = *true_bits; -} -#endif - -#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ - defined(PNG_WRITE_INTERLACING_SUPPORTED) -int PNGAPI -png_set_interlace_handling(png_structp png_ptr) -{ - png_debug(1, "in png_set_interlace handling\n"); - if (png_ptr->interlaced) - { - png_ptr->transformations |= PNG_INTERLACE; - return (7); - } - - return (1); -} -#endif - -#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) -/* Add a filler byte on read, or remove a filler or alpha byte on write. - * The filler type has changed in v0.95 to allow future 2-byte fillers - * for 48-bit input data, as well as to avoid problems with some compilers - * that don't like bytes as parameters. - */ -void PNGAPI -png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) -{ - png_debug(1, "in png_set_filler\n"); - png_ptr->transformations |= PNG_FILLER; - png_ptr->filler = (png_byte)filler; - if (filler_loc == PNG_FILLER_AFTER) - png_ptr->flags |= PNG_FLAG_FILLER_AFTER; - else - png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; - - /* This should probably go in the "do_read_filler" routine. - * I attempted to do that in libpng-1.0.1a but that caused problems - * so I restored it in libpng-1.0.2a - */ - - if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) - { - png_ptr->usr_channels = 4; - } - - /* Also I added this in libpng-1.0.2a (what happens when we expand - * a less-than-8-bit grayscale to GA? */ - - if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) - { - png_ptr->usr_channels = 2; - } -} - -#if !defined(PNG_1_0_X) -/* Added to libpng-1.2.7 */ -void PNGAPI -png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc) -{ - png_debug(1, "in png_set_add_alpha\n"); - png_set_filler(png_ptr, filler, filler_loc); - png_ptr->transformations |= PNG_ADD_ALPHA; -} -#endif - -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -void PNGAPI -png_set_swap_alpha(png_structp png_ptr) -{ - png_debug(1, "in png_set_swap_alpha\n"); - png_ptr->transformations |= PNG_SWAP_ALPHA; -} -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -void PNGAPI -png_set_invert_alpha(png_structp png_ptr) -{ - png_debug(1, "in png_set_invert_alpha\n"); - png_ptr->transformations |= PNG_INVERT_ALPHA; -} -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -void PNGAPI -png_set_invert_mono(png_structp png_ptr) -{ - png_debug(1, "in png_set_invert_mono\n"); - png_ptr->transformations |= PNG_INVERT_MONO; -} - -/* invert monochrome grayscale data */ -void /* PRIVATE */ -png_do_invert(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_invert\n"); - /* This test removed from libpng version 1.0.13 and 1.2.0: - * if (row_info->bit_depth == 1 && - */ -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row == NULL || row_info == NULL) - return; -#endif - if (row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - png_bytep rp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - - for (i = 0; i < istop; i++) - { - *rp = (png_byte)(~(*rp)); - rp++; - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && - row_info->bit_depth == 8) - { - png_bytep rp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - - for (i = 0; i < istop; i+=2) - { - *rp = (png_byte)(~(*rp)); - rp+=2; - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && - row_info->bit_depth == 16) - { - png_bytep rp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - - for (i = 0; i < istop; i+=4) - { - *rp = (png_byte)(~(*rp)); - *(rp+1) = (png_byte)(~(*(rp+1))); - rp+=4; - } - } -} -#endif - -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -/* swaps byte order on 16 bit depth images */ -void /* PRIVATE */ -png_do_swap(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_swap\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - row_info->bit_depth == 16) - { - png_bytep rp = row; - png_uint_32 i; - png_uint_32 istop= row_info->width * row_info->channels; - - for (i = 0; i < istop; i++, rp += 2) - { - png_byte t = *rp; - *rp = *(rp + 1); - *(rp + 1) = t; - } - } -} -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) -static png_byte onebppswaptable[256] = { - 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, - 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, - 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, - 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, - 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, - 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, - 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, - 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, - 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, - 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, - 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, - 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, - 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, - 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, - 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, - 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, - 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, - 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, - 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, - 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, - 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, - 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, - 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, - 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, - 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, - 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, - 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, - 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, - 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, - 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, - 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, - 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF -}; - -static png_byte twobppswaptable[256] = { - 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, - 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, - 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, - 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, - 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, - 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, - 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, - 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, - 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, - 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, - 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, - 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, - 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, - 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, - 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, - 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, - 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, - 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, - 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, - 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, - 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, - 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, - 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, - 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, - 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, - 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, - 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, - 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, - 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, - 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, - 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, - 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF -}; - -static png_byte fourbppswaptable[256] = { - 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, - 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, - 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, - 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, - 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, - 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, - 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, - 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, - 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, - 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, - 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, - 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, - 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, - 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, - 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, - 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, - 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, - 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, - 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, - 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, - 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, - 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, - 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, - 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, - 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, - 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, - 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, - 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, - 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, - 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, - 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, - 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF -}; - -/* swaps pixel packing order within bytes */ -void /* PRIVATE */ -png_do_packswap(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_packswap\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - row_info->bit_depth < 8) - { - png_bytep rp, end, table; - - end = row + row_info->rowbytes; - - if (row_info->bit_depth == 1) - table = onebppswaptable; - else if (row_info->bit_depth == 2) - table = twobppswaptable; - else if (row_info->bit_depth == 4) - table = fourbppswaptable; - else - return; - - for (rp = row; rp < end; rp++) - *rp = table[*rp]; - } -} -#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ - -#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ - defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -/* remove filler or alpha byte(s) */ -void /* PRIVATE */ -png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) -{ - png_debug(1, "in png_do_strip_filler\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - png_bytep sp=row; - png_bytep dp=row; - png_uint_32 row_width=row_info->width; - png_uint_32 i; - - if ((row_info->color_type == PNG_COLOR_TYPE_RGB || - (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && - (flags & PNG_FLAG_STRIP_ALPHA))) && - row_info->channels == 4) - { - if (row_info->bit_depth == 8) - { - /* This converts from RGBX or RGBA to RGB */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - dp+=3; sp+=4; - for (i = 1; i < row_width; i++) - { - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - sp++; - } - } - /* This converts from XRGB or ARGB to RGB */ - else - { - for (i = 0; i < row_width; i++) - { - sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 24; - row_info->rowbytes = row_width * 3; - } - else /* if (row_info->bit_depth == 16) */ - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ - sp += 8; dp += 6; - for (i = 1; i < row_width; i++) - { - /* This could be (although png_memcpy is probably slower): - png_memcpy(dp, sp, 6); - sp += 8; - dp += 6; - */ - - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - sp += 2; - } - } - else - { - /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ - for (i = 0; i < row_width; i++) - { - /* This could be (although png_memcpy is probably slower): - png_memcpy(dp, sp, 6); - sp += 8; - dp += 6; - */ - - sp+=2; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 48; - row_info->rowbytes = row_width * 6; - } - row_info->channels = 3; - } - else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY || - (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && - (flags & PNG_FLAG_STRIP_ALPHA))) && - row_info->channels == 2) - { - if (row_info->bit_depth == 8) - { - /* This converts from GX or GA to G */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - for (i = 0; i < row_width; i++) - { - *dp++ = *sp++; - sp++; - } - } - /* This converts from XG or AG to G */ - else - { - for (i = 0; i < row_width; i++) - { - sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 8; - row_info->rowbytes = row_width; - } - else /* if (row_info->bit_depth == 16) */ - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This converts from GGXX or GGAA to GG */ - sp += 4; dp += 2; - for (i = 1; i < row_width; i++) - { - *dp++ = *sp++; - *dp++ = *sp++; - sp += 2; - } - } - else - { - /* This converts from XXGG or AAGG to GG */ - for (i = 0; i < row_width; i++) - { - sp += 2; - *dp++ = *sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; - } - row_info->channels = 1; - } - if (flags & PNG_FLAG_STRIP_ALPHA) - row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; - } -} -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* swaps red and blue bytes within a pixel */ -void /* PRIVATE */ -png_do_bgr(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_bgr\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - png_uint_32 row_width = row_info->width; - if (row_info->bit_depth == 8) - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - { - png_bytep rp; - png_uint_32 i; - - for (i = 0, rp = row; i < row_width; i++, rp += 3) - { - png_byte save = *rp; - *rp = *(rp + 2); - *(rp + 2) = save; - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - png_bytep rp; - png_uint_32 i; - - for (i = 0, rp = row; i < row_width; i++, rp += 4) - { - png_byte save = *rp; - *rp = *(rp + 2); - *(rp + 2) = save; - } - } - } - else if (row_info->bit_depth == 16) - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - { - png_bytep rp; - png_uint_32 i; - - for (i = 0, rp = row; i < row_width; i++, rp += 6) - { - png_byte save = *rp; - *rp = *(rp + 4); - *(rp + 4) = save; - save = *(rp + 1); - *(rp + 1) = *(rp + 5); - *(rp + 5) = save; - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - png_bytep rp; - png_uint_32 i; - - for (i = 0, rp = row; i < row_width; i++, rp += 8) - { - png_byte save = *rp; - *rp = *(rp + 4); - *(rp + 4) = save; - save = *(rp + 1); - *(rp + 1) = *(rp + 5); - *(rp + 5) = save; - } - } - } - } -} -#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -void PNGAPI -png_set_user_transform_info(png_structp png_ptr, png_voidp - user_transform_ptr, int user_transform_depth, int user_transform_channels) -{ - png_debug(1, "in png_set_user_transform_info\n"); -#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) - png_ptr->user_transform_ptr = user_transform_ptr; - png_ptr->user_transform_depth = (png_byte)user_transform_depth; - png_ptr->user_transform_channels = (png_byte)user_transform_channels; -#else - if(user_transform_ptr || user_transform_depth || user_transform_channels) - png_warning(png_ptr, - "This version of libpng does not support user transform info"); -#endif -} -#endif - -/* This function returns a pointer to the user_transform_ptr associated with - * the user transform functions. The application should free any memory - * associated with this pointer before png_write_destroy and png_read_destroy - * are called. - */ -png_voidp PNGAPI -png_get_user_transform_ptr(png_structp png_ptr) -{ -#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) - return ((png_voidp)png_ptr->user_transform_ptr); -#else - if(png_ptr) - return (NULL); - return (NULL); -#endif -} diff --git a/src/SFML/Graphics/libpng/pngvcrd.c b/src/SFML/Graphics/libpng/pngvcrd.c deleted file mode 100644 index 84f805b3..00000000 --- a/src/SFML/Graphics/libpng/pngvcrd.c +++ /dev/null @@ -1,3903 +0,0 @@ -/* pngvcrd.c - mixed C/assembler version of utilities to read a PNG file - * - * For Intel x86 CPU and Microsoft Visual C++ compiler - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * Copyright (c) 1998, Intel Corporation - * - * Contributed by Nirav Chhatrapati, Intel Corporation, 1998 - * Interface to libpng contributed by Gilles Vollant, 1999 - * - * - * In png_do_read_interlace() in libpng versions 1.0.3a through 1.0.4d, - * a sign error in the post-MMX cleanup code for each pixel_depth resulted - * in bad pixels at the beginning of some rows of some images, and also - * (due to out-of-range memory reads and writes) caused heap corruption - * when compiled with MSVC 6.0. The error was fixed in version 1.0.4e. - * - * [png_read_filter_row_mmx_avg() bpp == 2 bugfix, GRR 20000916] - * - * [runtime MMX configuration, GRR 20010102] - * - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_USE_PNGVCRD) - -static int mmx_supported=2; - - -int PNGAPI -png_mmx_support(void) -{ - int mmx_supported_local = 0; - _asm { - push ebx //CPUID will trash these - push ecx - push edx - - pushfd //Save Eflag to stack - pop eax //Get Eflag from stack into eax - mov ecx, eax //Make another copy of Eflag in ecx - xor eax, 0x200000 //Toggle ID bit in Eflag [i.e. bit(21)] - push eax //Save modified Eflag back to stack - - popfd //Restored modified value back to Eflag reg - pushfd //Save Eflag to stack - pop eax //Get Eflag from stack - push ecx // save original Eflag to stack - popfd // restore original Eflag - xor eax, ecx //Compare the new Eflag with the original Eflag - jz NOT_SUPPORTED //If the same, CPUID instruction is not supported, - //skip following instructions and jump to - //NOT_SUPPORTED label - - xor eax, eax //Set eax to zero - - _asm _emit 0x0f //CPUID instruction (two bytes opcode) - _asm _emit 0xa2 - - cmp eax, 1 //make sure eax return non-zero value - jl NOT_SUPPORTED //If eax is zero, mmx not supported - - xor eax, eax //set eax to zero - inc eax //Now increment eax to 1. This instruction is - //faster than the instruction "mov eax, 1" - - _asm _emit 0x0f //CPUID instruction - _asm _emit 0xa2 - - and edx, 0x00800000 //mask out all bits but mmx bit(24) - cmp edx, 0 // 0 = mmx not supported - jz NOT_SUPPORTED // non-zero = Yes, mmx IS supported - - mov mmx_supported_local, 1 //set return value to 1 - -NOT_SUPPORTED: - mov eax, mmx_supported_local //move return value to eax - pop edx //CPUID trashed these - pop ecx - pop ebx - } - - //mmx_supported_local=0; // test code for force don't support MMX - //printf("MMX : %u (1=MMX supported)\n",mmx_supported_local); - - mmx_supported = mmx_supported_local; - return mmx_supported_local; -} - -/* Combines the row recently read in with the previous row. - This routine takes care of alpha and transparency if requested. - This routine also handles the two methods of progressive display - of interlaced images, depending on the mask value. - The mask value describes which pixels are to be combined with - the row. The pattern always repeats every 8 pixels, so just 8 - bits are needed. A one indicates the pixel is to be combined; a - zero indicates the pixel is to be skipped. This is in addition - to any alpha or transparency value associated with the pixel. If - you want all pixels to be combined, pass 0xff (255) in mask. */ - -/* Use this routine for x86 platform - uses faster MMX routine if machine - supports MMX */ - -void /* PRIVATE */ -png_combine_row(png_structp png_ptr, png_bytep row, int mask) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -#endif - - png_debug(1,"in png_combine_row_asm\n"); - - if (mmx_supported == 2) { -#if !defined(PNG_1_0_X) - /* this should have happened in png_init_mmx_flags() already */ - png_warning(png_ptr, "asm_flags may not have been initialized"); -#endif - png_mmx_support(); - } - - if (mask == 0xff) - { - png_memcpy(row, png_ptr->row_buf + 1, - (png_size_t)PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->width)); - } - /* GRR: add "else if (mask == 0)" case? - * or does png_combine_row() not even get called in that case? */ - else - { - switch (png_ptr->row_info.pixel_depth) - { - case 1: - { - png_bytep sp; - png_bytep dp; - int s_inc, s_start, s_end; - int m; - int shift; - png_uint_32 i; - - sp = png_ptr->row_buf + 1; - dp = row; - m = 0x80; -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 7; - s_inc = 1; - } - else -#endif - { - s_start = 7; - s_end = 0; - s_inc = -1; - } - - shift = s_start; - - for (i = 0; i < png_ptr->width; i++) - { - if (m & mask) - { - int value; - - value = (*sp >> shift) & 0x1; - *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - - case 2: - { - png_bytep sp; - png_bytep dp; - int s_start, s_end, s_inc; - int m; - int shift; - png_uint_32 i; - int value; - - sp = png_ptr->row_buf + 1; - dp = row; - m = 0x80; -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 6; - s_inc = 2; - } - else -#endif - { - s_start = 6; - s_end = 0; - s_inc = -2; - } - - shift = s_start; - - for (i = 0; i < png_ptr->width; i++) - { - if (m & mask) - { - value = (*sp >> shift) & 0x3; - *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - - case 4: - { - png_bytep sp; - png_bytep dp; - int s_start, s_end, s_inc; - int m; - int shift; - png_uint_32 i; - int value; - - sp = png_ptr->row_buf + 1; - dp = row; - m = 0x80; -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 4; - s_inc = 4; - } - else -#endif - { - s_start = 4; - s_end = 0; - s_inc = -4; - } - shift = s_start; - - for (i = 0; i < png_ptr->width; i++) - { - if (m & mask) - { - value = (*sp >> shift) & 0xf; - *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - - case 8: - { - png_bytep srcptr; - png_bytep dstptr; - png_uint_32 len; - int m; - int diff, unmask; - - __int64 mask0=0x0102040810204080; - -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && mmx_supported */ ) -#else - if (mmx_supported) -#endif - { - srcptr = png_ptr->row_buf + 1; - dstptr = row; - m = 0x80; - unmask = ~mask; - len = png_ptr->width &~7; //reduce to multiple of 8 - diff = png_ptr->width & 7; //amount lost - - _asm - { - movd mm7, unmask //load bit pattern - psubb mm6,mm6 //zero mm6 - punpcklbw mm7,mm7 - punpcklwd mm7,mm7 - punpckldq mm7,mm7 //fill register with 8 masks - - movq mm0,mask0 - - pand mm0,mm7 //nonzero if keep byte - pcmpeqb mm0,mm6 //zeros->1s, v versa - - mov ecx,len //load length of line (pixels) - mov esi,srcptr //load source - mov ebx,dstptr //load dest - cmp ecx,0 //lcr - je mainloop8end - -mainloop8: - movq mm4,[esi] - pand mm4,mm0 - movq mm6,mm0 - pandn mm6,[ebx] - por mm4,mm6 - movq [ebx],mm4 - - add esi,8 //inc by 8 bytes processed - add ebx,8 - sub ecx,8 //dec by 8 pixels processed - - ja mainloop8 -mainloop8end: - - mov ecx,diff - cmp ecx,0 - jz end8 - - mov edx,mask - sal edx,24 //make low byte the high byte - -secondloop8: - sal edx,1 //move high bit to CF - jnc skip8 //if CF = 0 - mov al,[esi] - mov [ebx],al -skip8: - inc esi - inc ebx - - dec ecx - jnz secondloop8 -end8: - emms - } - } - else /* mmx not supported - use modified C routine */ - { - register unsigned int incr1, initial_val, final_val; - png_size_t pixel_bytes; - png_uint_32 i; - register int disp = png_pass_inc[png_ptr->pass]; - int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; - - pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); - srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* - pixel_bytes; - dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; - initial_val = offset_table[png_ptr->pass]*pixel_bytes; - final_val = png_ptr->width*pixel_bytes; - incr1 = (disp)*pixel_bytes; - for (i = initial_val; i < final_val; i += incr1) - { - png_memcpy(dstptr, srcptr, pixel_bytes); - srcptr += incr1; - dstptr += incr1; - } - } /* end of else */ - - break; - } // end 8 bpp - - case 16: - { - png_bytep srcptr; - png_bytep dstptr; - png_uint_32 len; - int unmask, diff; - __int64 mask1=0x0101020204040808, - mask0=0x1010202040408080; - -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && mmx_supported */ ) -#else - if (mmx_supported) -#endif - { - srcptr = png_ptr->row_buf + 1; - dstptr = row; - - unmask = ~mask; - len = (png_ptr->width)&~7; - diff = (png_ptr->width)&7; - _asm - { - movd mm7, unmask //load bit pattern - psubb mm6,mm6 //zero mm6 - punpcklbw mm7,mm7 - punpcklwd mm7,mm7 - punpckldq mm7,mm7 //fill register with 8 masks - - movq mm0,mask0 - movq mm1,mask1 - - pand mm0,mm7 - pand mm1,mm7 - - pcmpeqb mm0,mm6 - pcmpeqb mm1,mm6 - - mov ecx,len //load length of line - mov esi,srcptr //load source - mov ebx,dstptr //load dest - cmp ecx,0 //lcr - jz mainloop16end - -mainloop16: - movq mm4,[esi] - pand mm4,mm0 - movq mm6,mm0 - movq mm7,[ebx] - pandn mm6,mm7 - por mm4,mm6 - movq [ebx],mm4 - - movq mm5,[esi+8] - pand mm5,mm1 - movq mm7,mm1 - movq mm6,[ebx+8] - pandn mm7,mm6 - por mm5,mm7 - movq [ebx+8],mm5 - - add esi,16 //inc by 16 bytes processed - add ebx,16 - sub ecx,8 //dec by 8 pixels processed - - ja mainloop16 - -mainloop16end: - mov ecx,diff - cmp ecx,0 - jz end16 - - mov edx,mask - sal edx,24 //make low byte the high byte -secondloop16: - sal edx,1 //move high bit to CF - jnc skip16 //if CF = 0 - mov ax,[esi] - mov [ebx],ax -skip16: - add esi,2 - add ebx,2 - - dec ecx - jnz secondloop16 -end16: - emms - } - } - else /* mmx not supported - use modified C routine */ - { - register unsigned int incr1, initial_val, final_val; - png_size_t pixel_bytes; - png_uint_32 i; - register int disp = png_pass_inc[png_ptr->pass]; - int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; - - pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); - srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* - pixel_bytes; - dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; - initial_val = offset_table[png_ptr->pass]*pixel_bytes; - final_val = png_ptr->width*pixel_bytes; - incr1 = (disp)*pixel_bytes; - for (i = initial_val; i < final_val; i += incr1) - { - png_memcpy(dstptr, srcptr, pixel_bytes); - srcptr += incr1; - dstptr += incr1; - } - } /* end of else */ - - break; - } // end 16 bpp - - case 24: - { - png_bytep srcptr; - png_bytep dstptr; - png_uint_32 len; - int unmask, diff; - - __int64 mask2=0x0101010202020404, //24bpp - mask1=0x0408080810101020, - mask0=0x2020404040808080; - - srcptr = png_ptr->row_buf + 1; - dstptr = row; - - unmask = ~mask; - len = (png_ptr->width)&~7; - diff = (png_ptr->width)&7; - -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && mmx_supported */ ) -#else - if (mmx_supported) -#endif - { - _asm - { - movd mm7, unmask //load bit pattern - psubb mm6,mm6 //zero mm6 - punpcklbw mm7,mm7 - punpcklwd mm7,mm7 - punpckldq mm7,mm7 //fill register with 8 masks - - movq mm0,mask0 - movq mm1,mask1 - movq mm2,mask2 - - pand mm0,mm7 - pand mm1,mm7 - pand mm2,mm7 - - pcmpeqb mm0,mm6 - pcmpeqb mm1,mm6 - pcmpeqb mm2,mm6 - - mov ecx,len //load length of line - mov esi,srcptr //load source - mov ebx,dstptr //load dest - cmp ecx,0 - jz mainloop24end - -mainloop24: - movq mm4,[esi] - pand mm4,mm0 - movq mm6,mm0 - movq mm7,[ebx] - pandn mm6,mm7 - por mm4,mm6 - movq [ebx],mm4 - - - movq mm5,[esi+8] - pand mm5,mm1 - movq mm7,mm1 - movq mm6,[ebx+8] - pandn mm7,mm6 - por mm5,mm7 - movq [ebx+8],mm5 - - movq mm6,[esi+16] - pand mm6,mm2 - movq mm4,mm2 - movq mm7,[ebx+16] - pandn mm4,mm7 - por mm6,mm4 - movq [ebx+16],mm6 - - add esi,24 //inc by 24 bytes processed - add ebx,24 - sub ecx,8 //dec by 8 pixels processed - - ja mainloop24 - -mainloop24end: - mov ecx,diff - cmp ecx,0 - jz end24 - - mov edx,mask - sal edx,24 //make low byte the high byte -secondloop24: - sal edx,1 //move high bit to CF - jnc skip24 //if CF = 0 - mov ax,[esi] - mov [ebx],ax - xor eax,eax - mov al,[esi+2] - mov [ebx+2],al -skip24: - add esi,3 - add ebx,3 - - dec ecx - jnz secondloop24 - -end24: - emms - } - } - else /* mmx not supported - use modified C routine */ - { - register unsigned int incr1, initial_val, final_val; - png_size_t pixel_bytes; - png_uint_32 i; - register int disp = png_pass_inc[png_ptr->pass]; - int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; - - pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); - srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* - pixel_bytes; - dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; - initial_val = offset_table[png_ptr->pass]*pixel_bytes; - final_val = png_ptr->width*pixel_bytes; - incr1 = (disp)*pixel_bytes; - for (i = initial_val; i < final_val; i += incr1) - { - png_memcpy(dstptr, srcptr, pixel_bytes); - srcptr += incr1; - dstptr += incr1; - } - } /* end of else */ - - break; - } // end 24 bpp - - case 32: - { - png_bytep srcptr; - png_bytep dstptr; - png_uint_32 len; - int unmask, diff; - - __int64 mask3=0x0101010102020202, //32bpp - mask2=0x0404040408080808, - mask1=0x1010101020202020, - mask0=0x4040404080808080; - - srcptr = png_ptr->row_buf + 1; - dstptr = row; - - unmask = ~mask; - len = (png_ptr->width)&~7; - diff = (png_ptr->width)&7; - -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && mmx_supported */ ) -#else - if (mmx_supported) -#endif - { - _asm - { - movd mm7, unmask //load bit pattern - psubb mm6,mm6 //zero mm6 - punpcklbw mm7,mm7 - punpcklwd mm7,mm7 - punpckldq mm7,mm7 //fill register with 8 masks - - movq mm0,mask0 - movq mm1,mask1 - movq mm2,mask2 - movq mm3,mask3 - - pand mm0,mm7 - pand mm1,mm7 - pand mm2,mm7 - pand mm3,mm7 - - pcmpeqb mm0,mm6 - pcmpeqb mm1,mm6 - pcmpeqb mm2,mm6 - pcmpeqb mm3,mm6 - - mov ecx,len //load length of line - mov esi,srcptr //load source - mov ebx,dstptr //load dest - - cmp ecx,0 //lcr - jz mainloop32end - -mainloop32: - movq mm4,[esi] - pand mm4,mm0 - movq mm6,mm0 - movq mm7,[ebx] - pandn mm6,mm7 - por mm4,mm6 - movq [ebx],mm4 - - movq mm5,[esi+8] - pand mm5,mm1 - movq mm7,mm1 - movq mm6,[ebx+8] - pandn mm7,mm6 - por mm5,mm7 - movq [ebx+8],mm5 - - movq mm6,[esi+16] - pand mm6,mm2 - movq mm4,mm2 - movq mm7,[ebx+16] - pandn mm4,mm7 - por mm6,mm4 - movq [ebx+16],mm6 - - movq mm7,[esi+24] - pand mm7,mm3 - movq mm5,mm3 - movq mm4,[ebx+24] - pandn mm5,mm4 - por mm7,mm5 - movq [ebx+24],mm7 - - add esi,32 //inc by 32 bytes processed - add ebx,32 - sub ecx,8 //dec by 8 pixels processed - - ja mainloop32 - -mainloop32end: - mov ecx,diff - cmp ecx,0 - jz end32 - - mov edx,mask - sal edx,24 //make low byte the high byte -secondloop32: - sal edx,1 //move high bit to CF - jnc skip32 //if CF = 0 - mov eax,[esi] - mov [ebx],eax -skip32: - add esi,4 - add ebx,4 - - dec ecx - jnz secondloop32 - -end32: - emms - } - } - else /* mmx _not supported - Use modified C routine */ - { - register unsigned int incr1, initial_val, final_val; - png_size_t pixel_bytes; - png_uint_32 i; - register int disp = png_pass_inc[png_ptr->pass]; - int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; - - pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); - srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* - pixel_bytes; - dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; - initial_val = offset_table[png_ptr->pass]*pixel_bytes; - final_val = png_ptr->width*pixel_bytes; - incr1 = (disp)*pixel_bytes; - for (i = initial_val; i < final_val; i += incr1) - { - png_memcpy(dstptr, srcptr, pixel_bytes); - srcptr += incr1; - dstptr += incr1; - } - } /* end of else */ - - break; - } // end 32 bpp - - case 48: - { - png_bytep srcptr; - png_bytep dstptr; - png_uint_32 len; - int unmask, diff; - - __int64 mask5=0x0101010101010202, - mask4=0x0202020204040404, - mask3=0x0404080808080808, - mask2=0x1010101010102020, - mask1=0x2020202040404040, - mask0=0x4040808080808080; - -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) - /* && mmx_supported */ ) -#else - if (mmx_supported) -#endif - { - srcptr = png_ptr->row_buf + 1; - dstptr = row; - - unmask = ~mask; - len = (png_ptr->width)&~7; - diff = (png_ptr->width)&7; - _asm - { - movd mm7, unmask //load bit pattern - psubb mm6,mm6 //zero mm6 - punpcklbw mm7,mm7 - punpcklwd mm7,mm7 - punpckldq mm7,mm7 //fill register with 8 masks - - movq mm0,mask0 - movq mm1,mask1 - movq mm2,mask2 - movq mm3,mask3 - movq mm4,mask4 - movq mm5,mask5 - - pand mm0,mm7 - pand mm1,mm7 - pand mm2,mm7 - pand mm3,mm7 - pand mm4,mm7 - pand mm5,mm7 - - pcmpeqb mm0,mm6 - pcmpeqb mm1,mm6 - pcmpeqb mm2,mm6 - pcmpeqb mm3,mm6 - pcmpeqb mm4,mm6 - pcmpeqb mm5,mm6 - - mov ecx,len //load length of line - mov esi,srcptr //load source - mov ebx,dstptr //load dest - - cmp ecx,0 - jz mainloop48end - -mainloop48: - movq mm7,[esi] - pand mm7,mm0 - movq mm6,mm0 - pandn mm6,[ebx] - por mm7,mm6 - movq [ebx],mm7 - - movq mm6,[esi+8] - pand mm6,mm1 - movq mm7,mm1 - pandn mm7,[ebx+8] - por mm6,mm7 - movq [ebx+8],mm6 - - movq mm6,[esi+16] - pand mm6,mm2 - movq mm7,mm2 - pandn mm7,[ebx+16] - por mm6,mm7 - movq [ebx+16],mm6 - - movq mm7,[esi+24] - pand mm7,mm3 - movq mm6,mm3 - pandn mm6,[ebx+24] - por mm7,mm6 - movq [ebx+24],mm7 - - movq mm6,[esi+32] - pand mm6,mm4 - movq mm7,mm4 - pandn mm7,[ebx+32] - por mm6,mm7 - movq [ebx+32],mm6 - - movq mm7,[esi+40] - pand mm7,mm5 - movq mm6,mm5 - pandn mm6,[ebx+40] - por mm7,mm6 - movq [ebx+40],mm7 - - add esi,48 //inc by 32 bytes processed - add ebx,48 - sub ecx,8 //dec by 8 pixels processed - - ja mainloop48 -mainloop48end: - - mov ecx,diff - cmp ecx,0 - jz end48 - - mov edx,mask - sal edx,24 //make low byte the high byte - -secondloop48: - sal edx,1 //move high bit to CF - jnc skip48 //if CF = 0 - mov eax,[esi] - mov [ebx],eax -skip48: - add esi,4 - add ebx,4 - - dec ecx - jnz secondloop48 - -end48: - emms - } - } - else /* mmx _not supported - Use modified C routine */ - { - register unsigned int incr1, initial_val, final_val; - png_size_t pixel_bytes; - png_uint_32 i; - register int disp = png_pass_inc[png_ptr->pass]; - int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; - - pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); - srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* - pixel_bytes; - dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; - initial_val = offset_table[png_ptr->pass]*pixel_bytes; - final_val = png_ptr->width*pixel_bytes; - incr1 = (disp)*pixel_bytes; - for (i = initial_val; i < final_val; i += incr1) - { - png_memcpy(dstptr, srcptr, pixel_bytes); - srcptr += incr1; - dstptr += incr1; - } - } /* end of else */ - - break; - } // end 48 bpp - - default: - { - png_bytep sptr; - png_bytep dp; - png_size_t pixel_bytes; - int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; - unsigned int i; - register int disp = png_pass_inc[png_ptr->pass]; // get the offset - register unsigned int incr1, initial_val, final_val; - - pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); - sptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* - pixel_bytes; - dp = row + offset_table[png_ptr->pass]*pixel_bytes; - initial_val = offset_table[png_ptr->pass]*pixel_bytes; - final_val = png_ptr->width*pixel_bytes; - incr1 = (disp)*pixel_bytes; - for (i = initial_val; i < final_val; i += incr1) - { - png_memcpy(dp, sptr, pixel_bytes); - sptr += incr1; - dp += incr1; - } - break; - } - } /* end switch (png_ptr->row_info.pixel_depth) */ - } /* end if (non-trivial mask) */ - -} /* end png_combine_row() */ - - -#if defined(PNG_READ_INTERLACING_SUPPORTED) - -void /* PRIVATE */ -png_do_read_interlace(png_structp png_ptr) -{ - png_row_infop row_info = &(png_ptr->row_info); - png_bytep row = png_ptr->row_buf + 1; - int pass = png_ptr->pass; - png_uint_32 transformations = png_ptr->transformations; -#ifdef PNG_USE_LOCAL_ARRAYS - const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -#endif - - png_debug(1,"in png_do_read_interlace\n"); - - if (mmx_supported == 2) { -#if !defined(PNG_1_0_X) - /* this should have happened in png_init_mmx_flags() already */ - png_warning(png_ptr, "asm_flags may not have been initialized"); -#endif - png_mmx_support(); - } - - if (row != NULL && row_info != NULL) - { - png_uint_32 final_width; - - final_width = row_info->width * png_pass_inc[pass]; - - switch (row_info->pixel_depth) - { - case 1: - { - png_bytep sp, dp; - int sshift, dshift; - int s_start, s_end, s_inc; - png_byte v; - png_uint_32 i; - int j; - - sp = row + (png_size_t)((row_info->width - 1) >> 3); - dp = row + (png_size_t)((final_width - 1) >> 3); -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (transformations & PNG_PACKSWAP) - { - sshift = (int)((row_info->width + 7) & 7); - dshift = (int)((final_width + 7) & 7); - s_start = 7; - s_end = 0; - s_inc = -1; - } - else -#endif - { - sshift = 7 - (int)((row_info->width + 7) & 7); - dshift = 7 - (int)((final_width + 7) & 7); - s_start = 0; - s_end = 7; - s_inc = 1; - } - - for (i = row_info->width; i; i--) - { - v = (png_byte)((*sp >> sshift) & 0x1); - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - else - dshift += s_inc; - } - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - else - sshift += s_inc; - } - break; - } - - case 2: - { - png_bytep sp, dp; - int sshift, dshift; - int s_start, s_end, s_inc; - png_uint_32 i; - - sp = row + (png_size_t)((row_info->width - 1) >> 2); - dp = row + (png_size_t)((final_width - 1) >> 2); -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (transformations & PNG_PACKSWAP) - { - sshift = (png_size_t)(((row_info->width + 3) & 3) << 1); - dshift = (png_size_t)(((final_width + 3) & 3) << 1); - s_start = 6; - s_end = 0; - s_inc = -2; - } - else -#endif - { - sshift = (png_size_t)((3 - ((row_info->width + 3) & 3)) << 1); - dshift = (png_size_t)((3 - ((final_width + 3) & 3)) << 1); - s_start = 0; - s_end = 6; - s_inc = 2; - } - - for (i = row_info->width; i; i--) - { - png_byte v; - int j; - - v = (png_byte)((*sp >> sshift) & 0x3); - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - else - dshift += s_inc; - } - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - else - sshift += s_inc; - } - break; - } - - case 4: - { - png_bytep sp, dp; - int sshift, dshift; - int s_start, s_end, s_inc; - png_uint_32 i; - - sp = row + (png_size_t)((row_info->width - 1) >> 1); - dp = row + (png_size_t)((final_width - 1) >> 1); -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (transformations & PNG_PACKSWAP) - { - sshift = (png_size_t)(((row_info->width + 1) & 1) << 2); - dshift = (png_size_t)(((final_width + 1) & 1) << 2); - s_start = 4; - s_end = 0; - s_inc = -4; - } - else -#endif - { - sshift = (png_size_t)((1 - ((row_info->width + 1) & 1)) << 2); - dshift = (png_size_t)((1 - ((final_width + 1) & 1)) << 2); - s_start = 0; - s_end = 4; - s_inc = 4; - } - - for (i = row_info->width; i; i--) - { - png_byte v; - int j; - - v = (png_byte)((*sp >> sshift) & 0xf); - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - else - dshift += s_inc; - } - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - else - sshift += s_inc; - } - break; - } - - default: // This is the place where the routine is modified - { - __int64 const4 = 0x0000000000FFFFFF; - // __int64 const5 = 0x000000FFFFFF0000; // unused... - __int64 const6 = 0x00000000000000FF; - png_bytep sptr, dp; - png_uint_32 i; - png_size_t pixel_bytes; - int width = row_info->width; - - pixel_bytes = (row_info->pixel_depth >> 3); - - sptr = row + (width - 1) * pixel_bytes; - dp = row + (final_width - 1) * pixel_bytes; - // New code by Nirav Chhatrapati - Intel Corporation - // sign fix by GRR - // NOTE: there is NO MMX code for 48-bit and 64-bit images - - // use MMX routine if machine supports it -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_INTERLACE) - /* && mmx_supported */ ) -#else - if (mmx_supported) -#endif - { - if (pixel_bytes == 3) - { - if (((pass == 0) || (pass == 1)) && width) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width - sub edi, 21 // (png_pass_inc[pass] - 1)*pixel_bytes -loop_pass0: - movd mm0, [esi] ; X X X X X v2 v1 v0 - pand mm0, const4 ; 0 0 0 0 0 v2 v1 v0 - movq mm1, mm0 ; 0 0 0 0 0 v2 v1 v0 - psllq mm0, 16 ; 0 0 0 v2 v1 v0 0 0 - movq mm2, mm0 ; 0 0 0 v2 v1 v0 0 0 - psllq mm0, 24 ; v2 v1 v0 0 0 0 0 0 - psrlq mm1, 8 ; 0 0 0 0 0 0 v2 v1 - por mm0, mm2 ; v2 v1 v0 v2 v1 v0 0 0 - por mm0, mm1 ; v2 v1 v0 v2 v1 v0 v2 v1 - movq mm3, mm0 ; v2 v1 v0 v2 v1 v0 v2 v1 - psllq mm0, 16 ; v0 v2 v1 v0 v2 v1 0 0 - movq mm4, mm3 ; v2 v1 v0 v2 v1 v0 v2 v1 - punpckhdq mm3, mm0 ; v0 v2 v1 v0 v2 v1 v0 v2 - movq [edi+16] , mm4 - psrlq mm0, 32 ; 0 0 0 0 v0 v2 v1 v0 - movq [edi+8] , mm3 - punpckldq mm0, mm4 ; v1 v0 v2 v1 v0 v2 v1 v0 - sub esi, 3 - movq [edi], mm0 - sub edi, 24 - //sub esi, 3 - dec ecx - jnz loop_pass0 - EMMS - } - } - else if (((pass == 2) || (pass == 3)) && width) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width - sub edi, 9 // (png_pass_inc[pass] - 1)*pixel_bytes -loop_pass2: - movd mm0, [esi] ; X X X X X v2 v1 v0 - pand mm0, const4 ; 0 0 0 0 0 v2 v1 v0 - movq mm1, mm0 ; 0 0 0 0 0 v2 v1 v0 - psllq mm0, 16 ; 0 0 0 v2 v1 v0 0 0 - movq mm2, mm0 ; 0 0 0 v2 v1 v0 0 0 - psllq mm0, 24 ; v2 v1 v0 0 0 0 0 0 - psrlq mm1, 8 ; 0 0 0 0 0 0 v2 v1 - por mm0, mm2 ; v2 v1 v0 v2 v1 v0 0 0 - por mm0, mm1 ; v2 v1 v0 v2 v1 v0 v2 v1 - movq [edi+4], mm0 ; move to memory - psrlq mm0, 16 ; 0 0 v2 v1 v0 v2 v1 v0 - movd [edi], mm0 ; move to memory - sub esi, 3 - sub edi, 12 - dec ecx - jnz loop_pass2 - EMMS - } - } - else if (width) /* && ((pass == 4) || (pass == 5)) */ - { - int width_mmx = ((width >> 1) << 1) - 8; - if (width_mmx < 0) - width_mmx = 0; - width -= width_mmx; // 8 or 9 pix, 24 or 27 bytes - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub esi, 3 - sub edi, 9 -loop_pass4: - movq mm0, [esi] ; X X v2 v1 v0 v5 v4 v3 - movq mm7, mm0 ; X X v2 v1 v0 v5 v4 v3 - movq mm6, mm0 ; X X v2 v1 v0 v5 v4 v3 - psllq mm0, 24 ; v1 v0 v5 v4 v3 0 0 0 - pand mm7, const4 ; 0 0 0 0 0 v5 v4 v3 - psrlq mm6, 24 ; 0 0 0 X X v2 v1 v0 - por mm0, mm7 ; v1 v0 v5 v4 v3 v5 v4 v3 - movq mm5, mm6 ; 0 0 0 X X v2 v1 v0 - psllq mm6, 8 ; 0 0 X X v2 v1 v0 0 - movq [edi], mm0 ; move quad to memory - psrlq mm5, 16 ; 0 0 0 0 0 X X v2 - pand mm5, const6 ; 0 0 0 0 0 0 0 v2 - por mm6, mm5 ; 0 0 X X v2 v1 v0 v2 - movd [edi+8], mm6 ; move double to memory - sub esi, 6 - sub edi, 12 - sub ecx, 2 - jnz loop_pass4 - EMMS - } - } - - sptr -= width_mmx*3; - dp -= width_mmx*6; - for (i = width; i; i--) - { - png_byte v[8]; - int j; - - png_memcpy(v, sptr, 3); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, 3); - dp -= 3; - } - sptr -= 3; - } - } - } /* end of pixel_bytes == 3 */ - - else if (pixel_bytes == 1) - { - if (((pass == 0) || (pass == 1)) && width) - { - int width_mmx = ((width >> 2) << 2); - width -= width_mmx; - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub edi, 31 - sub esi, 3 -loop1_pass0: - movd mm0, [esi] ; X X X X v0 v1 v2 v3 - movq mm1, mm0 ; X X X X v0 v1 v2 v3 - punpcklbw mm0, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 - movq mm2, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 - punpcklwd mm0, mm0 ; v2 v2 v2 v2 v3 v3 v3 v3 - movq mm3, mm0 ; v2 v2 v2 v2 v3 v3 v3 v3 - punpckldq mm0, mm0 ; v3 v3 v3 v3 v3 v3 v3 v3 - punpckhdq mm3, mm3 ; v2 v2 v2 v2 v2 v2 v2 v2 - movq [edi], mm0 ; move to memory v3 - punpckhwd mm2, mm2 ; v0 v0 v0 v0 v1 v1 v1 v1 - movq [edi+8], mm3 ; move to memory v2 - movq mm4, mm2 ; v0 v0 v0 v0 v1 v1 v1 v1 - punpckldq mm2, mm2 ; v1 v1 v1 v1 v1 v1 v1 v1 - punpckhdq mm4, mm4 ; v0 v0 v0 v0 v0 v0 v0 v0 - movq [edi+16], mm2 ; move to memory v1 - movq [edi+24], mm4 ; move to memory v0 - sub esi, 4 - sub edi, 32 - sub ecx, 4 - jnz loop1_pass0 - EMMS - } - } - - sptr -= width_mmx; - dp -= width_mmx*8; - for (i = width; i; i--) - { - int j; - - /* I simplified this part in version 1.0.4e - * here and in several other instances where - * pixel_bytes == 1 -- GR-P - * - * Original code: - * - * png_byte v[8]; - * png_memcpy(v, sptr, pixel_bytes); - * for (j = 0; j < png_pass_inc[pass]; j++) - * { - * png_memcpy(dp, v, pixel_bytes); - * dp -= pixel_bytes; - * } - * sptr -= pixel_bytes; - * - * Replacement code is in the next three lines: - */ - - for (j = 0; j < png_pass_inc[pass]; j++) - *dp-- = *sptr; - sptr--; - } - } - else if (((pass == 2) || (pass == 3)) && width) - { - int width_mmx = ((width >> 2) << 2); - width -= width_mmx; - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub edi, 15 - sub esi, 3 -loop1_pass2: - movd mm0, [esi] ; X X X X v0 v1 v2 v3 - punpcklbw mm0, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 - movq mm1, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 - punpcklwd mm0, mm0 ; v2 v2 v2 v2 v3 v3 v3 v3 - punpckhwd mm1, mm1 ; v0 v0 v0 v0 v1 v1 v1 v1 - movq [edi], mm0 ; move to memory v2 and v3 - sub esi, 4 - movq [edi+8], mm1 ; move to memory v1 and v0 - sub edi, 16 - sub ecx, 4 - jnz loop1_pass2 - EMMS - } - } - - sptr -= width_mmx; - dp -= width_mmx*4; - for (i = width; i; i--) - { - int j; - - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp-- = *sptr; - } - sptr --; - } - } - else if (width) /* && ((pass == 4) || (pass == 5))) */ - { - int width_mmx = ((width >> 3) << 3); - width -= width_mmx; - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub edi, 15 - sub esi, 7 -loop1_pass4: - movq mm0, [esi] ; v0 v1 v2 v3 v4 v5 v6 v7 - movq mm1, mm0 ; v0 v1 v2 v3 v4 v5 v6 v7 - punpcklbw mm0, mm0 ; v4 v4 v5 v5 v6 v6 v7 v7 - //movq mm1, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 - punpckhbw mm1, mm1 ;v0 v0 v1 v1 v2 v2 v3 v3 - movq [edi+8], mm1 ; move to memory v0 v1 v2 and v3 - sub esi, 8 - movq [edi], mm0 ; move to memory v4 v5 v6 and v7 - //sub esi, 4 - sub edi, 16 - sub ecx, 8 - jnz loop1_pass4 - EMMS - } - } - - sptr -= width_mmx; - dp -= width_mmx*2; - for (i = width; i; i--) - { - int j; - - for (j = 0; j < png_pass_inc[pass]; j++) - { - *dp-- = *sptr; - } - sptr --; - } - } - } /* end of pixel_bytes == 1 */ - - else if (pixel_bytes == 2) - { - if (((pass == 0) || (pass == 1)) && width) - { - int width_mmx = ((width >> 1) << 1); - width -= width_mmx; - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub esi, 2 - sub edi, 30 -loop2_pass0: - movd mm0, [esi] ; X X X X v1 v0 v3 v2 - punpcklwd mm0, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 - movq mm1, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 - punpckldq mm0, mm0 ; v3 v2 v3 v2 v3 v2 v3 v2 - punpckhdq mm1, mm1 ; v1 v0 v1 v0 v1 v0 v1 v0 - movq [edi], mm0 - movq [edi + 8], mm0 - movq [edi + 16], mm1 - movq [edi + 24], mm1 - sub esi, 4 - sub edi, 32 - sub ecx, 2 - jnz loop2_pass0 - EMMS - } - } - - sptr -= (width_mmx*2 - 2); // sign fixed - dp -= (width_mmx*16 - 2); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 2; - png_memcpy(v, sptr, 2); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 2; - png_memcpy(dp, v, 2); - } - } - } - else if (((pass == 2) || (pass == 3)) && width) - { - int width_mmx = ((width >> 1) << 1) ; - width -= width_mmx; - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub esi, 2 - sub edi, 14 -loop2_pass2: - movd mm0, [esi] ; X X X X v1 v0 v3 v2 - punpcklwd mm0, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 - movq mm1, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 - punpckldq mm0, mm0 ; v3 v2 v3 v2 v3 v2 v3 v2 - punpckhdq mm1, mm1 ; v1 v0 v1 v0 v1 v0 v1 v0 - movq [edi], mm0 - sub esi, 4 - movq [edi + 8], mm1 - //sub esi, 4 - sub edi, 16 - sub ecx, 2 - jnz loop2_pass2 - EMMS - } - } - - sptr -= (width_mmx*2 - 2); // sign fixed - dp -= (width_mmx*8 - 2); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 2; - png_memcpy(v, sptr, 2); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 2; - png_memcpy(dp, v, 2); - } - } - } - else if (width) // pass == 4 or 5 - { - int width_mmx = ((width >> 1) << 1) ; - width -= width_mmx; - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub esi, 2 - sub edi, 6 -loop2_pass4: - movd mm0, [esi] ; X X X X v1 v0 v3 v2 - punpcklwd mm0, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 - sub esi, 4 - movq [edi], mm0 - sub edi, 8 - sub ecx, 2 - jnz loop2_pass4 - EMMS - } - } - - sptr -= (width_mmx*2 - 2); // sign fixed - dp -= (width_mmx*4 - 2); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 2; - png_memcpy(v, sptr, 2); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 2; - png_memcpy(dp, v, 2); - } - } - } - } /* end of pixel_bytes == 2 */ - - else if (pixel_bytes == 4) - { - if (((pass == 0) || (pass == 1)) && width) - { - int width_mmx = ((width >> 1) << 1) ; - width -= width_mmx; - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub esi, 4 - sub edi, 60 -loop4_pass0: - movq mm0, [esi] ; v3 v2 v1 v0 v7 v6 v5 v4 - movq mm1, mm0 ; v3 v2 v1 v0 v7 v6 v5 v4 - punpckldq mm0, mm0 ; v7 v6 v5 v4 v7 v6 v5 v4 - punpckhdq mm1, mm1 ; v3 v2 v1 v0 v3 v2 v1 v0 - movq [edi], mm0 - movq [edi + 8], mm0 - movq [edi + 16], mm0 - movq [edi + 24], mm0 - movq [edi+32], mm1 - movq [edi + 40], mm1 - movq [edi+ 48], mm1 - sub esi, 8 - movq [edi + 56], mm1 - sub edi, 64 - sub ecx, 2 - jnz loop4_pass0 - EMMS - } - } - - sptr -= (width_mmx*4 - 4); // sign fixed - dp -= (width_mmx*32 - 4); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 4; - png_memcpy(v, sptr, 4); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 4; - png_memcpy(dp, v, 4); - } - } - } - else if (((pass == 2) || (pass == 3)) && width) - { - int width_mmx = ((width >> 1) << 1) ; - width -= width_mmx; - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub esi, 4 - sub edi, 28 -loop4_pass2: - movq mm0, [esi] ; v3 v2 v1 v0 v7 v6 v5 v4 - movq mm1, mm0 ; v3 v2 v1 v0 v7 v6 v5 v4 - punpckldq mm0, mm0 ; v7 v6 v5 v4 v7 v6 v5 v4 - punpckhdq mm1, mm1 ; v3 v2 v1 v0 v3 v2 v1 v0 - movq [edi], mm0 - movq [edi + 8], mm0 - movq [edi+16], mm1 - movq [edi + 24], mm1 - sub esi, 8 - sub edi, 32 - sub ecx, 2 - jnz loop4_pass2 - EMMS - } - } - - sptr -= (width_mmx*4 - 4); // sign fixed - dp -= (width_mmx*16 - 4); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 4; - png_memcpy(v, sptr, 4); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 4; - png_memcpy(dp, v, 4); - } - } - } - else if (width) // pass == 4 or 5 - { - int width_mmx = ((width >> 1) << 1) ; - width -= width_mmx; - if (width_mmx) - { - _asm - { - mov esi, sptr - mov edi, dp - mov ecx, width_mmx - sub esi, 4 - sub edi, 12 -loop4_pass4: - movq mm0, [esi] ; v3 v2 v1 v0 v7 v6 v5 v4 - movq mm1, mm0 ; v3 v2 v1 v0 v7 v6 v5 v4 - punpckldq mm0, mm0 ; v7 v6 v5 v4 v7 v6 v5 v4 - punpckhdq mm1, mm1 ; v3 v2 v1 v0 v3 v2 v1 v0 - movq [edi], mm0 - sub esi, 8 - movq [edi + 8], mm1 - sub edi, 16 - sub ecx, 2 - jnz loop4_pass4 - EMMS - } - } - - sptr -= (width_mmx*4 - 4); // sign fixed - dp -= (width_mmx*8 - 4); // sign fixed - for (i = width; i; i--) - { - png_byte v[8]; - int j; - sptr -= 4; - png_memcpy(v, sptr, 4); - for (j = 0; j < png_pass_inc[pass]; j++) - { - dp -= 4; - png_memcpy(dp, v, 4); - } - } - } - - } /* end of pixel_bytes == 4 */ - - else if (pixel_bytes == 6) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, 6); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, 6); - dp -= 6; - } - sptr -= 6; - } - } /* end of pixel_bytes == 6 */ - - else - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, pixel_bytes); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - sptr-= pixel_bytes; - } - } - } /* end of mmx_supported */ - - else /* MMX not supported: use modified C code - takes advantage - * of inlining of memcpy for a constant */ - { - if (pixel_bytes == 1) - { - for (i = width; i; i--) - { - int j; - for (j = 0; j < png_pass_inc[pass]; j++) - *dp-- = *sptr; - sptr--; - } - } - else if (pixel_bytes == 3) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, pixel_bytes); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - sptr -= pixel_bytes; - } - } - else if (pixel_bytes == 2) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, pixel_bytes); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - sptr -= pixel_bytes; - } - } - else if (pixel_bytes == 4) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, pixel_bytes); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - sptr -= pixel_bytes; - } - } - else if (pixel_bytes == 6) - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, pixel_bytes); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - sptr -= pixel_bytes; - } - } - else - { - for (i = width; i; i--) - { - png_byte v[8]; - int j; - png_memcpy(v, sptr, pixel_bytes); - for (j = 0; j < png_pass_inc[pass]; j++) - { - png_memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - sptr -= pixel_bytes; - } - } - - } /* end of MMX not supported */ - break; - } - } /* end switch (row_info->pixel_depth) */ - - row_info->width = final_width; - - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,final_width); - } - -} - -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - - -// These variables are utilized in the functions below. They are declared -// globally here to ensure alignment on 8-byte boundaries. - -union uAll { - __int64 use; - double align; -} LBCarryMask = {0x0101010101010101}, - HBClearMask = {0x7f7f7f7f7f7f7f7f}, - ActiveMask, ActiveMask2, ActiveMaskEnd, ShiftBpp, ShiftRem; - - -// Optimized code for PNG Average filter decoder -void /* PRIVATE */ -png_read_filter_row_mmx_avg(png_row_infop row_info, png_bytep row - , png_bytep prev_row) -{ - int bpp; - png_uint_32 FullLength; - png_uint_32 MMXLength; - //png_uint_32 len; - int diff; - - bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel - FullLength = row_info->rowbytes; // # of bytes to filter - _asm { - // Init address pointers and offset - mov edi, row // edi ==> Avg(x) - xor ebx, ebx // ebx ==> x - mov edx, edi - mov esi, prev_row // esi ==> Prior(x) - sub edx, bpp // edx ==> Raw(x-bpp) - - xor eax, eax - // Compute the Raw value for the first bpp bytes - // Raw(x) = Avg(x) + (Prior(x)/2) -davgrlp: - mov al, [esi + ebx] // Load al with Prior(x) - inc ebx - shr al, 1 // divide by 2 - add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx - cmp ebx, bpp - mov [edi+ebx-1], al // Write back Raw(x); - // mov does not affect flags; -1 to offset inc ebx - jb davgrlp - // get # of bytes to alignment - mov diff, edi // take start of row - add diff, ebx // add bpp - add diff, 0xf // add 7 + 8 to incr past alignment boundary - and diff, 0xfffffff8 // mask to alignment boundary - sub diff, edi // subtract from start ==> value ebx at alignment - jz davggo - // fix alignment - // Compute the Raw value for the bytes upto the alignment boundary - // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) - xor ecx, ecx -davglp1: - xor eax, eax - mov cl, [esi + ebx] // load cl with Prior(x) - mov al, [edx + ebx] // load al with Raw(x-bpp) - add ax, cx - inc ebx - shr ax, 1 // divide by 2 - add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx - cmp ebx, diff // Check if at alignment boundary - mov [edi+ebx-1], al // Write back Raw(x); - // mov does not affect flags; -1 to offset inc ebx - jb davglp1 // Repeat until at alignment boundary -davggo: - mov eax, FullLength - mov ecx, eax - sub eax, ebx // subtract alignment fix - and eax, 0x00000007 // calc bytes over mult of 8 - sub ecx, eax // drop over bytes from original length - mov MMXLength, ecx - } // end _asm block - // Now do the math for the rest of the row - switch ( bpp ) - { - case 3: - { - ActiveMask.use = 0x0000000000ffffff; - ShiftBpp.use = 24; // == 3 * 8 - ShiftRem.use = 40; // == 64 - 24 - _asm { - // Re-init address pointers and offset - movq mm7, ActiveMask - mov ebx, diff // ebx ==> x = offset to alignment boundary - movq mm5, LBCarryMask - mov edi, row // edi ==> Avg(x) - movq mm4, HBClearMask - mov esi, prev_row // esi ==> Prior(x) - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes - // (we correct position in loop below) -davg3lp: - movq mm0, [edi + ebx] // Load mm0 with Avg(x) - // Add (Prev_row/2) to Average - movq mm3, mm5 - psrlq mm2, ShiftRem // Correct position Raw(x-bpp) data - movq mm1, [esi + ebx] // Load mm1 with Prior(x) - movq mm6, mm7 - pand mm3, mm1 // get lsb for each prev_row byte - psrlq mm1, 1 // divide prev_row bytes by 2 - pand mm1, mm4 // clear invalid bit 7 of each byte - paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte - // Add 1st active group (Raw(x-bpp)/2) to Average with LBCarry - movq mm1, mm3 // now use mm1 for getting LBCarrys - pand mm1, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 (Only valid for active group) - psrlq mm2, 1 // divide raw bytes by 2 - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte - pand mm2, mm6 // Leave only Active Group 1 bytes to add to Avg - paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active - // byte - // Add 2nd active group (Raw(x-bpp)/2) to Average with LBCarry - psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 3-5 - movq mm2, mm0 // mov updated Raws to mm2 - psllq mm2, ShiftBpp // shift data to position correctly - movq mm1, mm3 // now use mm1 for getting LBCarrys - pand mm1, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 (Only valid for active group) - psrlq mm2, 1 // divide raw bytes by 2 - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte - pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg - paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active - // byte - - // Add 3rd active group (Raw(x-bpp)/2) to Average with LBCarry - psllq mm6, ShiftBpp // shift the mm6 mask to cover the last two - // bytes - movq mm2, mm0 // mov updated Raws to mm2 - psllq mm2, ShiftBpp // shift data to position correctly - // Data only needs to be shifted once here to - // get the correct x-bpp offset. - movq mm1, mm3 // now use mm1 for getting LBCarrys - pand mm1, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 (Only valid for active group) - psrlq mm2, 1 // divide raw bytes by 2 - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte - pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg - add ebx, 8 - paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active - // byte - - // Now ready to write back to memory - movq [edi + ebx - 8], mm0 - // Move updated Raw(x) to use as Raw(x-bpp) for next loop - cmp ebx, MMXLength - movq mm2, mm0 // mov updated Raw(x) to mm2 - jb davg3lp - } // end _asm block - } - break; - - case 6: - case 4: - case 7: - case 5: - { - ActiveMask.use = 0xffffffffffffffff; // use shift below to clear - // appropriate inactive bytes - ShiftBpp.use = bpp << 3; - ShiftRem.use = 64 - ShiftBpp.use; - _asm { - movq mm4, HBClearMask - // Re-init address pointers and offset - mov ebx, diff // ebx ==> x = offset to alignment boundary - // Load ActiveMask and clear all bytes except for 1st active group - movq mm7, ActiveMask - mov edi, row // edi ==> Avg(x) - psrlq mm7, ShiftRem - mov esi, prev_row // esi ==> Prior(x) - movq mm6, mm7 - movq mm5, LBCarryMask - psllq mm6, ShiftBpp // Create mask for 2nd active group - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes - // (we correct position in loop below) -davg4lp: - movq mm0, [edi + ebx] - psrlq mm2, ShiftRem // shift data to position correctly - movq mm1, [esi + ebx] - // Add (Prev_row/2) to Average - movq mm3, mm5 - pand mm3, mm1 // get lsb for each prev_row byte - psrlq mm1, 1 // divide prev_row bytes by 2 - pand mm1, mm4 // clear invalid bit 7 of each byte - paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte - // Add 1st active group (Raw(x-bpp)/2) to Average with LBCarry - movq mm1, mm3 // now use mm1 for getting LBCarrys - pand mm1, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 (Only valid for active group) - psrlq mm2, 1 // divide raw bytes by 2 - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte - pand mm2, mm7 // Leave only Active Group 1 bytes to add to Avg - paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active - // byte - // Add 2nd active group (Raw(x-bpp)/2) to Average with LBCarry - movq mm2, mm0 // mov updated Raws to mm2 - psllq mm2, ShiftBpp // shift data to position correctly - add ebx, 8 - movq mm1, mm3 // now use mm1 for getting LBCarrys - pand mm1, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 (Only valid for active group) - psrlq mm2, 1 // divide raw bytes by 2 - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte - pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg - paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active - // byte - cmp ebx, MMXLength - // Now ready to write back to memory - movq [edi + ebx - 8], mm0 - // Prep Raw(x-bpp) for next loop - movq mm2, mm0 // mov updated Raws to mm2 - jb davg4lp - } // end _asm block - } - break; - case 2: - { - ActiveMask.use = 0x000000000000ffff; - ShiftBpp.use = 16; // == 2 * 8 [BUGFIX] - ShiftRem.use = 48; // == 64 - 16 [BUGFIX] - _asm { - // Load ActiveMask - movq mm7, ActiveMask - // Re-init address pointers and offset - mov ebx, diff // ebx ==> x = offset to alignment boundary - movq mm5, LBCarryMask - mov edi, row // edi ==> Avg(x) - movq mm4, HBClearMask - mov esi, prev_row // esi ==> Prior(x) - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes - // (we correct position in loop below) -davg2lp: - movq mm0, [edi + ebx] - psrlq mm2, ShiftRem // shift data to position correctly [BUGFIX] - movq mm1, [esi + ebx] - // Add (Prev_row/2) to Average - movq mm3, mm5 - pand mm3, mm1 // get lsb for each prev_row byte - psrlq mm1, 1 // divide prev_row bytes by 2 - pand mm1, mm4 // clear invalid bit 7 of each byte - movq mm6, mm7 - paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte - // Add 1st active group (Raw(x-bpp)/2) to Average with LBCarry - movq mm1, mm3 // now use mm1 for getting LBCarrys - pand mm1, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 (Only valid for active group) - psrlq mm2, 1 // divide raw bytes by 2 - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte - pand mm2, mm6 // Leave only Active Group 1 bytes to add to Avg - paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte - // Add 2nd active group (Raw(x-bpp)/2) to Average with LBCarry - psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 2 & 3 - movq mm2, mm0 // mov updated Raws to mm2 - psllq mm2, ShiftBpp // shift data to position correctly - movq mm1, mm3 // now use mm1 for getting LBCarrys - pand mm1, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 (Only valid for active group) - psrlq mm2, 1 // divide raw bytes by 2 - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte - pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg - paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte - - // Add rdd active group (Raw(x-bpp)/2) to Average with LBCarry - psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 4 & 5 - movq mm2, mm0 // mov updated Raws to mm2 - psllq mm2, ShiftBpp // shift data to position correctly - // Data only needs to be shifted once here to - // get the correct x-bpp offset. - movq mm1, mm3 // now use mm1 for getting LBCarrys - pand mm1, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 (Only valid for active group) - psrlq mm2, 1 // divide raw bytes by 2 - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte - pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg - paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte - - // Add 4th active group (Raw(x-bpp)/2) to Average with LBCarry - psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 6 & 7 - movq mm2, mm0 // mov updated Raws to mm2 - psllq mm2, ShiftBpp // shift data to position correctly - // Data only needs to be shifted once here to - // get the correct x-bpp offset. - add ebx, 8 - movq mm1, mm3 // now use mm1 for getting LBCarrys - pand mm1, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 (Only valid for active group) - psrlq mm2, 1 // divide raw bytes by 2 - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte - pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg - paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte - - cmp ebx, MMXLength - // Now ready to write back to memory - movq [edi + ebx - 8], mm0 - // Prep Raw(x-bpp) for next loop - movq mm2, mm0 // mov updated Raws to mm2 - jb davg2lp - } // end _asm block - } - break; - - case 1: // bpp == 1 - { - _asm { - // Re-init address pointers and offset - mov ebx, diff // ebx ==> x = offset to alignment boundary - mov edi, row // edi ==> Avg(x) - cmp ebx, FullLength // Test if offset at end of array - jnb davg1end - // Do Paeth decode for remaining bytes - mov esi, prev_row // esi ==> Prior(x) - mov edx, edi - xor ecx, ecx // zero ecx before using cl & cx in loop below - sub edx, bpp // edx ==> Raw(x-bpp) -davg1lp: - // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) - xor eax, eax - mov cl, [esi + ebx] // load cl with Prior(x) - mov al, [edx + ebx] // load al with Raw(x-bpp) - add ax, cx - inc ebx - shr ax, 1 // divide by 2 - add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx - cmp ebx, FullLength // Check if at end of array - mov [edi+ebx-1], al // Write back Raw(x); - // mov does not affect flags; -1 to offset inc ebx - jb davg1lp -davg1end: - } // end _asm block - } - return; - - case 8: // bpp == 8 - { - _asm { - // Re-init address pointers and offset - mov ebx, diff // ebx ==> x = offset to alignment boundary - movq mm5, LBCarryMask - mov edi, row // edi ==> Avg(x) - movq mm4, HBClearMask - mov esi, prev_row // esi ==> Prior(x) - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes - // (NO NEED to correct position in loop below) -davg8lp: - movq mm0, [edi + ebx] - movq mm3, mm5 - movq mm1, [esi + ebx] - add ebx, 8 - pand mm3, mm1 // get lsb for each prev_row byte - psrlq mm1, 1 // divide prev_row bytes by 2 - pand mm3, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 - psrlq mm2, 1 // divide raw bytes by 2 - pand mm1, mm4 // clear invalid bit 7 of each byte - paddb mm0, mm3 // add LBCarrys to Avg for each byte - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte - paddb mm0, mm2 // add (Raw/2) to Avg for each byte - cmp ebx, MMXLength - movq [edi + ebx - 8], mm0 - movq mm2, mm0 // reuse as Raw(x-bpp) - jb davg8lp - } // end _asm block - } - break; - default: // bpp greater than 8 - { - _asm { - movq mm5, LBCarryMask - // Re-init address pointers and offset - mov ebx, diff // ebx ==> x = offset to alignment boundary - mov edi, row // edi ==> Avg(x) - movq mm4, HBClearMask - mov edx, edi - mov esi, prev_row // esi ==> Prior(x) - sub edx, bpp // edx ==> Raw(x-bpp) -davgAlp: - movq mm0, [edi + ebx] - movq mm3, mm5 - movq mm1, [esi + ebx] - pand mm3, mm1 // get lsb for each prev_row byte - movq mm2, [edx + ebx] - psrlq mm1, 1 // divide prev_row bytes by 2 - pand mm3, mm2 // get LBCarrys for each byte where both - // lsb's were == 1 - psrlq mm2, 1 // divide raw bytes by 2 - pand mm1, mm4 // clear invalid bit 7 of each byte - paddb mm0, mm3 // add LBCarrys to Avg for each byte - pand mm2, mm4 // clear invalid bit 7 of each byte - paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte - add ebx, 8 - paddb mm0, mm2 // add (Raw/2) to Avg for each byte - cmp ebx, MMXLength - movq [edi + ebx - 8], mm0 - jb davgAlp - } // end _asm block - } - break; - } // end switch ( bpp ) - - _asm { - // MMX acceleration complete now do clean-up - // Check if any remaining bytes left to decode - mov ebx, MMXLength // ebx ==> x = offset bytes remaining after MMX - mov edi, row // edi ==> Avg(x) - cmp ebx, FullLength // Test if offset at end of array - jnb davgend - // Do Paeth decode for remaining bytes - mov esi, prev_row // esi ==> Prior(x) - mov edx, edi - xor ecx, ecx // zero ecx before using cl & cx in loop below - sub edx, bpp // edx ==> Raw(x-bpp) -davglp2: - // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) - xor eax, eax - mov cl, [esi + ebx] // load cl with Prior(x) - mov al, [edx + ebx] // load al with Raw(x-bpp) - add ax, cx - inc ebx - shr ax, 1 // divide by 2 - add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx - cmp ebx, FullLength // Check if at end of array - mov [edi+ebx-1], al // Write back Raw(x); - // mov does not affect flags; -1 to offset inc ebx - jb davglp2 -davgend: - emms // End MMX instructions; prep for possible FP instrs. - } // end _asm block -} - -// Optimized code for PNG Paeth filter decoder -void /* PRIVATE */ -png_read_filter_row_mmx_paeth(png_row_infop row_info, png_bytep row, - png_bytep prev_row) -{ - png_uint_32 FullLength; - png_uint_32 MMXLength; - //png_uint_32 len; - int bpp; - int diff; - //int ptemp; - int patemp, pbtemp, pctemp; - - bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel - FullLength = row_info->rowbytes; // # of bytes to filter - _asm - { - xor ebx, ebx // ebx ==> x offset - mov edi, row - xor edx, edx // edx ==> x-bpp offset - mov esi, prev_row - xor eax, eax - - // Compute the Raw value for the first bpp bytes - // Note: the formula works out to be always - // Paeth(x) = Raw(x) + Prior(x) where x < bpp -dpthrlp: - mov al, [edi + ebx] - add al, [esi + ebx] - inc ebx - cmp ebx, bpp - mov [edi + ebx - 1], al - jb dpthrlp - // get # of bytes to alignment - mov diff, edi // take start of row - add diff, ebx // add bpp - xor ecx, ecx - add diff, 0xf // add 7 + 8 to incr past alignment boundary - and diff, 0xfffffff8 // mask to alignment boundary - sub diff, edi // subtract from start ==> value ebx at alignment - jz dpthgo - // fix alignment -dpthlp1: - xor eax, eax - // pav = p - a = (a + b - c) - a = b - c - mov al, [esi + ebx] // load Prior(x) into al - mov cl, [esi + edx] // load Prior(x-bpp) into cl - sub eax, ecx // subtract Prior(x-bpp) - mov patemp, eax // Save pav for later use - xor eax, eax - // pbv = p - b = (a + b - c) - b = a - c - mov al, [edi + edx] // load Raw(x-bpp) into al - sub eax, ecx // subtract Prior(x-bpp) - mov ecx, eax - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - add eax, patemp // pcv = pav + pbv - // pc = abs(pcv) - test eax, 0x80000000 - jz dpthpca - neg eax // reverse sign of neg values -dpthpca: - mov pctemp, eax // save pc for later use - // pb = abs(pbv) - test ecx, 0x80000000 - jz dpthpba - neg ecx // reverse sign of neg values -dpthpba: - mov pbtemp, ecx // save pb for later use - // pa = abs(pav) - mov eax, patemp - test eax, 0x80000000 - jz dpthpaa - neg eax // reverse sign of neg values -dpthpaa: - mov patemp, eax // save pa for later use - // test if pa <= pb - cmp eax, ecx - jna dpthabb - // pa > pb; now test if pb <= pc - cmp ecx, pctemp - jna dpthbbc - // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - mov cl, [esi + edx] // load Prior(x-bpp) into cl - jmp dpthpaeth -dpthbbc: - // pb <= pc; Raw(x) = Paeth(x) + Prior(x) - mov cl, [esi + ebx] // load Prior(x) into cl - jmp dpthpaeth -dpthabb: - // pa <= pb; now test if pa <= pc - cmp eax, pctemp - jna dpthabc - // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - mov cl, [esi + edx] // load Prior(x-bpp) into cl - jmp dpthpaeth -dpthabc: - // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) - mov cl, [edi + edx] // load Raw(x-bpp) into cl -dpthpaeth: - inc ebx - inc edx - // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 - add [edi + ebx - 1], cl - cmp ebx, diff - jb dpthlp1 -dpthgo: - mov ecx, FullLength - mov eax, ecx - sub eax, ebx // subtract alignment fix - and eax, 0x00000007 // calc bytes over mult of 8 - sub ecx, eax // drop over bytes from original length - mov MMXLength, ecx - } // end _asm block - // Now do the math for the rest of the row - switch ( bpp ) - { - case 3: - { - ActiveMask.use = 0x0000000000ffffff; - ActiveMaskEnd.use = 0xffff000000000000; - ShiftBpp.use = 24; // == bpp(3) * 8 - ShiftRem.use = 40; // == 64 - 24 - _asm - { - mov ebx, diff - mov edi, row - mov esi, prev_row - pxor mm0, mm0 - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm1, [edi+ebx-8] -dpth3lp: - psrlq mm1, ShiftRem // shift last 3 bytes to 1st 3 bytes - movq mm2, [esi + ebx] // load b=Prior(x) - punpcklbw mm1, mm0 // Unpack High bytes of a - movq mm3, [esi+ebx-8] // Prep c=Prior(x-bpp) bytes - punpcklbw mm2, mm0 // Unpack High bytes of b - psrlq mm3, ShiftRem // shift last 3 bytes to 1st 3 bytes - // pav = p - a = (a + b - c) - a = b - c - movq mm4, mm2 - punpcklbw mm3, mm0 // Unpack High bytes of c - // pbv = p - b = (a + b - c) - b = a - c - movq mm5, mm1 - psubw mm4, mm3 - pxor mm7, mm7 - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - movq mm6, mm4 - psubw mm5, mm3 - - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - pcmpgtw mm0, mm4 // Create mask pav bytes < 0 - paddw mm6, mm5 - pand mm0, mm4 // Only pav bytes < 0 in mm7 - pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 - psubw mm4, mm0 - pand mm7, mm5 // Only pbv bytes < 0 in mm0 - psubw mm4, mm0 - psubw mm5, mm7 - pxor mm0, mm0 - pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 - pand mm0, mm6 // Only pav bytes < 0 in mm7 - psubw mm5, mm7 - psubw mm6, mm0 - // test pa <= pb - movq mm7, mm4 - psubw mm6, mm0 - pcmpgtw mm7, mm5 // pa > pb? - movq mm0, mm7 - // use mm7 mask to merge pa & pb - pand mm5, mm7 - // use mm0 mask copy to merge a & b - pand mm2, mm0 - pandn mm7, mm4 - pandn mm0, mm1 - paddw mm7, mm5 - paddw mm0, mm2 - // test ((pa <= pb)? pa:pb) <= pc - pcmpgtw mm7, mm6 // pab > pc? - pxor mm1, mm1 - pand mm3, mm7 - pandn mm7, mm0 - paddw mm7, mm3 - pxor mm0, mm0 - packuswb mm7, mm1 - movq mm3, [esi + ebx] // load c=Prior(x-bpp) - pand mm7, ActiveMask - movq mm2, mm3 // load b=Prior(x) step 1 - paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) - punpcklbw mm3, mm0 // Unpack High bytes of c - movq [edi + ebx], mm7 // write back updated value - movq mm1, mm7 // Now mm1 will be used as Raw(x-bpp) - // Now do Paeth for 2nd set of bytes (3-5) - psrlq mm2, ShiftBpp // load b=Prior(x) step 2 - punpcklbw mm1, mm0 // Unpack High bytes of a - pxor mm7, mm7 - punpcklbw mm2, mm0 // Unpack High bytes of b - // pbv = p - b = (a + b - c) - b = a - c - movq mm5, mm1 - // pav = p - a = (a + b - c) - a = b - c - movq mm4, mm2 - psubw mm5, mm3 - psubw mm4, mm3 - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = - // pav + pbv = pbv + pav - movq mm6, mm5 - paddw mm6, mm4 - - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - pcmpgtw mm0, mm5 // Create mask pbv bytes < 0 - pcmpgtw mm7, mm4 // Create mask pav bytes < 0 - pand mm0, mm5 // Only pbv bytes < 0 in mm0 - pand mm7, mm4 // Only pav bytes < 0 in mm7 - psubw mm5, mm0 - psubw mm4, mm7 - psubw mm5, mm0 - psubw mm4, mm7 - pxor mm0, mm0 - pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 - pand mm0, mm6 // Only pav bytes < 0 in mm7 - psubw mm6, mm0 - // test pa <= pb - movq mm7, mm4 - psubw mm6, mm0 - pcmpgtw mm7, mm5 // pa > pb? - movq mm0, mm7 - // use mm7 mask to merge pa & pb - pand mm5, mm7 - // use mm0 mask copy to merge a & b - pand mm2, mm0 - pandn mm7, mm4 - pandn mm0, mm1 - paddw mm7, mm5 - paddw mm0, mm2 - // test ((pa <= pb)? pa:pb) <= pc - pcmpgtw mm7, mm6 // pab > pc? - movq mm2, [esi + ebx] // load b=Prior(x) - pand mm3, mm7 - pandn mm7, mm0 - pxor mm1, mm1 - paddw mm7, mm3 - pxor mm0, mm0 - packuswb mm7, mm1 - movq mm3, mm2 // load c=Prior(x-bpp) step 1 - pand mm7, ActiveMask - punpckhbw mm2, mm0 // Unpack High bytes of b - psllq mm7, ShiftBpp // Shift bytes to 2nd group of 3 bytes - // pav = p - a = (a + b - c) - a = b - c - movq mm4, mm2 - paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) - psllq mm3, ShiftBpp // load c=Prior(x-bpp) step 2 - movq [edi + ebx], mm7 // write back updated value - movq mm1, mm7 - punpckhbw mm3, mm0 // Unpack High bytes of c - psllq mm1, ShiftBpp // Shift bytes - // Now mm1 will be used as Raw(x-bpp) - // Now do Paeth for 3rd, and final, set of bytes (6-7) - pxor mm7, mm7 - punpckhbw mm1, mm0 // Unpack High bytes of a - psubw mm4, mm3 - // pbv = p - b = (a + b - c) - b = a - c - movq mm5, mm1 - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - movq mm6, mm4 - psubw mm5, mm3 - pxor mm0, mm0 - paddw mm6, mm5 - - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - pcmpgtw mm0, mm4 // Create mask pav bytes < 0 - pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 - pand mm0, mm4 // Only pav bytes < 0 in mm7 - pand mm7, mm5 // Only pbv bytes < 0 in mm0 - psubw mm4, mm0 - psubw mm5, mm7 - psubw mm4, mm0 - psubw mm5, mm7 - pxor mm0, mm0 - pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 - pand mm0, mm6 // Only pav bytes < 0 in mm7 - psubw mm6, mm0 - // test pa <= pb - movq mm7, mm4 - psubw mm6, mm0 - pcmpgtw mm7, mm5 // pa > pb? - movq mm0, mm7 - // use mm0 mask copy to merge a & b - pand mm2, mm0 - // use mm7 mask to merge pa & pb - pand mm5, mm7 - pandn mm0, mm1 - pandn mm7, mm4 - paddw mm0, mm2 - paddw mm7, mm5 - // test ((pa <= pb)? pa:pb) <= pc - pcmpgtw mm7, mm6 // pab > pc? - pand mm3, mm7 - pandn mm7, mm0 - paddw mm7, mm3 - pxor mm1, mm1 - packuswb mm1, mm7 - // Step ebx to next set of 8 bytes and repeat loop til done - add ebx, 8 - pand mm1, ActiveMaskEnd - paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x) - - cmp ebx, MMXLength - pxor mm0, mm0 // pxor does not affect flags - movq [edi + ebx - 8], mm1 // write back updated value - // mm1 will be used as Raw(x-bpp) next loop - // mm3 ready to be used as Prior(x-bpp) next loop - jb dpth3lp - } // end _asm block - } - break; - - case 6: - case 7: - case 5: - { - ActiveMask.use = 0x00000000ffffffff; - ActiveMask2.use = 0xffffffff00000000; - ShiftBpp.use = bpp << 3; // == bpp * 8 - ShiftRem.use = 64 - ShiftBpp.use; - _asm - { - mov ebx, diff - mov edi, row - mov esi, prev_row - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm1, [edi+ebx-8] - pxor mm0, mm0 -dpth6lp: - // Must shift to position Raw(x-bpp) data - psrlq mm1, ShiftRem - // Do first set of 4 bytes - movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes - punpcklbw mm1, mm0 // Unpack Low bytes of a - movq mm2, [esi + ebx] // load b=Prior(x) - punpcklbw mm2, mm0 // Unpack Low bytes of b - // Must shift to position Prior(x-bpp) data - psrlq mm3, ShiftRem - // pav = p - a = (a + b - c) - a = b - c - movq mm4, mm2 - punpcklbw mm3, mm0 // Unpack Low bytes of c - // pbv = p - b = (a + b - c) - b = a - c - movq mm5, mm1 - psubw mm4, mm3 - pxor mm7, mm7 - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - movq mm6, mm4 - psubw mm5, mm3 - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - pcmpgtw mm0, mm4 // Create mask pav bytes < 0 - paddw mm6, mm5 - pand mm0, mm4 // Only pav bytes < 0 in mm7 - pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 - psubw mm4, mm0 - pand mm7, mm5 // Only pbv bytes < 0 in mm0 - psubw mm4, mm0 - psubw mm5, mm7 - pxor mm0, mm0 - pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 - pand mm0, mm6 // Only pav bytes < 0 in mm7 - psubw mm5, mm7 - psubw mm6, mm0 - // test pa <= pb - movq mm7, mm4 - psubw mm6, mm0 - pcmpgtw mm7, mm5 // pa > pb? - movq mm0, mm7 - // use mm7 mask to merge pa & pb - pand mm5, mm7 - // use mm0 mask copy to merge a & b - pand mm2, mm0 - pandn mm7, mm4 - pandn mm0, mm1 - paddw mm7, mm5 - paddw mm0, mm2 - // test ((pa <= pb)? pa:pb) <= pc - pcmpgtw mm7, mm6 // pab > pc? - pxor mm1, mm1 - pand mm3, mm7 - pandn mm7, mm0 - paddw mm7, mm3 - pxor mm0, mm0 - packuswb mm7, mm1 - movq mm3, [esi + ebx - 8] // load c=Prior(x-bpp) - pand mm7, ActiveMask - psrlq mm3, ShiftRem - movq mm2, [esi + ebx] // load b=Prior(x) step 1 - paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) - movq mm6, mm2 - movq [edi + ebx], mm7 // write back updated value - movq mm1, [edi+ebx-8] - psllq mm6, ShiftBpp - movq mm5, mm7 - psrlq mm1, ShiftRem - por mm3, mm6 - psllq mm5, ShiftBpp - punpckhbw mm3, mm0 // Unpack High bytes of c - por mm1, mm5 - // Do second set of 4 bytes - punpckhbw mm2, mm0 // Unpack High bytes of b - punpckhbw mm1, mm0 // Unpack High bytes of a - // pav = p - a = (a + b - c) - a = b - c - movq mm4, mm2 - // pbv = p - b = (a + b - c) - b = a - c - movq mm5, mm1 - psubw mm4, mm3 - pxor mm7, mm7 - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - movq mm6, mm4 - psubw mm5, mm3 - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - pcmpgtw mm0, mm4 // Create mask pav bytes < 0 - paddw mm6, mm5 - pand mm0, mm4 // Only pav bytes < 0 in mm7 - pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 - psubw mm4, mm0 - pand mm7, mm5 // Only pbv bytes < 0 in mm0 - psubw mm4, mm0 - psubw mm5, mm7 - pxor mm0, mm0 - pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 - pand mm0, mm6 // Only pav bytes < 0 in mm7 - psubw mm5, mm7 - psubw mm6, mm0 - // test pa <= pb - movq mm7, mm4 - psubw mm6, mm0 - pcmpgtw mm7, mm5 // pa > pb? - movq mm0, mm7 - // use mm7 mask to merge pa & pb - pand mm5, mm7 - // use mm0 mask copy to merge a & b - pand mm2, mm0 - pandn mm7, mm4 - pandn mm0, mm1 - paddw mm7, mm5 - paddw mm0, mm2 - // test ((pa <= pb)? pa:pb) <= pc - pcmpgtw mm7, mm6 // pab > pc? - pxor mm1, mm1 - pand mm3, mm7 - pandn mm7, mm0 - pxor mm1, mm1 - paddw mm7, mm3 - pxor mm0, mm0 - // Step ex to next set of 8 bytes and repeat loop til done - add ebx, 8 - packuswb mm1, mm7 - paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x) - cmp ebx, MMXLength - movq [edi + ebx - 8], mm1 // write back updated value - // mm1 will be used as Raw(x-bpp) next loop - jb dpth6lp - } // end _asm block - } - break; - - case 4: - { - ActiveMask.use = 0x00000000ffffffff; - _asm { - mov ebx, diff - mov edi, row - mov esi, prev_row - pxor mm0, mm0 - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm1, [edi+ebx-8] // Only time should need to read - // a=Raw(x-bpp) bytes -dpth4lp: - // Do first set of 4 bytes - movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes - punpckhbw mm1, mm0 // Unpack Low bytes of a - movq mm2, [esi + ebx] // load b=Prior(x) - punpcklbw mm2, mm0 // Unpack High bytes of b - // pav = p - a = (a + b - c) - a = b - c - movq mm4, mm2 - punpckhbw mm3, mm0 // Unpack High bytes of c - // pbv = p - b = (a + b - c) - b = a - c - movq mm5, mm1 - psubw mm4, mm3 - pxor mm7, mm7 - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - movq mm6, mm4 - psubw mm5, mm3 - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - pcmpgtw mm0, mm4 // Create mask pav bytes < 0 - paddw mm6, mm5 - pand mm0, mm4 // Only pav bytes < 0 in mm7 - pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 - psubw mm4, mm0 - pand mm7, mm5 // Only pbv bytes < 0 in mm0 - psubw mm4, mm0 - psubw mm5, mm7 - pxor mm0, mm0 - pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 - pand mm0, mm6 // Only pav bytes < 0 in mm7 - psubw mm5, mm7 - psubw mm6, mm0 - // test pa <= pb - movq mm7, mm4 - psubw mm6, mm0 - pcmpgtw mm7, mm5 // pa > pb? - movq mm0, mm7 - // use mm7 mask to merge pa & pb - pand mm5, mm7 - // use mm0 mask copy to merge a & b - pand mm2, mm0 - pandn mm7, mm4 - pandn mm0, mm1 - paddw mm7, mm5 - paddw mm0, mm2 - // test ((pa <= pb)? pa:pb) <= pc - pcmpgtw mm7, mm6 // pab > pc? - pxor mm1, mm1 - pand mm3, mm7 - pandn mm7, mm0 - paddw mm7, mm3 - pxor mm0, mm0 - packuswb mm7, mm1 - movq mm3, [esi + ebx] // load c=Prior(x-bpp) - pand mm7, ActiveMask - movq mm2, mm3 // load b=Prior(x) step 1 - paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) - punpcklbw mm3, mm0 // Unpack High bytes of c - movq [edi + ebx], mm7 // write back updated value - movq mm1, mm7 // Now mm1 will be used as Raw(x-bpp) - // Do second set of 4 bytes - punpckhbw mm2, mm0 // Unpack Low bytes of b - punpcklbw mm1, mm0 // Unpack Low bytes of a - // pav = p - a = (a + b - c) - a = b - c - movq mm4, mm2 - // pbv = p - b = (a + b - c) - b = a - c - movq mm5, mm1 - psubw mm4, mm3 - pxor mm7, mm7 - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - movq mm6, mm4 - psubw mm5, mm3 - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - pcmpgtw mm0, mm4 // Create mask pav bytes < 0 - paddw mm6, mm5 - pand mm0, mm4 // Only pav bytes < 0 in mm7 - pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 - psubw mm4, mm0 - pand mm7, mm5 // Only pbv bytes < 0 in mm0 - psubw mm4, mm0 - psubw mm5, mm7 - pxor mm0, mm0 - pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 - pand mm0, mm6 // Only pav bytes < 0 in mm7 - psubw mm5, mm7 - psubw mm6, mm0 - // test pa <= pb - movq mm7, mm4 - psubw mm6, mm0 - pcmpgtw mm7, mm5 // pa > pb? - movq mm0, mm7 - // use mm7 mask to merge pa & pb - pand mm5, mm7 - // use mm0 mask copy to merge a & b - pand mm2, mm0 - pandn mm7, mm4 - pandn mm0, mm1 - paddw mm7, mm5 - paddw mm0, mm2 - // test ((pa <= pb)? pa:pb) <= pc - pcmpgtw mm7, mm6 // pab > pc? - pxor mm1, mm1 - pand mm3, mm7 - pandn mm7, mm0 - pxor mm1, mm1 - paddw mm7, mm3 - pxor mm0, mm0 - // Step ex to next set of 8 bytes and repeat loop til done - add ebx, 8 - packuswb mm1, mm7 - paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x) - cmp ebx, MMXLength - movq [edi + ebx - 8], mm1 // write back updated value - // mm1 will be used as Raw(x-bpp) next loop - jb dpth4lp - } // end _asm block - } - break; - case 8: // bpp == 8 - { - ActiveMask.use = 0x00000000ffffffff; - _asm { - mov ebx, diff - mov edi, row - mov esi, prev_row - pxor mm0, mm0 - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm1, [edi+ebx-8] // Only time should need to read - // a=Raw(x-bpp) bytes -dpth8lp: - // Do first set of 4 bytes - movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes - punpcklbw mm1, mm0 // Unpack Low bytes of a - movq mm2, [esi + ebx] // load b=Prior(x) - punpcklbw mm2, mm0 // Unpack Low bytes of b - // pav = p - a = (a + b - c) - a = b - c - movq mm4, mm2 - punpcklbw mm3, mm0 // Unpack Low bytes of c - // pbv = p - b = (a + b - c) - b = a - c - movq mm5, mm1 - psubw mm4, mm3 - pxor mm7, mm7 - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - movq mm6, mm4 - psubw mm5, mm3 - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - pcmpgtw mm0, mm4 // Create mask pav bytes < 0 - paddw mm6, mm5 - pand mm0, mm4 // Only pav bytes < 0 in mm7 - pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 - psubw mm4, mm0 - pand mm7, mm5 // Only pbv bytes < 0 in mm0 - psubw mm4, mm0 - psubw mm5, mm7 - pxor mm0, mm0 - pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 - pand mm0, mm6 // Only pav bytes < 0 in mm7 - psubw mm5, mm7 - psubw mm6, mm0 - // test pa <= pb - movq mm7, mm4 - psubw mm6, mm0 - pcmpgtw mm7, mm5 // pa > pb? - movq mm0, mm7 - // use mm7 mask to merge pa & pb - pand mm5, mm7 - // use mm0 mask copy to merge a & b - pand mm2, mm0 - pandn mm7, mm4 - pandn mm0, mm1 - paddw mm7, mm5 - paddw mm0, mm2 - // test ((pa <= pb)? pa:pb) <= pc - pcmpgtw mm7, mm6 // pab > pc? - pxor mm1, mm1 - pand mm3, mm7 - pandn mm7, mm0 - paddw mm7, mm3 - pxor mm0, mm0 - packuswb mm7, mm1 - movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes - pand mm7, ActiveMask - movq mm2, [esi + ebx] // load b=Prior(x) - paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) - punpckhbw mm3, mm0 // Unpack High bytes of c - movq [edi + ebx], mm7 // write back updated value - movq mm1, [edi+ebx-8] // read a=Raw(x-bpp) bytes - - // Do second set of 4 bytes - punpckhbw mm2, mm0 // Unpack High bytes of b - punpckhbw mm1, mm0 // Unpack High bytes of a - // pav = p - a = (a + b - c) - a = b - c - movq mm4, mm2 - // pbv = p - b = (a + b - c) - b = a - c - movq mm5, mm1 - psubw mm4, mm3 - pxor mm7, mm7 - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - movq mm6, mm4 - psubw mm5, mm3 - // pa = abs(p-a) = abs(pav) - // pb = abs(p-b) = abs(pbv) - // pc = abs(p-c) = abs(pcv) - pcmpgtw mm0, mm4 // Create mask pav bytes < 0 - paddw mm6, mm5 - pand mm0, mm4 // Only pav bytes < 0 in mm7 - pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 - psubw mm4, mm0 - pand mm7, mm5 // Only pbv bytes < 0 in mm0 - psubw mm4, mm0 - psubw mm5, mm7 - pxor mm0, mm0 - pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 - pand mm0, mm6 // Only pav bytes < 0 in mm7 - psubw mm5, mm7 - psubw mm6, mm0 - // test pa <= pb - movq mm7, mm4 - psubw mm6, mm0 - pcmpgtw mm7, mm5 // pa > pb? - movq mm0, mm7 - // use mm7 mask to merge pa & pb - pand mm5, mm7 - // use mm0 mask copy to merge a & b - pand mm2, mm0 - pandn mm7, mm4 - pandn mm0, mm1 - paddw mm7, mm5 - paddw mm0, mm2 - // test ((pa <= pb)? pa:pb) <= pc - pcmpgtw mm7, mm6 // pab > pc? - pxor mm1, mm1 - pand mm3, mm7 - pandn mm7, mm0 - pxor mm1, mm1 - paddw mm7, mm3 - pxor mm0, mm0 - // Step ex to next set of 8 bytes and repeat loop til done - add ebx, 8 - packuswb mm1, mm7 - paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x) - cmp ebx, MMXLength - movq [edi + ebx - 8], mm1 // write back updated value - // mm1 will be used as Raw(x-bpp) next loop - jb dpth8lp - } // end _asm block - } - break; - - case 1: // bpp = 1 - case 2: // bpp = 2 - default: // bpp > 8 - { - _asm { - mov ebx, diff - cmp ebx, FullLength - jnb dpthdend - mov edi, row - mov esi, prev_row - // Do Paeth decode for remaining bytes - mov edx, ebx - xor ecx, ecx // zero ecx before using cl & cx in loop below - sub edx, bpp // Set edx = ebx - bpp -dpthdlp: - xor eax, eax - // pav = p - a = (a + b - c) - a = b - c - mov al, [esi + ebx] // load Prior(x) into al - mov cl, [esi + edx] // load Prior(x-bpp) into cl - sub eax, ecx // subtract Prior(x-bpp) - mov patemp, eax // Save pav for later use - xor eax, eax - // pbv = p - b = (a + b - c) - b = a - c - mov al, [edi + edx] // load Raw(x-bpp) into al - sub eax, ecx // subtract Prior(x-bpp) - mov ecx, eax - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - add eax, patemp // pcv = pav + pbv - // pc = abs(pcv) - test eax, 0x80000000 - jz dpthdpca - neg eax // reverse sign of neg values -dpthdpca: - mov pctemp, eax // save pc for later use - // pb = abs(pbv) - test ecx, 0x80000000 - jz dpthdpba - neg ecx // reverse sign of neg values -dpthdpba: - mov pbtemp, ecx // save pb for later use - // pa = abs(pav) - mov eax, patemp - test eax, 0x80000000 - jz dpthdpaa - neg eax // reverse sign of neg values -dpthdpaa: - mov patemp, eax // save pa for later use - // test if pa <= pb - cmp eax, ecx - jna dpthdabb - // pa > pb; now test if pb <= pc - cmp ecx, pctemp - jna dpthdbbc - // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - mov cl, [esi + edx] // load Prior(x-bpp) into cl - jmp dpthdpaeth -dpthdbbc: - // pb <= pc; Raw(x) = Paeth(x) + Prior(x) - mov cl, [esi + ebx] // load Prior(x) into cl - jmp dpthdpaeth -dpthdabb: - // pa <= pb; now test if pa <= pc - cmp eax, pctemp - jna dpthdabc - // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - mov cl, [esi + edx] // load Prior(x-bpp) into cl - jmp dpthdpaeth -dpthdabc: - // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) - mov cl, [edi + edx] // load Raw(x-bpp) into cl -dpthdpaeth: - inc ebx - inc edx - // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 - add [edi + ebx - 1], cl - cmp ebx, FullLength - jb dpthdlp -dpthdend: - } // end _asm block - } - return; // No need to go further with this one - } // end switch ( bpp ) - _asm - { - // MMX acceleration complete now do clean-up - // Check if any remaining bytes left to decode - mov ebx, MMXLength - cmp ebx, FullLength - jnb dpthend - mov edi, row - mov esi, prev_row - // Do Paeth decode for remaining bytes - mov edx, ebx - xor ecx, ecx // zero ecx before using cl & cx in loop below - sub edx, bpp // Set edx = ebx - bpp -dpthlp2: - xor eax, eax - // pav = p - a = (a + b - c) - a = b - c - mov al, [esi + ebx] // load Prior(x) into al - mov cl, [esi + edx] // load Prior(x-bpp) into cl - sub eax, ecx // subtract Prior(x-bpp) - mov patemp, eax // Save pav for later use - xor eax, eax - // pbv = p - b = (a + b - c) - b = a - c - mov al, [edi + edx] // load Raw(x-bpp) into al - sub eax, ecx // subtract Prior(x-bpp) - mov ecx, eax - // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv - add eax, patemp // pcv = pav + pbv - // pc = abs(pcv) - test eax, 0x80000000 - jz dpthpca2 - neg eax // reverse sign of neg values -dpthpca2: - mov pctemp, eax // save pc for later use - // pb = abs(pbv) - test ecx, 0x80000000 - jz dpthpba2 - neg ecx // reverse sign of neg values -dpthpba2: - mov pbtemp, ecx // save pb for later use - // pa = abs(pav) - mov eax, patemp - test eax, 0x80000000 - jz dpthpaa2 - neg eax // reverse sign of neg values -dpthpaa2: - mov patemp, eax // save pa for later use - // test if pa <= pb - cmp eax, ecx - jna dpthabb2 - // pa > pb; now test if pb <= pc - cmp ecx, pctemp - jna dpthbbc2 - // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - mov cl, [esi + edx] // load Prior(x-bpp) into cl - jmp dpthpaeth2 -dpthbbc2: - // pb <= pc; Raw(x) = Paeth(x) + Prior(x) - mov cl, [esi + ebx] // load Prior(x) into cl - jmp dpthpaeth2 -dpthabb2: - // pa <= pb; now test if pa <= pc - cmp eax, pctemp - jna dpthabc2 - // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) - mov cl, [esi + edx] // load Prior(x-bpp) into cl - jmp dpthpaeth2 -dpthabc2: - // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) - mov cl, [edi + edx] // load Raw(x-bpp) into cl -dpthpaeth2: - inc ebx - inc edx - // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 - add [edi + ebx - 1], cl - cmp ebx, FullLength - jb dpthlp2 -dpthend: - emms // End MMX instructions; prep for possible FP instrs. - } // end _asm block -} - -// Optimized code for PNG Sub filter decoder -void /* PRIVATE */ -png_read_filter_row_mmx_sub(png_row_infop row_info, png_bytep row) -{ - //int test; - int bpp; - png_uint_32 FullLength; - png_uint_32 MMXLength; - int diff; - - bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel - FullLength = row_info->rowbytes - bpp; // # of bytes to filter - _asm { - mov edi, row - mov esi, edi // lp = row - add edi, bpp // rp = row + bpp - xor eax, eax - // get # of bytes to alignment - mov diff, edi // take start of row - add diff, 0xf // add 7 + 8 to incr past - // alignment boundary - xor ebx, ebx - and diff, 0xfffffff8 // mask to alignment boundary - sub diff, edi // subtract from start ==> value - // ebx at alignment - jz dsubgo - // fix alignment -dsublp1: - mov al, [esi+ebx] - add [edi+ebx], al - inc ebx - cmp ebx, diff - jb dsublp1 -dsubgo: - mov ecx, FullLength - mov edx, ecx - sub edx, ebx // subtract alignment fix - and edx, 0x00000007 // calc bytes over mult of 8 - sub ecx, edx // drop over bytes from length - mov MMXLength, ecx - } // end _asm block - - // Now do the math for the rest of the row - switch ( bpp ) - { - case 3: - { - ActiveMask.use = 0x0000ffffff000000; - ShiftBpp.use = 24; // == 3 * 8 - ShiftRem.use = 40; // == 64 - 24 - _asm { - mov edi, row - movq mm7, ActiveMask // Load ActiveMask for 2nd active byte group - mov esi, edi // lp = row - add edi, bpp // rp = row + bpp - movq mm6, mm7 - mov ebx, diff - psllq mm6, ShiftBpp // Move mask in mm6 to cover 3rd active - // byte group - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm1, [edi+ebx-8] -dsub3lp: - psrlq mm1, ShiftRem // Shift data for adding 1st bpp bytes - // no need for mask; shift clears inactive bytes - // Add 1st active group - movq mm0, [edi+ebx] - paddb mm0, mm1 - // Add 2nd active group - movq mm1, mm0 // mov updated Raws to mm1 - psllq mm1, ShiftBpp // shift data to position correctly - pand mm1, mm7 // mask to use only 2nd active group - paddb mm0, mm1 - // Add 3rd active group - movq mm1, mm0 // mov updated Raws to mm1 - psllq mm1, ShiftBpp // shift data to position correctly - pand mm1, mm6 // mask to use only 3rd active group - add ebx, 8 - paddb mm0, mm1 - cmp ebx, MMXLength - movq [edi+ebx-8], mm0 // Write updated Raws back to array - // Prep for doing 1st add at top of loop - movq mm1, mm0 - jb dsub3lp - } // end _asm block - } - break; - - case 1: - { - // Placed here just in case this is a duplicate of the - // non-MMX code for the SUB filter in png_read_filter_row below - // - // png_bytep rp; - // png_bytep lp; - // png_uint_32 i; - // bpp = (row_info->pixel_depth + 7) >> 3; - // for (i = (png_uint_32)bpp, rp = row + bpp, lp = row; - // i < row_info->rowbytes; i++, rp++, lp++) - // { - // *rp = (png_byte)(((int)(*rp) + (int)(*lp)) & 0xff); - // } - _asm { - mov ebx, diff - mov edi, row - cmp ebx, FullLength - jnb dsub1end - mov esi, edi // lp = row - xor eax, eax - add edi, bpp // rp = row + bpp -dsub1lp: - mov al, [esi+ebx] - add [edi+ebx], al - inc ebx - cmp ebx, FullLength - jb dsub1lp -dsub1end: - } // end _asm block - } - return; - - case 6: - case 7: - case 4: - case 5: - { - ShiftBpp.use = bpp << 3; - ShiftRem.use = 64 - ShiftBpp.use; - _asm { - mov edi, row - mov ebx, diff - mov esi, edi // lp = row - add edi, bpp // rp = row + bpp - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm1, [edi+ebx-8] -dsub4lp: - psrlq mm1, ShiftRem // Shift data for adding 1st bpp bytes - // no need for mask; shift clears inactive bytes - movq mm0, [edi+ebx] - paddb mm0, mm1 - // Add 2nd active group - movq mm1, mm0 // mov updated Raws to mm1 - psllq mm1, ShiftBpp // shift data to position correctly - // there is no need for any mask - // since shift clears inactive bits/bytes - add ebx, 8 - paddb mm0, mm1 - cmp ebx, MMXLength - movq [edi+ebx-8], mm0 - movq mm1, mm0 // Prep for doing 1st add at top of loop - jb dsub4lp - } // end _asm block - } - break; - - case 2: - { - ActiveMask.use = 0x00000000ffff0000; - ShiftBpp.use = 16; // == 2 * 8 - ShiftRem.use = 48; // == 64 - 16 - _asm { - movq mm7, ActiveMask // Load ActiveMask for 2nd active byte group - mov ebx, diff - movq mm6, mm7 - mov edi, row - psllq mm6, ShiftBpp // Move mask in mm6 to cover 3rd active - // byte group - mov esi, edi // lp = row - movq mm5, mm6 - add edi, bpp // rp = row + bpp - psllq mm5, ShiftBpp // Move mask in mm5 to cover 4th active - // byte group - // PRIME the pump (load the first Raw(x-bpp) data set - movq mm1, [edi+ebx-8] -dsub2lp: - // Add 1st active group - psrlq mm1, ShiftRem // Shift data for adding 1st bpp bytes - // no need for mask; shift clears inactive - // bytes - movq mm0, [edi+ebx] - paddb mm0, mm1 - // Add 2nd active group - movq mm1, mm0 // mov updated Raws to mm1 - psllq mm1, ShiftBpp // shift data to position correctly - pand mm1, mm7 // mask to use only 2nd active group - paddb mm0, mm1 - // Add 3rd active group - movq mm1, mm0 // mov updated Raws to mm1 - psllq mm1, ShiftBpp // shift data to position correctly - pand mm1, mm6 // mask to use only 3rd active group - paddb mm0, mm1 - // Add 4th active group - movq mm1, mm0 // mov updated Raws to mm1 - psllq mm1, ShiftBpp // shift data to position correctly - pand mm1, mm5 // mask to use only 4th active group - add ebx, 8 - paddb mm0, mm1 - cmp ebx, MMXLength - movq [edi+ebx-8], mm0 // Write updated Raws back to array - movq mm1, mm0 // Prep for doing 1st add at top of loop - jb dsub2lp - } // end _asm block - } - break; - case 8: - { - _asm { - mov edi, row - mov ebx, diff - mov esi, edi // lp = row - add edi, bpp // rp = row + bpp - mov ecx, MMXLength - movq mm7, [edi+ebx-8] // PRIME the pump (load the first - // Raw(x-bpp) data set - and ecx, 0x0000003f // calc bytes over mult of 64 -dsub8lp: - movq mm0, [edi+ebx] // Load Sub(x) for 1st 8 bytes - paddb mm0, mm7 - movq mm1, [edi+ebx+8] // Load Sub(x) for 2nd 8 bytes - movq [edi+ebx], mm0 // Write Raw(x) for 1st 8 bytes - // Now mm0 will be used as Raw(x-bpp) for - // the 2nd group of 8 bytes. This will be - // repeated for each group of 8 bytes with - // the 8th group being used as the Raw(x-bpp) - // for the 1st group of the next loop. - paddb mm1, mm0 - movq mm2, [edi+ebx+16] // Load Sub(x) for 3rd 8 bytes - movq [edi+ebx+8], mm1 // Write Raw(x) for 2nd 8 bytes - paddb mm2, mm1 - movq mm3, [edi+ebx+24] // Load Sub(x) for 4th 8 bytes - movq [edi+ebx+16], mm2 // Write Raw(x) for 3rd 8 bytes - paddb mm3, mm2 - movq mm4, [edi+ebx+32] // Load Sub(x) for 5th 8 bytes - movq [edi+ebx+24], mm3 // Write Raw(x) for 4th 8 bytes - paddb mm4, mm3 - movq mm5, [edi+ebx+40] // Load Sub(x) for 6th 8 bytes - movq [edi+ebx+32], mm4 // Write Raw(x) for 5th 8 bytes - paddb mm5, mm4 - movq mm6, [edi+ebx+48] // Load Sub(x) for 7th 8 bytes - movq [edi+ebx+40], mm5 // Write Raw(x) for 6th 8 bytes - paddb mm6, mm5 - movq mm7, [edi+ebx+56] // Load Sub(x) for 8th 8 bytes - movq [edi+ebx+48], mm6 // Write Raw(x) for 7th 8 bytes - add ebx, 64 - paddb mm7, mm6 - cmp ebx, ecx - movq [edi+ebx-8], mm7 // Write Raw(x) for 8th 8 bytes - jb dsub8lp - cmp ebx, MMXLength - jnb dsub8lt8 -dsub8lpA: - movq mm0, [edi+ebx] - add ebx, 8 - paddb mm0, mm7 - cmp ebx, MMXLength - movq [edi+ebx-8], mm0 // use -8 to offset early add to ebx - movq mm7, mm0 // Move calculated Raw(x) data to mm1 to - // be the new Raw(x-bpp) for the next loop - jb dsub8lpA -dsub8lt8: - } // end _asm block - } - break; - - default: // bpp greater than 8 bytes - { - _asm { - mov ebx, diff - mov edi, row - mov esi, edi // lp = row - add edi, bpp // rp = row + bpp -dsubAlp: - movq mm0, [edi+ebx] - movq mm1, [esi+ebx] - add ebx, 8 - paddb mm0, mm1 - cmp ebx, MMXLength - movq [edi+ebx-8], mm0 // mov does not affect flags; -8 to offset - // add ebx - jb dsubAlp - } // end _asm block - } - break; - - } // end switch ( bpp ) - - _asm { - mov ebx, MMXLength - mov edi, row - cmp ebx, FullLength - jnb dsubend - mov esi, edi // lp = row - xor eax, eax - add edi, bpp // rp = row + bpp -dsublp2: - mov al, [esi+ebx] - add [edi+ebx], al - inc ebx - cmp ebx, FullLength - jb dsublp2 -dsubend: - emms // End MMX instructions; prep for possible FP instrs. - } // end _asm block -} - -// Optimized code for PNG Up filter decoder -void /* PRIVATE */ -png_read_filter_row_mmx_up(png_row_infop row_info, png_bytep row, - png_bytep prev_row) -{ - png_uint_32 len; - len = row_info->rowbytes; // # of bytes to filter - _asm { - mov edi, row - // get # of bytes to alignment - mov ecx, edi - xor ebx, ebx - add ecx, 0x7 - xor eax, eax - and ecx, 0xfffffff8 - mov esi, prev_row - sub ecx, edi - jz dupgo - // fix alignment -duplp1: - mov al, [edi+ebx] - add al, [esi+ebx] - inc ebx - cmp ebx, ecx - mov [edi + ebx-1], al // mov does not affect flags; -1 to offset inc ebx - jb duplp1 -dupgo: - mov ecx, len - mov edx, ecx - sub edx, ebx // subtract alignment fix - and edx, 0x0000003f // calc bytes over mult of 64 - sub ecx, edx // drop over bytes from length - // Unrolled loop - use all MMX registers and interleave to reduce - // number of branch instructions (loops) and reduce partial stalls -duploop: - movq mm1, [esi+ebx] - movq mm0, [edi+ebx] - movq mm3, [esi+ebx+8] - paddb mm0, mm1 - movq mm2, [edi+ebx+8] - movq [edi+ebx], mm0 - paddb mm2, mm3 - movq mm5, [esi+ebx+16] - movq [edi+ebx+8], mm2 - movq mm4, [edi+ebx+16] - movq mm7, [esi+ebx+24] - paddb mm4, mm5 - movq mm6, [edi+ebx+24] - movq [edi+ebx+16], mm4 - paddb mm6, mm7 - movq mm1, [esi+ebx+32] - movq [edi+ebx+24], mm6 - movq mm0, [edi+ebx+32] - movq mm3, [esi+ebx+40] - paddb mm0, mm1 - movq mm2, [edi+ebx+40] - movq [edi+ebx+32], mm0 - paddb mm2, mm3 - movq mm5, [esi+ebx+48] - movq [edi+ebx+40], mm2 - movq mm4, [edi+ebx+48] - movq mm7, [esi+ebx+56] - paddb mm4, mm5 - movq mm6, [edi+ebx+56] - movq [edi+ebx+48], mm4 - add ebx, 64 - paddb mm6, mm7 - cmp ebx, ecx - movq [edi+ebx-8], mm6 // (+56)movq does not affect flags; - // -8 to offset add ebx - jb duploop - - cmp edx, 0 // Test for bytes over mult of 64 - jz dupend - - - // 2 lines added by lcreeve at netins.net - // (mail 11 Jul 98 in png-implement list) - cmp edx, 8 //test for less than 8 bytes - jb duplt8 - - - add ecx, edx - and edx, 0x00000007 // calc bytes over mult of 8 - sub ecx, edx // drop over bytes from length - jz duplt8 - // Loop using MMX registers mm0 & mm1 to update 8 bytes simultaneously -duplpA: - movq mm1, [esi+ebx] - movq mm0, [edi+ebx] - add ebx, 8 - paddb mm0, mm1 - cmp ebx, ecx - movq [edi+ebx-8], mm0 // movq does not affect flags; -8 to offset add ebx - jb duplpA - cmp edx, 0 // Test for bytes over mult of 8 - jz dupend -duplt8: - xor eax, eax - add ecx, edx // move over byte count into counter - // Loop using x86 registers to update remaining bytes -duplp2: - mov al, [edi + ebx] - add al, [esi + ebx] - inc ebx - cmp ebx, ecx - mov [edi + ebx-1], al // mov does not affect flags; -1 to offset inc ebx - jb duplp2 -dupend: - // Conversion of filtered row completed - emms // End MMX instructions; prep for possible FP instrs. - } // end _asm block -} - - -// Optimized png_read_filter_row routines -void /* PRIVATE */ -png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep - row, png_bytep prev_row, int filter) -{ -#ifdef PNG_DEBUG - char filnm[10]; -#endif - - if (mmx_supported == 2) { -#if !defined(PNG_1_0_X) - /* this should have happened in png_init_mmx_flags() already */ - png_warning(png_ptr, "asm_flags may not have been initialized"); -#endif - png_mmx_support(); - } - -#ifdef PNG_DEBUG - png_debug(1, "in png_read_filter_row\n"); - switch (filter) - { - case 0: sprintf(filnm, "none"); - break; -#if !defined(PNG_1_0_X) - case 1: sprintf(filnm, "sub-%s", - (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB)? "MMX" : "x86"); - break; - case 2: sprintf(filnm, "up-%s", - (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP)? "MMX" : "x86"); - break; - case 3: sprintf(filnm, "avg-%s", - (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG)? "MMX" : "x86"); - break; - case 4: sprintf(filnm, "Paeth-%s", - (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH)? "MMX":"x86"); - break; -#else - case 1: sprintf(filnm, "sub"); - break; - case 2: sprintf(filnm, "up"); - break; - case 3: sprintf(filnm, "avg"); - break; - case 4: sprintf(filnm, "Paeth"); - break; -#endif - default: sprintf(filnm, "unknw"); - break; - } - png_debug2(0,"row=%5d, %s, ", png_ptr->row_number, filnm); - png_debug2(0, "pd=%2d, b=%d, ", (int)row_info->pixel_depth, - (int)((row_info->pixel_depth + 7) >> 3)); - png_debug1(0,"len=%8d, ", row_info->rowbytes); -#endif /* PNG_DEBUG */ - - switch (filter) - { - case PNG_FILTER_VALUE_NONE: - break; - - case PNG_FILTER_VALUE_SUB: - { -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB) && - (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && - (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) -#else - if (mmx_supported) -#endif - { - png_read_filter_row_mmx_sub(row_info, row); - } - else - { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_bytep rp = row + bpp; - png_bytep lp = row; - - for (i = bpp; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); - rp++; - } - } - break; - } - - case PNG_FILTER_VALUE_UP: - { -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP) && - (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && - (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) -#else - if (mmx_supported) -#endif - { - png_read_filter_row_mmx_up(row_info, row, prev_row); - } - else - { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_bytep rp = row; - png_bytep pp = prev_row; - - for (i = 0; i < istop; ++i) - { - *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); - rp++; - } - } - break; - } - - case PNG_FILTER_VALUE_AVG: - { -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG) && - (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && - (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) -#else - if (mmx_supported) -#endif - { - png_read_filter_row_mmx_avg(row_info, row, prev_row); - } - else - { - png_uint_32 i; - png_bytep rp = row; - png_bytep pp = prev_row; - png_bytep lp = row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 istop = row_info->rowbytes - bpp; - - for (i = 0; i < bpp; i++) - { - *rp = (png_byte)(((int)(*rp) + - ((int)(*pp++) >> 1)) & 0xff); - rp++; - } - - for (i = 0; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + - ((int)(*pp++ + *lp++) >> 1)) & 0xff); - rp++; - } - } - break; - } - - case PNG_FILTER_VALUE_PAETH: - { -#if !defined(PNG_1_0_X) - if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH) && - (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && - (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) -#else - if (mmx_supported) -#endif - { - png_read_filter_row_mmx_paeth(row_info, row, prev_row); - } - else - { - png_uint_32 i; - png_bytep rp = row; - png_bytep pp = prev_row; - png_bytep lp = row; - png_bytep cp = prev_row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 istop=row_info->rowbytes - bpp; - - for (i = 0; i < bpp; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); - rp++; - } - - for (i = 0; i < istop; i++) // use leftover rp,pp - { - int a, b, c, pa, pb, pc, p; - - a = *lp++; - b = *pp++; - c = *cp++; - - p = b - c; - pc = a - c; - -#ifdef PNG_USE_ABS - pa = abs(p); - pb = abs(pc); - pc = abs(p + pc); -#else - pa = p < 0 ? -p : p; - pb = pc < 0 ? -pc : pc; - pc = (p + pc) < 0 ? -(p + pc) : p + pc; -#endif - - /* - if (pa <= pb && pa <= pc) - p = a; - else if (pb <= pc) - p = b; - else - p = c; - */ - - p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; - - *rp = (png_byte)(((int)(*rp) + p) & 0xff); - rp++; - } - } - break; - } - - default: - png_warning(png_ptr, "Ignoring bad row filter type"); - *row=0; - break; - } -} - -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED && PNG_USE_PNGVCRD */ diff --git a/src/SFML/Graphics/libpng/pngwio.c b/src/SFML/Graphics/libpng/pngwio.c deleted file mode 100644 index dded699a..00000000 --- a/src/SFML/Graphics/libpng/pngwio.c +++ /dev/null @@ -1,228 +0,0 @@ - -/* pngwio.c - functions for data output - * - * libpng 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This file provides a location for all output. Users who need - * special handling are expected to write functions that have the same - * arguments as these and perform similar functions, but that possibly - * use different output methods. Note that you shouldn't change these - * functions, but rather write replacement functions and then change - * them at run time with png_set_write_fn(...). - */ - -#define PNG_INTERNAL -#include "png.h" -#ifdef PNG_WRITE_SUPPORTED - -/* Write the data to whatever output you are using. The default routine - writes to a file pointer. Note that this routine sometimes gets called - with very small lengths, so you should implement some kind of simple - buffering if you are using unbuffered writes. This should never be asked - to write more than 64K on a 16 bit machine. */ - -void /* PRIVATE */ -png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - if (png_ptr->write_data_fn != NULL ) - (*(png_ptr->write_data_fn))(png_ptr, data, length); - else - png_error(png_ptr, "Call to NULL write function"); -} - -#if !defined(PNG_NO_STDIO) -/* This is the function that does the actual writing of data. If you are - not writing to a standard C stream, you should create a replacement - write_data function and use it at run time with png_set_write_fn(), rather - than changing the library. */ -#ifndef USE_FAR_KEYWORD -void PNGAPI -png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_uint_32 check; - -#if defined(_WIN32_WCE) - if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) - check = 0; -#else - check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); -#endif - if (check != length) - png_error(png_ptr, "Write Error"); -} -#else -/* this is the model-independent version. Since the standard I/O library - can't handle far buffers in the medium and small models, we have to copy - the data. -*/ - -#define NEAR_BUF_SIZE 1024 -#define MIN(a,b) (a <= b ? a : b) - -void PNGAPI -png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_uint_32 check; - png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */ - png_FILE_p io_ptr; - - /* Check if data really is near. If so, use usual code. */ - near_data = (png_byte *)CVT_PTR_NOCHECK(data); - io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); - if ((png_bytep)near_data == data) - { -#if defined(_WIN32_WCE) - if ( !WriteFile(io_ptr, near_data, length, &check, NULL) ) - check = 0; -#else - check = fwrite(near_data, 1, length, io_ptr); -#endif - } - else - { - png_byte buf[NEAR_BUF_SIZE]; - png_size_t written, remaining, err; - check = 0; - remaining = length; - do - { - written = MIN(NEAR_BUF_SIZE, remaining); - png_memcpy(buf, data, written); /* copy far buffer to near buffer */ -#if defined(_WIN32_WCE) - if ( !WriteFile(io_ptr, buf, written, &err, NULL) ) - err = 0; -#else - err = fwrite(buf, 1, written, io_ptr); -#endif - if (err != written) - break; - else - check += err; - data += written; - remaining -= written; - } - while (remaining != 0); - } - if (check != length) - png_error(png_ptr, "Write Error"); -} - -#endif -#endif - -/* This function is called to output any data pending writing (normally - to disk). After png_flush is called, there should be no data pending - writing in any buffers. */ -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -void /* PRIVATE */ -png_flush(png_structp png_ptr) -{ - if (png_ptr->output_flush_fn != NULL) - (*(png_ptr->output_flush_fn))(png_ptr); -} - -#if !defined(PNG_NO_STDIO) -void PNGAPI -png_default_flush(png_structp png_ptr) -{ -#if !defined(_WIN32_WCE) - png_FILE_p io_ptr; - io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr)); - if (io_ptr != NULL) - fflush(io_ptr); -#endif -} -#endif -#endif - -/* This function allows the application to supply new output functions for - libpng if standard C streams aren't being used. - - This function takes as its arguments: - png_ptr - pointer to a png output data structure - io_ptr - pointer to user supplied structure containing info about - the output functions. May be NULL. - write_data_fn - pointer to a new output function that takes as its - arguments a pointer to a png_struct, a pointer to - data to be written, and a 32-bit unsigned int that is - the number of bytes to be written. The new write - function should call png_error(png_ptr, "Error msg") - to exit and output any fatal error messages. - flush_data_fn - pointer to a new flush function that takes as its - arguments a pointer to a png_struct. After a call to - the flush function, there should be no data in any buffers - or pending transmission. If the output method doesn't do - any buffering of ouput, a function prototype must still be - supplied although it doesn't have to do anything. If - PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile - time, output_flush_fn will be ignored, although it must be - supplied for compatibility. */ -void PNGAPI -png_set_write_fn(png_structp png_ptr, png_voidp io_ptr, - png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) -{ - png_ptr->io_ptr = io_ptr; - -#if !defined(PNG_NO_STDIO) - if (write_data_fn != NULL) - png_ptr->write_data_fn = write_data_fn; - else - png_ptr->write_data_fn = png_default_write_data; -#else - png_ptr->write_data_fn = write_data_fn; -#endif - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -#if !defined(PNG_NO_STDIO) - if (output_flush_fn != NULL) - png_ptr->output_flush_fn = output_flush_fn; - else - png_ptr->output_flush_fn = png_default_flush; -#else - png_ptr->output_flush_fn = output_flush_fn; -#endif -#endif /* PNG_WRITE_FLUSH_SUPPORTED */ - - /* It is an error to read while writing a png file */ - if (png_ptr->read_data_fn != NULL) - { - png_ptr->read_data_fn = NULL; - png_warning(png_ptr, - "Attempted to set both read_data_fn and write_data_fn in"); - png_warning(png_ptr, - "the same structure. Resetting read_data_fn to NULL."); - } -} - -#if defined(USE_FAR_KEYWORD) -#if defined(_MSC_VER) -void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) -{ - void *near_ptr; - void FAR *far_ptr; - FP_OFF(near_ptr) = FP_OFF(ptr); - far_ptr = (void FAR *)near_ptr; - if(check != 0) - if(FP_SEG(ptr) != FP_SEG(far_ptr)) - png_error(png_ptr,"segment lost in conversion"); - return(near_ptr); -} -# else -void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) -{ - void *near_ptr; - void FAR *far_ptr; - near_ptr = (void FAR *)ptr; - far_ptr = (void FAR *)near_ptr; - if(check != 0) - if(far_ptr != ptr) - png_error(png_ptr,"segment lost in conversion"); - return(near_ptr); -} -# endif -# endif -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/SFML/Graphics/libpng/pngwrite.c b/src/SFML/Graphics/libpng/pngwrite.c deleted file mode 100644 index d9d27d61..00000000 --- a/src/SFML/Graphics/libpng/pngwrite.c +++ /dev/null @@ -1,1464 +0,0 @@ - -/* pngwrite.c - general routines to write a PNG file - * - * libpng 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - */ - -/* get internal access to png.h */ -#define PNG_INTERNAL -#include "png.h" -#ifdef PNG_WRITE_SUPPORTED - -/* Writes all the PNG information. This is the suggested way to use the - * library. If you have a new chunk to add, make a function to write it, - * and put it in the correct location here. If you want the chunk written - * after the image data, put it in png_write_end(). I strongly encourage - * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing - * the chunk, as that will keep the code from breaking if you want to just - * write a plain PNG file. If you have long comments, I suggest writing - * them in png_write_end(), and compressing them. - */ -void PNGAPI -png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_write_info_before_PLTE\n"); - if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) - { - png_write_sig(png_ptr); /* write PNG signature */ -#if defined(PNG_MNG_FEATURES_SUPPORTED) - if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted)) - { - png_warning(png_ptr,"MNG features are not allowed in a PNG datastream\n"); - png_ptr->mng_features_permitted=0; - } -#endif - /* write IHDR information. */ - png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, - info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, - info_ptr->filter_type, -#if defined(PNG_WRITE_INTERLACING_SUPPORTED) - info_ptr->interlace_type); -#else - 0); -#endif - /* the rest of these check to see if the valid field has the appropriate - flag set, and if it does, writes the chunk. */ -#if defined(PNG_WRITE_gAMA_SUPPORTED) - if (info_ptr->valid & PNG_INFO_gAMA) - { -# ifdef PNG_FLOATING_POINT_SUPPORTED - png_write_gAMA(png_ptr, info_ptr->gamma); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); -# endif -#endif - } -#endif -#if defined(PNG_WRITE_sRGB_SUPPORTED) - if (info_ptr->valid & PNG_INFO_sRGB) - png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); -#endif -#if defined(PNG_WRITE_iCCP_SUPPORTED) - if (info_ptr->valid & PNG_INFO_iCCP) - png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, - info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); -#endif -#if defined(PNG_WRITE_sBIT_SUPPORTED) - if (info_ptr->valid & PNG_INFO_sBIT) - png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); -#endif -#if defined(PNG_WRITE_cHRM_SUPPORTED) - if (info_ptr->valid & PNG_INFO_cHRM) - { -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_write_cHRM(png_ptr, - info_ptr->x_white, info_ptr->y_white, - info_ptr->x_red, info_ptr->y_red, - info_ptr->x_green, info_ptr->y_green, - info_ptr->x_blue, info_ptr->y_blue); -#else -# ifdef PNG_FIXED_POINT_SUPPORTED - png_write_cHRM_fixed(png_ptr, - info_ptr->int_x_white, info_ptr->int_y_white, - info_ptr->int_x_red, info_ptr->int_y_red, - info_ptr->int_x_green, info_ptr->int_y_green, - info_ptr->int_x_blue, info_ptr->int_y_blue); -# endif -#endif - } -#endif -#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) - if (info_ptr->unknown_chunks_num) - { - png_unknown_chunk *up; - - png_debug(5, "writing extra chunks\n"); - - for (up = info_ptr->unknown_chunks; - up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; - up++) - { - int keep=png_handle_as_unknown(png_ptr, up->name); - if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && !(up->location & PNG_HAVE_PLTE) && - !(up->location & PNG_HAVE_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) - { - png_write_chunk(png_ptr, up->name, up->data, up->size); - } - } - } -#endif - png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; - } -} - -void PNGAPI -png_write_info(png_structp png_ptr, png_infop info_ptr) -{ -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) - int i; -#endif - - png_debug(1, "in png_write_info\n"); - - png_write_info_before_PLTE(png_ptr, info_ptr); - - if (info_ptr->valid & PNG_INFO_PLTE) - png_write_PLTE(png_ptr, info_ptr->palette, - (png_uint_32)info_ptr->num_palette); - else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - png_error(png_ptr, "Valid palette required for paletted images\n"); - -#if defined(PNG_WRITE_tRNS_SUPPORTED) - if (info_ptr->valid & PNG_INFO_tRNS) - { -#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) - /* invert the alpha channel (in tRNS) */ - if ((png_ptr->transformations & PNG_INVERT_ALPHA) && - info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - int j; - for (j=0; j<(int)info_ptr->num_trans; j++) - info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); - } -#endif - png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), - info_ptr->num_trans, info_ptr->color_type); - } -#endif -#if defined(PNG_WRITE_bKGD_SUPPORTED) - if (info_ptr->valid & PNG_INFO_bKGD) - png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); -#endif -#if defined(PNG_WRITE_hIST_SUPPORTED) - if (info_ptr->valid & PNG_INFO_hIST) - png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); -#endif -#if defined(PNG_WRITE_oFFs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_oFFs) - png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, - info_ptr->offset_unit_type); -#endif -#if defined(PNG_WRITE_pCAL_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pCAL) - png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, - info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, - info_ptr->pcal_units, info_ptr->pcal_params); -#endif -#if defined(PNG_WRITE_sCAL_SUPPORTED) - if (info_ptr->valid & PNG_INFO_sCAL) -#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) - png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, - info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, - info_ptr->scal_s_width, info_ptr->scal_s_height); -#else - png_warning(png_ptr, - "png_write_sCAL not supported; sCAL chunk not written.\n"); -#endif -#endif -#endif -#if defined(PNG_WRITE_pHYs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pHYs) - png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, - info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); -#endif -#if defined(PNG_WRITE_tIME_SUPPORTED) - if (info_ptr->valid & PNG_INFO_tIME) - { - png_write_tIME(png_ptr, &(info_ptr->mod_time)); - png_ptr->mode |= PNG_WROTE_tIME; - } -#endif -#if defined(PNG_WRITE_sPLT_SUPPORTED) - if (info_ptr->valid & PNG_INFO_sPLT) - for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) - png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); -#endif -#if defined(PNG_WRITE_TEXT_SUPPORTED) - /* Check to see if we need to write text chunks */ - for (i = 0; i < info_ptr->num_text; i++) - { - png_debug2(2, "Writing header text chunk %d, type %d\n", i, - info_ptr->text[i].compression); - /* an internationalized chunk? */ - if (info_ptr->text[i].compression > 0) - { -#if defined(PNG_WRITE_iTXt_SUPPORTED) - /* write international chunk */ - png_write_iTXt(png_ptr, - info_ptr->text[i].compression, - info_ptr->text[i].key, - info_ptr->text[i].lang, - info_ptr->text[i].lang_key, - info_ptr->text[i].text); -#else - png_warning(png_ptr, "Unable to write international text\n"); -#endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; - } - /* If we want a compressed text chunk */ - else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) - { -#if defined(PNG_WRITE_zTXt_SUPPORTED) - /* write compressed chunk */ - png_write_zTXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0, - info_ptr->text[i].compression); -#else - png_warning(png_ptr, "Unable to write compressed text\n"); -#endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; - } - else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) - { -#if defined(PNG_WRITE_tEXt_SUPPORTED) - /* write uncompressed chunk */ - png_write_tEXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, - 0); -#else - png_warning(png_ptr, "Unable to write uncompressed text\n"); -#endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; - } - } -#endif -#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) - if (info_ptr->unknown_chunks_num) - { - png_unknown_chunk *up; - - png_debug(5, "writing extra chunks\n"); - - for (up = info_ptr->unknown_chunks; - up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; - up++) - { - int keep=png_handle_as_unknown(png_ptr, up->name); - if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && (up->location & PNG_HAVE_PLTE) && - !(up->location & PNG_HAVE_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) - { - png_write_chunk(png_ptr, up->name, up->data, up->size); - } - } - } -#endif -} - -/* Writes the end of the PNG file. If you don't want to write comments or - * time information, you can pass NULL for info. If you already wrote these - * in png_write_info(), do not write them again here. If you have long - * comments, I suggest writing them here, and compressing them. - */ -void PNGAPI -png_write_end(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_write_end\n"); - if (!(png_ptr->mode & PNG_HAVE_IDAT)) - png_error(png_ptr, "No IDATs written into file"); - - /* see if user wants us to write information chunks */ - if (info_ptr != NULL) - { -#if defined(PNG_WRITE_TEXT_SUPPORTED) - int i; /* local index variable */ -#endif -#if defined(PNG_WRITE_tIME_SUPPORTED) - /* check to see if user has supplied a time chunk */ - if ((info_ptr->valid & PNG_INFO_tIME) && - !(png_ptr->mode & PNG_WROTE_tIME)) - png_write_tIME(png_ptr, &(info_ptr->mod_time)); -#endif -#if defined(PNG_WRITE_TEXT_SUPPORTED) - /* loop through comment chunks */ - for (i = 0; i < info_ptr->num_text; i++) - { - png_debug2(2, "Writing trailer text chunk %d, type %d\n", i, - info_ptr->text[i].compression); - /* an internationalized chunk? */ - if (info_ptr->text[i].compression > 0) - { -#if defined(PNG_WRITE_iTXt_SUPPORTED) - /* write international chunk */ - png_write_iTXt(png_ptr, - info_ptr->text[i].compression, - info_ptr->text[i].key, - info_ptr->text[i].lang, - info_ptr->text[i].lang_key, - info_ptr->text[i].text); -#else - png_warning(png_ptr, "Unable to write international text\n"); -#endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; - } - else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) - { -#if defined(PNG_WRITE_zTXt_SUPPORTED) - /* write compressed chunk */ - png_write_zTXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0, - info_ptr->text[i].compression); -#else - png_warning(png_ptr, "Unable to write compressed text\n"); -#endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; - } - else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) - { -#if defined(PNG_WRITE_tEXt_SUPPORTED) - /* write uncompressed chunk */ - png_write_tEXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0); -#else - png_warning(png_ptr, "Unable to write uncompressed text\n"); -#endif - - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; - } - } -#endif -#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) - if (info_ptr->unknown_chunks_num) - { - png_unknown_chunk *up; - - png_debug(5, "writing extra chunks\n"); - - for (up = info_ptr->unknown_chunks; - up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; - up++) - { - int keep=png_handle_as_unknown(png_ptr, up->name); - if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && (up->location & PNG_AFTER_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) - { - png_write_chunk(png_ptr, up->name, up->data, up->size); - } - } - } -#endif - } - - png_ptr->mode |= PNG_AFTER_IDAT; - - /* write end of PNG file */ - png_write_IEND(png_ptr); -#if 0 -/* This flush, added in libpng-1.0.8, causes some applications to crash - because they do not set png_ptr->output_flush_fn */ - png_flush(png_ptr); -#endif -} - -#if defined(PNG_WRITE_tIME_SUPPORTED) -#if !defined(_WIN32_WCE) -/* "time.h" functions are not supported on WindowsCE */ -void PNGAPI -png_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime) -{ - png_debug(1, "in png_convert_from_struct_tm\n"); - ptime->year = (png_uint_16)(1900 + ttime->tm_year); - ptime->month = (png_byte)(ttime->tm_mon + 1); - ptime->day = (png_byte)ttime->tm_mday; - ptime->hour = (png_byte)ttime->tm_hour; - ptime->minute = (png_byte)ttime->tm_min; - ptime->second = (png_byte)ttime->tm_sec; -} - -void PNGAPI -png_convert_from_time_t(png_timep ptime, time_t ttime) -{ - struct tm *tbuf; - - png_debug(1, "in png_convert_from_time_t\n"); - tbuf = gmtime(&ttime); - png_convert_from_struct_tm(ptime, tbuf); -} -#endif -#endif - -/* Initialize png_ptr structure, and allocate any memory needed */ -png_structp PNGAPI -png_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn) -{ -#ifdef PNG_USER_MEM_SUPPORTED - return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn, - warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); -} - -/* Alternate initialize png_ptr structure, and allocate any memory needed */ -png_structp PNGAPI -png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - png_structp png_ptr; -#ifdef PNG_SETJMP_SUPPORTED -#ifdef USE_FAR_KEYWORD - jmp_buf jmpbuf; -#endif -#endif - int i; - png_debug(1, "in png_create_write_struct\n"); -#ifdef PNG_USER_MEM_SUPPORTED - png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, - (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); -#else - png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); -#endif /* PNG_USER_MEM_SUPPORTED */ - if (png_ptr == NULL) - return (NULL); - -#if !defined(PNG_1_0_X) -#ifdef PNG_ASSEMBLER_CODE_SUPPORTED - png_init_mmx_flags(png_ptr); /* 1.2.0 addition */ -#endif -#endif /* PNG_1_0_X */ - - /* added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - png_ptr->user_width_max=PNG_USER_WIDTH_MAX; - png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; -#endif - -#ifdef PNG_SETJMP_SUPPORTED -#ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) -#else - if (setjmp(png_ptr->jmpbuf)) -#endif - { - png_free(png_ptr, png_ptr->zbuf); - png_ptr->zbuf=NULL; - png_destroy_struct(png_ptr); - return (NULL); - } -#ifdef USE_FAR_KEYWORD - png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); -#endif -#endif - -#ifdef PNG_USER_MEM_SUPPORTED - png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); -#endif /* PNG_USER_MEM_SUPPORTED */ - png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); - - i=0; - do - { - if(user_png_ver[i] != png_libpng_ver[i]) - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - } while (png_libpng_ver[i++]); - - if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) - { - /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so - * we must recompile any applications that use any older library version. - * For versions after libpng 1.0, we will be compatible, so we need - * only check the first digit. - */ - if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || - (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || - (user_png_ver[0] == '0' && user_png_ver[2] < '9')) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[80]; - if (user_png_ver) - { - sprintf(msg, "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); - } - sprintf(msg, "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); -#endif -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "Incompatible libpng version in application and library"); - } - } - - /* initialize zbuf - compression buffer */ - png_ptr->zbuf_size = PNG_ZBUF_SIZE; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - - png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, - png_flush_ptr_NULL); - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, - 1, png_doublep_NULL, png_doublep_NULL); -#endif - -#ifdef PNG_SETJMP_SUPPORTED -/* Applications that neglect to set up their own setjmp() and then encounter - a png_error() will longjmp here. Since the jmpbuf is then meaningless we - abort instead of returning. */ -#ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) - PNG_ABORT(); - png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); -#else - if (setjmp(png_ptr->jmpbuf)) - PNG_ABORT(); -#endif -#endif - return (png_ptr); -} - -/* Initialize png_ptr structure, and allocate any memory needed */ -#undef png_write_init -void PNGAPI -png_write_init(png_structp png_ptr) -{ - /* We only come here via pre-1.0.7-compiled applications */ - png_write_init_2(png_ptr, "1.0.6 or earlier", 0, 0); -} - -void PNGAPI -png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver, - png_size_t png_struct_size, png_size_t png_info_size) -{ - /* We only come here via pre-1.0.12-compiled applications */ -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - if(png_sizeof(png_struct) > png_struct_size || - png_sizeof(png_info) > png_info_size) - { - char msg[80]; - png_ptr->warning_fn=NULL; - if (user_png_ver) - { - sprintf(msg, "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); - } - sprintf(msg, "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); - } -#endif - if(png_sizeof(png_struct) > png_struct_size) - { - png_ptr->error_fn=NULL; -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "The png struct allocated by the application for writing is too small."); - } - if(png_sizeof(png_info) > png_info_size) - { - png_ptr->error_fn=NULL; -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "The info struct allocated by the application for writing is too small."); - } - png_write_init_3(&png_ptr, user_png_ver, png_struct_size); -} - - -void PNGAPI -png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, - png_size_t png_struct_size) -{ - png_structp png_ptr=*ptr_ptr; -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf tmp_jmp; /* to save current jump buffer */ -#endif - int i = 0; - do - { - if (user_png_ver[i] != png_libpng_ver[i]) - { -#ifdef PNG_LEGACY_SUPPORTED - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; -#else - png_ptr->warning_fn=NULL; - png_warning(png_ptr, - "Application uses deprecated png_write_init() and should be recompiled."); - break; -#endif - } - } while (png_libpng_ver[i++]); - - png_debug(1, "in png_write_init_3\n"); - -#ifdef PNG_SETJMP_SUPPORTED - /* save jump buffer and error functions */ - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); -#endif - - if (png_sizeof(png_struct) > png_struct_size) - { - png_destroy_struct(png_ptr); - png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); - *ptr_ptr = png_ptr; - } - - /* reset all variables to 0 */ - png_memset(png_ptr, 0, png_sizeof (png_struct)); - - /* added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - png_ptr->user_width_max=PNG_USER_WIDTH_MAX; - png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; -#endif - -#if !defined(PNG_1_0_X) -#ifdef PNG_ASSEMBLER_CODE_SUPPORTED - png_init_mmx_flags(png_ptr); /* 1.2.0 addition */ -#endif -#endif /* PNG_1_0_X */ - -#ifdef PNG_SETJMP_SUPPORTED - /* restore jump buffer */ - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); -#endif - - png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, - png_flush_ptr_NULL); - - /* initialize zbuf - compression buffer */ - png_ptr->zbuf_size = PNG_ZBUF_SIZE; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, - 1, png_doublep_NULL, png_doublep_NULL); -#endif -} - -/* Write a few rows of image data. If the image is interlaced, - * either you will have to write the 7 sub images, or, if you - * have called png_set_interlace_handling(), you will have to - * "write" the image seven times. - */ -void PNGAPI -png_write_rows(png_structp png_ptr, png_bytepp row, - png_uint_32 num_rows) -{ - png_uint_32 i; /* row counter */ - png_bytepp rp; /* row pointer */ - - png_debug(1, "in png_write_rows\n"); - /* loop through the rows */ - for (i = 0, rp = row; i < num_rows; i++, rp++) - { - png_write_row(png_ptr, *rp); - } -} - -/* Write the image. You only need to call this function once, even - * if you are writing an interlaced image. - */ -void PNGAPI -png_write_image(png_structp png_ptr, png_bytepp image) -{ - png_uint_32 i; /* row index */ - int pass, num_pass; /* pass variables */ - png_bytepp rp; /* points to current row */ - - png_debug(1, "in png_write_image\n"); -#if defined(PNG_WRITE_INTERLACING_SUPPORTED) - /* intialize interlace handling. If image is not interlaced, - this will set pass to 1 */ - num_pass = png_set_interlace_handling(png_ptr); -#else - num_pass = 1; -#endif - /* loop through passes */ - for (pass = 0; pass < num_pass; pass++) - { - /* loop through image */ - for (i = 0, rp = image; i < png_ptr->height; i++, rp++) - { - png_write_row(png_ptr, *rp); - } - } -} - -/* called by user to write a row of image data */ -void PNGAPI -png_write_row(png_structp png_ptr, png_bytep row) -{ - png_debug2(1, "in png_write_row (row %ld, pass %d)\n", - png_ptr->row_number, png_ptr->pass); - /* initialize transformations and other stuff if first time */ - if (png_ptr->row_number == 0 && png_ptr->pass == 0) - { - /* make sure we wrote the header info */ - if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) - png_error(png_ptr, - "png_write_info was never called before png_write_row."); - - /* check for transforms that have been set but were defined out */ -#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) - png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined."); -#endif -#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) - png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined."); -#endif -#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); -#endif -#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) - png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); -#endif -#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) - png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); -#endif -#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) - png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); -#endif -#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); -#endif - - png_write_start_row(png_ptr); - } - -#if defined(PNG_WRITE_INTERLACING_SUPPORTED) - /* if interlaced and not interested in row, return */ - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) - { - switch (png_ptr->pass) - { - case 0: - if (png_ptr->row_number & 0x07) - { - png_write_finish_row(png_ptr); - return; - } - break; - case 1: - if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) - { - png_write_finish_row(png_ptr); - return; - } - break; - case 2: - if ((png_ptr->row_number & 0x07) != 4) - { - png_write_finish_row(png_ptr); - return; - } - break; - case 3: - if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) - { - png_write_finish_row(png_ptr); - return; - } - break; - case 4: - if ((png_ptr->row_number & 0x03) != 2) - { - png_write_finish_row(png_ptr); - return; - } - break; - case 5: - if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) - { - png_write_finish_row(png_ptr); - return; - } - break; - case 6: - if (!(png_ptr->row_number & 0x01)) - { - png_write_finish_row(png_ptr); - return; - } - break; - } - } -#endif - - /* set up row info for transformations */ - png_ptr->row_info.color_type = png_ptr->color_type; - png_ptr->row_info.width = png_ptr->usr_width; - png_ptr->row_info.channels = png_ptr->usr_channels; - png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; - png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * - png_ptr->row_info.channels); - - png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->row_info.width); - - png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type); - png_debug1(3, "row_info->width = %lu\n", png_ptr->row_info.width); - png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels); - png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth); - png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth); - png_debug1(3, "row_info->rowbytes = %lu\n", png_ptr->row_info.rowbytes); - - /* Copy user's row into buffer, leaving room for filter byte. */ - png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, - png_ptr->row_info.rowbytes); - -#if defined(PNG_WRITE_INTERLACING_SUPPORTED) - /* handle interlacing */ - if (png_ptr->interlaced && png_ptr->pass < 6 && - (png_ptr->transformations & PNG_INTERLACE)) - { - png_do_write_interlace(&(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->pass); - /* this should always get caught above, but still ... */ - if (!(png_ptr->row_info.width)) - { - png_write_finish_row(png_ptr); - return; - } - } -#endif - - /* handle other transformations */ - if (png_ptr->transformations) - png_do_write_transformations(png_ptr); - -#if defined(PNG_MNG_FEATURES_SUPPORTED) - /* Write filter_method 64 (intrapixel differencing) only if - * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and - * 2. Libpng did not write a PNG signature (this filter_method is only - * used in PNG datastreams that are embedded in MNG datastreams) and - * 3. The application called png_permit_mng_features with a mask that - * included PNG_FLAG_MNG_FILTER_64 and - * 4. The filter_method is 64 and - * 5. The color_type is RGB or RGBA - */ - if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) - { - /* Intrapixel differencing */ - png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); - } -#endif - - /* Find a filter if necessary, filter the row and write it out. */ - png_write_find_filter(png_ptr, &(png_ptr->row_info)); - - if (png_ptr->write_row_fn != NULL) - (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); -} - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -/* Set the automatic flush interval or 0 to turn flushing off */ -void PNGAPI -png_set_flush(png_structp png_ptr, int nrows) -{ - png_debug(1, "in png_set_flush\n"); - png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); -} - -/* flush the current output buffers now */ -void PNGAPI -png_write_flush(png_structp png_ptr) -{ - int wrote_IDAT; - - png_debug(1, "in png_write_flush\n"); - /* We have already written out all of the data */ - if (png_ptr->row_number >= png_ptr->num_rows) - return; - - do - { - int ret; - - /* compress the data */ - ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); - wrote_IDAT = 0; - - /* check for compression errors */ - if (ret != Z_OK) - { - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - - if (!(png_ptr->zstream.avail_out)) - { - /* write the IDAT and reset the zlib output buffer */ - png_write_IDAT(png_ptr, png_ptr->zbuf, - png_ptr->zbuf_size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - wrote_IDAT = 1; - } - } while(wrote_IDAT == 1); - - /* If there is any data left to be output, write it into a new IDAT */ - if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) - { - /* write the IDAT and reset the zlib output buffer */ - png_write_IDAT(png_ptr, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - png_ptr->flush_rows = 0; - png_flush(png_ptr); -} -#endif /* PNG_WRITE_FLUSH_SUPPORTED */ - -/* free all memory used by the write */ -void PNGAPI -png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) -{ - png_structp png_ptr = NULL; - png_infop info_ptr = NULL; -#ifdef PNG_USER_MEM_SUPPORTED - png_free_ptr free_fn = NULL; - png_voidp mem_ptr = NULL; -#endif - - png_debug(1, "in png_destroy_write_struct\n"); - if (png_ptr_ptr != NULL) - { - png_ptr = *png_ptr_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - free_fn = png_ptr->free_fn; - mem_ptr = png_ptr->mem_ptr; -#endif - } - - if (info_ptr_ptr != NULL) - info_ptr = *info_ptr_ptr; - - if (info_ptr != NULL) - { - png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - if (png_ptr->num_chunk_list) - { - png_free(png_ptr, png_ptr->chunk_list); - png_ptr->chunk_list=NULL; - png_ptr->num_chunk_list=0; - } -#endif - -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)info_ptr); -#endif - *info_ptr_ptr = NULL; - } - - if (png_ptr != NULL) - { - png_write_destroy(png_ptr); -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)png_ptr); -#endif - *png_ptr_ptr = NULL; - } -} - - -/* Free any memory used in png_ptr struct (old method) */ -void /* PRIVATE */ -png_write_destroy(png_structp png_ptr) -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf tmp_jmp; /* save jump buffer */ -#endif - png_error_ptr error_fn; - png_error_ptr warning_fn; - png_voidp error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - png_free_ptr free_fn; -#endif - - png_debug(1, "in png_write_destroy\n"); - /* free any memory zlib uses */ - deflateEnd(&png_ptr->zstream); - - /* free our memory. png_free checks NULL for us. */ - png_free(png_ptr, png_ptr->zbuf); - png_free(png_ptr, png_ptr->row_buf); - png_free(png_ptr, png_ptr->prev_row); - png_free(png_ptr, png_ptr->sub_row); - png_free(png_ptr, png_ptr->up_row); - png_free(png_ptr, png_ptr->avg_row); - png_free(png_ptr, png_ptr->paeth_row); - -#if defined(PNG_TIME_RFC1123_SUPPORTED) - png_free(png_ptr, png_ptr->time_buffer); -#endif - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - png_free(png_ptr, png_ptr->prev_filters); - png_free(png_ptr, png_ptr->filter_weights); - png_free(png_ptr, png_ptr->inv_filter_weights); - png_free(png_ptr, png_ptr->filter_costs); - png_free(png_ptr, png_ptr->inv_filter_costs); -#endif - -#ifdef PNG_SETJMP_SUPPORTED - /* reset structure */ - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); -#endif - - error_fn = png_ptr->error_fn; - warning_fn = png_ptr->warning_fn; - error_ptr = png_ptr->error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - free_fn = png_ptr->free_fn; -#endif - - png_memset(png_ptr, 0, png_sizeof (png_struct)); - - png_ptr->error_fn = error_fn; - png_ptr->warning_fn = warning_fn; - png_ptr->error_ptr = error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - png_ptr->free_fn = free_fn; -#endif - -#ifdef PNG_SETJMP_SUPPORTED - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); -#endif -} - -/* Allow the application to select one or more row filters to use. */ -void PNGAPI -png_set_filter(png_structp png_ptr, int method, int filters) -{ - png_debug(1, "in png_set_filter\n"); -#if defined(PNG_MNG_FEATURES_SUPPORTED) - if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (method == PNG_INTRAPIXEL_DIFFERENCING)) - method = PNG_FILTER_TYPE_BASE; -#endif - if (method == PNG_FILTER_TYPE_BASE) - { - switch (filters & (PNG_ALL_FILTERS | 0x07)) - { - case 5: - case 6: - case 7: png_warning(png_ptr, "Unknown row filter for method 0"); - case PNG_FILTER_VALUE_NONE: png_ptr->do_filter=PNG_FILTER_NONE; break; - case PNG_FILTER_VALUE_SUB: png_ptr->do_filter=PNG_FILTER_SUB; break; - case PNG_FILTER_VALUE_UP: png_ptr->do_filter=PNG_FILTER_UP; break; - case PNG_FILTER_VALUE_AVG: png_ptr->do_filter=PNG_FILTER_AVG; break; - case PNG_FILTER_VALUE_PAETH: png_ptr->do_filter=PNG_FILTER_PAETH;break; - default: png_ptr->do_filter = (png_byte)filters; break; - } - - /* If we have allocated the row_buf, this means we have already started - * with the image and we should have allocated all of the filter buffers - * that have been selected. If prev_row isn't already allocated, then - * it is too late to start using the filters that need it, since we - * will be missing the data in the previous row. If an application - * wants to start and stop using particular filters during compression, - * it should start out with all of the filters, and then add and - * remove them after the start of compression. - */ - if (png_ptr->row_buf != NULL) - { - if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) - { - png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; - } - - if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL) - { - if (png_ptr->prev_row == NULL) - { - png_warning(png_ptr, "Can't add Up filter after starting"); - png_ptr->do_filter &= ~PNG_FILTER_UP; - } - else - { - png_ptr->up_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; - } - } - - if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL) - { - if (png_ptr->prev_row == NULL) - { - png_warning(png_ptr, "Can't add Average filter after starting"); - png_ptr->do_filter &= ~PNG_FILTER_AVG; - } - else - { - png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; - } - } - - if ((png_ptr->do_filter & PNG_FILTER_PAETH) && - png_ptr->paeth_row == NULL) - { - if (png_ptr->prev_row == NULL) - { - png_warning(png_ptr, "Can't add Paeth filter after starting"); - png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH); - } - else - { - png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; - } - } - - if (png_ptr->do_filter == PNG_NO_FILTERS) - png_ptr->do_filter = PNG_FILTER_NONE; - } - } - else - png_error(png_ptr, "Unknown custom filter method"); -} - -/* This allows us to influence the way in which libpng chooses the "best" - * filter for the current scanline. While the "minimum-sum-of-absolute- - * differences metric is relatively fast and effective, there is some - * question as to whether it can be improved upon by trying to keep the - * filtered data going to zlib more consistent, hopefully resulting in - * better compression. - */ -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* GRR 970116 */ -void PNGAPI -png_set_filter_heuristics(png_structp png_ptr, int heuristic_method, - int num_weights, png_doublep filter_weights, - png_doublep filter_costs) -{ - int i; - - png_debug(1, "in png_set_filter_heuristics\n"); - if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) - { - png_warning(png_ptr, "Unknown filter heuristic method"); - return; - } - - if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT) - { - heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; - } - - if (num_weights < 0 || filter_weights == NULL || - heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) - { - num_weights = 0; - } - - png_ptr->num_prev_filters = (png_byte)num_weights; - png_ptr->heuristic_method = (png_byte)heuristic_method; - - if (num_weights > 0) - { - if (png_ptr->prev_filters == NULL) - { - png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_byte) * num_weights)); - - /* To make sure that the weighting starts out fairly */ - for (i = 0; i < num_weights; i++) - { - png_ptr->prev_filters[i] = 255; - } - } - - if (png_ptr->filter_weights == NULL) - { - png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); - - png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); - for (i = 0; i < num_weights; i++) - { - png_ptr->inv_filter_weights[i] = - png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; - } - } - - for (i = 0; i < num_weights; i++) - { - if (filter_weights[i] < 0.0) - { - png_ptr->inv_filter_weights[i] = - png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; - } - else - { - png_ptr->inv_filter_weights[i] = - (png_uint_16)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5); - png_ptr->filter_weights[i] = - (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5); - } - } - } - - /* If, in the future, there are other filter methods, this would - * need to be based on png_ptr->filter. - */ - if (png_ptr->filter_costs == NULL) - { - png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); - - png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); - - for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) - { - png_ptr->inv_filter_costs[i] = - png_ptr->filter_costs[i] = PNG_COST_FACTOR; - } - } - - /* Here is where we set the relative costs of the different filters. We - * should take the desired compression level into account when setting - * the costs, so that Paeth, for instance, has a high relative cost at low - * compression levels, while it has a lower relative cost at higher - * compression settings. The filter types are in order of increasing - * relative cost, so it would be possible to do this with an algorithm. - */ - for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) - { - if (filter_costs == NULL || filter_costs[i] < 0.0) - { - png_ptr->inv_filter_costs[i] = - png_ptr->filter_costs[i] = PNG_COST_FACTOR; - } - else if (filter_costs[i] >= 1.0) - { - png_ptr->inv_filter_costs[i] = - (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5); - png_ptr->filter_costs[i] = - (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5); - } - } -} -#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ - -void PNGAPI -png_set_compression_level(png_structp png_ptr, int level) -{ - png_debug(1, "in png_set_compression_level\n"); - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; - png_ptr->zlib_level = level; -} - -void PNGAPI -png_set_compression_mem_level(png_structp png_ptr, int mem_level) -{ - png_debug(1, "in png_set_compression_mem_level\n"); - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; - png_ptr->zlib_mem_level = mem_level; -} - -void PNGAPI -png_set_compression_strategy(png_structp png_ptr, int strategy) -{ - png_debug(1, "in png_set_compression_strategy\n"); - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; - png_ptr->zlib_strategy = strategy; -} - -void PNGAPI -png_set_compression_window_bits(png_structp png_ptr, int window_bits) -{ - if (window_bits > 15) - png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); - else if (window_bits < 8) - png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); -#ifndef WBITS_8_OK - /* avoid libpng bug with 256-byte windows */ - if (window_bits == 8) - { - png_warning(png_ptr, "Compression window is being reset to 512"); - window_bits=9; - } -#endif - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; - png_ptr->zlib_window_bits = window_bits; -} - -void PNGAPI -png_set_compression_method(png_structp png_ptr, int method) -{ - png_debug(1, "in png_set_compression_method\n"); - if (method != 8) - png_warning(png_ptr, "Only compression method 8 is supported by PNG"); - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; - png_ptr->zlib_method = method; -} - -void PNGAPI -png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn) -{ - png_ptr->write_row_fn = write_row_fn; -} - -#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -void PNGAPI -png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr - write_user_transform_fn) -{ - png_debug(1, "in png_set_write_user_transform_fn\n"); - png_ptr->transformations |= PNG_USER_TRANSFORM; - png_ptr->write_user_transform_fn = write_user_transform_fn; -} -#endif - - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -void PNGAPI -png_write_png(png_structp png_ptr, png_infop info_ptr, - int transforms, voidp params) -{ -#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) - /* invert the alpha channel from opacity to transparency */ - if (transforms & PNG_TRANSFORM_INVERT_ALPHA) - png_set_invert_alpha(png_ptr); -#endif - - /* Write the file header information. */ - png_write_info(png_ptr, info_ptr); - - /* ------ these transformations don't touch the info structure ------- */ - -#if defined(PNG_WRITE_INVERT_SUPPORTED) - /* invert monochrome pixels */ - if (transforms & PNG_TRANSFORM_INVERT_MONO) - png_set_invert_mono(png_ptr); -#endif - -#if defined(PNG_WRITE_SHIFT_SUPPORTED) - /* Shift the pixels up to a legal bit depth and fill in - * as appropriate to correctly scale the image. - */ - if ((transforms & PNG_TRANSFORM_SHIFT) - && (info_ptr->valid & PNG_INFO_sBIT)) - png_set_shift(png_ptr, &info_ptr->sig_bit); -#endif - -#if defined(PNG_WRITE_PACK_SUPPORTED) - /* pack pixels into bytes */ - if (transforms & PNG_TRANSFORM_PACKING) - png_set_packing(png_ptr); -#endif - -#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) - /* swap location of alpha bytes from ARGB to RGBA */ - if (transforms & PNG_TRANSFORM_SWAP_ALPHA) - png_set_swap_alpha(png_ptr); -#endif - -#if defined(PNG_WRITE_FILLER_SUPPORTED) - /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into - * RGB (4 channels -> 3 channels). The second parameter is not used. - */ - if (transforms & PNG_TRANSFORM_STRIP_FILLER) - png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); -#endif - -#if defined(PNG_WRITE_BGR_SUPPORTED) - /* flip BGR pixels to RGB */ - if (transforms & PNG_TRANSFORM_BGR) - png_set_bgr(png_ptr); -#endif - -#if defined(PNG_WRITE_SWAP_SUPPORTED) - /* swap bytes of 16-bit files to most significant byte first */ - if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) - png_set_swap(png_ptr); -#endif - -#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) - /* swap bits of 1, 2, 4 bit packed pixel formats */ - if (transforms & PNG_TRANSFORM_PACKSWAP) - png_set_packswap(png_ptr); -#endif - - /* ----------------------- end of transformations ------------------- */ - - /* write the bits */ - if (info_ptr->valid & PNG_INFO_IDAT) - png_write_image(png_ptr, info_ptr->row_pointers); - - /* It is REQUIRED to call this to finish writing the rest of the file */ - png_write_end(png_ptr, info_ptr); - - if(transforms == 0 || params == NULL) - /* quiet compiler warnings */ return; -} -#endif -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/SFML/Graphics/libpng/pngwtran.c b/src/SFML/Graphics/libpng/pngwtran.c deleted file mode 100644 index 325fe276..00000000 --- a/src/SFML/Graphics/libpng/pngwtran.c +++ /dev/null @@ -1,563 +0,0 @@ - -/* pngwtran.c - transforms the data in a row for PNG writers - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - */ - -#define PNG_INTERNAL -#include "png.h" -#ifdef PNG_WRITE_SUPPORTED - -/* Transform the data according to the user's wishes. The order of - * transformations is significant. - */ -void /* PRIVATE */ -png_do_write_transformations(png_structp png_ptr) -{ - png_debug(1, "in png_do_write_transformations\n"); - - if (png_ptr == NULL) - return; - -#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) - if (png_ptr->transformations & PNG_USER_TRANSFORM) - if(png_ptr->write_user_transform_fn != NULL) - (*(png_ptr->write_user_transform_fn)) /* user write transform function */ - (png_ptr, /* png_ptr */ - &(png_ptr->row_info), /* row_info: */ - /* png_uint_32 width; width of row */ - /* png_uint_32 rowbytes; number of bytes in row */ - /* png_byte color_type; color type of pixels */ - /* png_byte bit_depth; bit depth of samples */ - /* png_byte channels; number of channels (1-4) */ - /* png_byte pixel_depth; bits per pixel (depth*channels) */ - png_ptr->row_buf + 1); /* start of pixel data for row */ -#endif -#if defined(PNG_WRITE_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) - png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->flags); -#endif -#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) - png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1, - (png_uint_32)png_ptr->bit_depth); -#endif -#if defined(PNG_WRITE_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) - png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->shift)); -#endif -#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_ALPHA) - png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_ALPHA) - png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) - png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) - png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -} - -#if defined(PNG_WRITE_PACK_SUPPORTED) -/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The - * row_info bit depth should be 8 (one pixel per byte). The channels - * should be 1 (this only happens on grayscale and paletted images). - */ -void /* PRIVATE */ -png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) -{ - png_debug(1, "in png_do_pack\n"); - if (row_info->bit_depth == 8 && -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - row_info->channels == 1) - { - switch ((int)bit_depth) - { - case 1: - { - png_bytep sp, dp; - int mask, v; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - sp = row; - dp = row; - mask = 0x80; - v = 0; - - for (i = 0; i < row_width; i++) - { - if (*sp != 0) - v |= mask; - sp++; - if (mask > 1) - mask >>= 1; - else - { - mask = 0x80; - *dp = (png_byte)v; - dp++; - v = 0; - } - } - if (mask != 0x80) - *dp = (png_byte)v; - break; - } - case 2: - { - png_bytep sp, dp; - int shift, v; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - sp = row; - dp = row; - shift = 6; - v = 0; - for (i = 0; i < row_width; i++) - { - png_byte value; - - value = (png_byte)(*sp & 0x03); - v |= (value << shift); - if (shift == 0) - { - shift = 6; - *dp = (png_byte)v; - dp++; - v = 0; - } - else - shift -= 2; - sp++; - } - if (shift != 6) - *dp = (png_byte)v; - break; - } - case 4: - { - png_bytep sp, dp; - int shift, v; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - sp = row; - dp = row; - shift = 4; - v = 0; - for (i = 0; i < row_width; i++) - { - png_byte value; - - value = (png_byte)(*sp & 0x0f); - v |= (value << shift); - - if (shift == 0) - { - shift = 4; - *dp = (png_byte)v; - dp++; - v = 0; - } - else - shift -= 4; - - sp++; - } - if (shift != 4) - *dp = (png_byte)v; - break; - } - } - row_info->bit_depth = (png_byte)bit_depth; - row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, - row_info->width); - } -} -#endif - -#if defined(PNG_WRITE_SHIFT_SUPPORTED) -/* Shift pixel values to take advantage of whole range. Pass the - * true number of bits in bit_depth. The row should be packed - * according to row_info->bit_depth. Thus, if you had a row of - * bit depth 4, but the pixels only had values from 0 to 7, you - * would pass 3 as bit_depth, and this routine would translate the - * data to 0 to 15. - */ -void /* PRIVATE */ -png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) -{ - png_debug(1, "in png_do_shift\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL && -#else - if ( -#endif - row_info->color_type != PNG_COLOR_TYPE_PALETTE) - { - int shift_start[4], shift_dec[4]; - int channels = 0; - - if (row_info->color_type & PNG_COLOR_MASK_COLOR) - { - shift_start[channels] = row_info->bit_depth - bit_depth->red; - shift_dec[channels] = bit_depth->red; - channels++; - shift_start[channels] = row_info->bit_depth - bit_depth->green; - shift_dec[channels] = bit_depth->green; - channels++; - shift_start[channels] = row_info->bit_depth - bit_depth->blue; - shift_dec[channels] = bit_depth->blue; - channels++; - } - else - { - shift_start[channels] = row_info->bit_depth - bit_depth->gray; - shift_dec[channels] = bit_depth->gray; - channels++; - } - if (row_info->color_type & PNG_COLOR_MASK_ALPHA) - { - shift_start[channels] = row_info->bit_depth - bit_depth->alpha; - shift_dec[channels] = bit_depth->alpha; - channels++; - } - - /* with low row depths, could only be grayscale, so one channel */ - if (row_info->bit_depth < 8) - { - png_bytep bp = row; - png_uint_32 i; - png_byte mask; - png_uint_32 row_bytes = row_info->rowbytes; - - if (bit_depth->gray == 1 && row_info->bit_depth == 2) - mask = 0x55; - else if (row_info->bit_depth == 4 && bit_depth->gray == 3) - mask = 0x11; - else - mask = 0xff; - - for (i = 0; i < row_bytes; i++, bp++) - { - png_uint_16 v; - int j; - - v = *bp; - *bp = 0; - for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) - { - if (j > 0) - *bp |= (png_byte)((v << j) & 0xff); - else - *bp |= (png_byte)((v >> (-j)) & mask); - } - } - } - else if (row_info->bit_depth == 8) - { - png_bytep bp = row; - png_uint_32 i; - png_uint_32 istop = channels * row_info->width; - - for (i = 0; i < istop; i++, bp++) - { - - png_uint_16 v; - int j; - int c = (int)(i%channels); - - v = *bp; - *bp = 0; - for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) - { - if (j > 0) - *bp |= (png_byte)((v << j) & 0xff); - else - *bp |= (png_byte)((v >> (-j)) & 0xff); - } - } - } - else - { - png_bytep bp; - png_uint_32 i; - png_uint_32 istop = channels * row_info->width; - - for (bp = row, i = 0; i < istop; i++) - { - int c = (int)(i%channels); - png_uint_16 value, v; - int j; - - v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1)); - value = 0; - for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) - { - if (j > 0) - value |= (png_uint_16)((v << j) & (png_uint_16)0xffff); - else - value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff); - } - *bp++ = (png_byte)(value >> 8); - *bp++ = (png_byte)(value & 0xff); - } - } - } -} -#endif - -#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -void /* PRIVATE */ -png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_write_swap_alpha\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - /* This converts from ARGB to RGBA */ - if (row_info->bit_depth == 8) - { - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - for (i = 0, sp = dp = row; i < row_width; i++) - { - png_byte save = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = save; - } - } - /* This converts from AARRGGBB to RRGGBBAA */ - else - { - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - png_byte save[2]; - save[0] = *(sp++); - save[1] = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = save[0]; - *(dp++) = save[1]; - } - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - /* This converts from AG to GA */ - if (row_info->bit_depth == 8) - { - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - png_byte save = *(sp++); - *(dp++) = *(sp++); - *(dp++) = save; - } - } - /* This converts from AAGG to GGAA */ - else - { - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - png_byte save[2]; - save[0] = *(sp++); - save[1] = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = save[0]; - *(dp++) = save[1]; - } - } - } - } -} -#endif - -#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -void /* PRIVATE */ -png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_write_invert_alpha\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - /* This inverts the alpha channel in RGBA */ - if (row_info->bit_depth == 8) - { - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - for (i = 0, sp = dp = row; i < row_width; i++) - { - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = (png_byte)(255 - *(sp++)); - } - } - /* This inverts the alpha channel in RRGGBBAA */ - else - { - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = (png_byte)(255 - *(sp++)); - *(dp++) = (png_byte)(255 - *(sp++)); - } - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - /* This inverts the alpha channel in GA */ - if (row_info->bit_depth == 8) - { - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - *(dp++) = *(sp++); - *(dp++) = (png_byte)(255 - *(sp++)); - } - } - /* This inverts the alpha channel in GGAA */ - else - { - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = (png_byte)(255 - *(sp++)); - *(dp++) = (png_byte)(255 - *(sp++)); - } - } - } - } -} -#endif - -#if defined(PNG_MNG_FEATURES_SUPPORTED) -/* undoes intrapixel differencing */ -void /* PRIVATE */ -png_do_write_intrapixel(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_write_intrapixel\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - int bytes_per_pixel; - png_uint_32 row_width = row_info->width; - if (row_info->bit_depth == 8) - { - png_bytep rp; - png_uint_32 i; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - bytes_per_pixel = 3; - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - bytes_per_pixel = 4; - else - return; - - for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) - { - *(rp) = (png_byte)((*rp - *(rp+1))&0xff); - *(rp+2) = (png_byte)((*(rp+2) - *(rp+1))&0xff); - } - } - else if (row_info->bit_depth == 16) - { - png_bytep rp; - png_uint_32 i; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - bytes_per_pixel = 6; - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - bytes_per_pixel = 8; - else - return; - - for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) - { - png_uint_32 s0 = (*(rp ) << 8) | *(rp+1); - png_uint_32 s1 = (*(rp+2) << 8) | *(rp+3); - png_uint_32 s2 = (*(rp+4) << 8) | *(rp+5); - png_uint_32 red = (png_uint_32)((s0-s1) & 0xffffL); - png_uint_32 blue = (png_uint_32)((s2-s1) & 0xffffL); - *(rp ) = (png_byte)((red >> 8) & 0xff); - *(rp+1) = (png_byte)(red & 0xff); - *(rp+4) = (png_byte)((blue >> 8) & 0xff); - *(rp+5) = (png_byte)(blue & 0xff); - } - } - } -} -#endif /* PNG_MNG_FEATURES_SUPPORTED */ -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/SFML/Graphics/libpng/pngwutil.c b/src/SFML/Graphics/libpng/pngwutil.c deleted file mode 100644 index 7a94cc4c..00000000 --- a/src/SFML/Graphics/libpng/pngwutil.c +++ /dev/null @@ -1,2730 +0,0 @@ - -/* pngwutil.c - utilities to write a PNG file - * - * libpng version 1.2.8 - December 3, 2004 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2004 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - */ - -#define PNG_INTERNAL -#include "png.h" -#ifdef PNG_WRITE_SUPPORTED - -/* Place a 32-bit number into a buffer in PNG byte order. We work - * with unsigned numbers for convenience, although one supported - * ancillary chunk uses signed (two's complement) numbers. - */ -void /* PRIVATE */ -png_save_uint_32(png_bytep buf, png_uint_32 i) -{ - buf[0] = (png_byte)((i >> 24) & 0xff); - buf[1] = (png_byte)((i >> 16) & 0xff); - buf[2] = (png_byte)((i >> 8) & 0xff); - buf[3] = (png_byte)(i & 0xff); -} - -#if defined(PNG_WRITE_pCAL_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED) -/* The png_save_int_32 function assumes integers are stored in two's - * complement format. If this isn't the case, then this routine needs to - * be modified to write data in two's complement format. - */ -void /* PRIVATE */ -png_save_int_32(png_bytep buf, png_int_32 i) -{ - buf[0] = (png_byte)((i >> 24) & 0xff); - buf[1] = (png_byte)((i >> 16) & 0xff); - buf[2] = (png_byte)((i >> 8) & 0xff); - buf[3] = (png_byte)(i & 0xff); -} -#endif - -/* Place a 16-bit number into a buffer in PNG byte order. - * The parameter is declared unsigned int, not png_uint_16, - * just to avoid potential problems on pre-ANSI C compilers. - */ -void /* PRIVATE */ -png_save_uint_16(png_bytep buf, unsigned int i) -{ - buf[0] = (png_byte)((i >> 8) & 0xff); - buf[1] = (png_byte)(i & 0xff); -} - -/* Write a PNG chunk all at once. The type is an array of ASCII characters - * representing the chunk name. The array must be at least 4 bytes in - * length, and does not need to be null terminated. To be safe, pass the - * pre-defined chunk names here, and if you need a new one, define it - * where the others are defined. The length is the length of the data. - * All the data must be present. If that is not possible, use the - * png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end() - * functions instead. - */ -void PNGAPI -png_write_chunk(png_structp png_ptr, png_bytep chunk_name, - png_bytep data, png_size_t length) -{ - png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length); - png_write_chunk_data(png_ptr, data, length); - png_write_chunk_end(png_ptr); -} - -/* Write the start of a PNG chunk. The type is the chunk type. - * The total_length is the sum of the lengths of all the data you will be - * passing in png_write_chunk_data(). - */ -void PNGAPI -png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name, - png_uint_32 length) -{ - png_byte buf[4]; - png_debug2(0, "Writing %s chunk (%lu bytes)\n", chunk_name, length); - - /* write the length */ - png_save_uint_32(buf, length); - png_write_data(png_ptr, buf, (png_size_t)4); - - /* write the chunk name */ - png_write_data(png_ptr, chunk_name, (png_size_t)4); - /* reset the crc and run it over the chunk name */ - png_reset_crc(png_ptr); - png_calculate_crc(png_ptr, chunk_name, (png_size_t)4); -} - -/* Write the data of a PNG chunk started with png_write_chunk_start(). - * Note that multiple calls to this function are allowed, and that the - * sum of the lengths from these calls *must* add up to the total_length - * given to png_write_chunk_start(). - */ -void PNGAPI -png_write_chunk_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - /* write the data, and run the CRC over it */ - if (data != NULL && length > 0) - { - png_calculate_crc(png_ptr, data, length); - png_write_data(png_ptr, data, length); - } -} - -/* Finish a chunk started with png_write_chunk_start(). */ -void PNGAPI -png_write_chunk_end(png_structp png_ptr) -{ - png_byte buf[4]; - - /* write the crc */ - png_save_uint_32(buf, png_ptr->crc); - - png_write_data(png_ptr, buf, (png_size_t)4); -} - -/* Simple function to write the signature. If we have already written - * the magic bytes of the signature, or more likely, the PNG stream is - * being embedded into another stream and doesn't need its own signature, - * we should call png_set_sig_bytes() to tell libpng how many of the - * bytes have already been written. - */ -void /* PRIVATE */ -png_write_sig(png_structp png_ptr) -{ - png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; - /* write the rest of the 8 byte signature */ - png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes], - (png_size_t)8 - png_ptr->sig_bytes); - if(png_ptr->sig_bytes < 3) - png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; -} - -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_iCCP_SUPPORTED) -/* - * This pair of functions encapsulates the operation of (a) compressing a - * text string, and (b) issuing it later as a series of chunk data writes. - * The compression_state structure is shared context for these functions - * set up by the caller in order to make the whole mess thread-safe. - */ - -typedef struct -{ - char *input; /* the uncompressed input data */ - int input_len; /* its length */ - int num_output_ptr; /* number of output pointers used */ - int max_output_ptr; /* size of output_ptr */ - png_charpp output_ptr; /* array of pointers to output */ -} compression_state; - -/* compress given text into storage in the png_ptr structure */ -static int /* PRIVATE */ -png_text_compress(png_structp png_ptr, - png_charp text, png_size_t text_len, int compression, - compression_state *comp) -{ - int ret; - - comp->num_output_ptr = comp->max_output_ptr = 0; - comp->output_ptr = NULL; - comp->input = NULL; - - /* we may just want to pass the text right through */ - if (compression == PNG_TEXT_COMPRESSION_NONE) - { - comp->input = text; - comp->input_len = text_len; - return((int)text_len); - } - - if (compression >= PNG_TEXT_COMPRESSION_LAST) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[50]; - sprintf(msg, "Unknown compression type %d", compression); - png_warning(png_ptr, msg); -#else - png_warning(png_ptr, "Unknown compression type"); -#endif - } - - /* We can't write the chunk until we find out how much data we have, - * which means we need to run the compressor first and save the - * output. This shouldn't be a problem, as the vast majority of - * comments should be reasonable, but we will set up an array of - * malloc'd pointers to be sure. - * - * If we knew the application was well behaved, we could simplify this - * greatly by assuming we can always malloc an output buffer large - * enough to hold the compressed text ((1001 * text_len / 1000) + 12) - * and malloc this directly. The only time this would be a bad idea is - * if we can't malloc more than 64K and we have 64K of random input - * data, or if the input string is incredibly large (although this - * wouldn't cause a failure, just a slowdown due to swapping). - */ - - /* set up the compression buffers */ - png_ptr->zstream.avail_in = (uInt)text_len; - png_ptr->zstream.next_in = (Bytef *)text; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_out = (Bytef *)png_ptr->zbuf; - - /* this is the same compression loop as in png_write_row() */ - do - { - /* compress the data */ - ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); - if (ret != Z_OK) - { - /* error */ - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - /* check to see if we need more room */ - if (!(png_ptr->zstream.avail_out)) - { - /* make sure the output array has room */ - if (comp->num_output_ptr >= comp->max_output_ptr) - { - int old_max; - - old_max = comp->max_output_ptr; - comp->max_output_ptr = comp->num_output_ptr + 4; - if (comp->output_ptr != NULL) - { - png_charpp old_ptr; - - old_ptr = comp->output_ptr; - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_uint_32)(comp->max_output_ptr * - png_sizeof (png_charpp))); - png_memcpy(comp->output_ptr, old_ptr, old_max - * png_sizeof (png_charp)); - png_free(png_ptr, old_ptr); - } - else - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_uint_32)(comp->max_output_ptr * - png_sizeof (png_charp))); - } - - /* save the data */ - comp->output_ptr[comp->num_output_ptr] = (png_charp)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, - png_ptr->zbuf_size); - comp->num_output_ptr++; - - /* and reset the buffer */ - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_out = png_ptr->zbuf; - } - /* continue until we don't have any more to compress */ - } while (png_ptr->zstream.avail_in); - - /* finish the compression */ - do - { - /* tell zlib we are finished */ - ret = deflate(&png_ptr->zstream, Z_FINISH); - - if (ret == Z_OK) - { - /* check to see if we need more room */ - if (!(png_ptr->zstream.avail_out)) - { - /* check to make sure our output array has room */ - if (comp->num_output_ptr >= comp->max_output_ptr) - { - int old_max; - - old_max = comp->max_output_ptr; - comp->max_output_ptr = comp->num_output_ptr + 4; - if (comp->output_ptr != NULL) - { - png_charpp old_ptr; - - old_ptr = comp->output_ptr; - /* This could be optimized to realloc() */ - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_uint_32)(comp->max_output_ptr * - png_sizeof (png_charpp))); - png_memcpy(comp->output_ptr, old_ptr, - old_max * png_sizeof (png_charp)); - png_free(png_ptr, old_ptr); - } - else - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_uint_32)(comp->max_output_ptr * - png_sizeof (png_charp))); - } - - /* save off the data */ - comp->output_ptr[comp->num_output_ptr] = - (png_charp)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); - png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, - png_ptr->zbuf_size); - comp->num_output_ptr++; - - /* and reset the buffer pointers */ - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_out = png_ptr->zbuf; - } - } - else if (ret != Z_STREAM_END) - { - /* we got an error */ - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - } while (ret != Z_STREAM_END); - - /* text length is number of buffers plus last buffer */ - text_len = png_ptr->zbuf_size * comp->num_output_ptr; - if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) - text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out; - - return((int)text_len); -} - -/* ship the compressed text out via chunk writes */ -static void /* PRIVATE */ -png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) -{ - int i; - - /* handle the no-compression case */ - if (comp->input) - { - png_write_chunk_data(png_ptr, (png_bytep)comp->input, - (png_size_t)comp->input_len); - return; - } - - /* write saved output buffers, if any */ - for (i = 0; i < comp->num_output_ptr; i++) - { - png_write_chunk_data(png_ptr,(png_bytep)comp->output_ptr[i], - png_ptr->zbuf_size); - png_free(png_ptr, comp->output_ptr[i]); - comp->output_ptr[i]=NULL; - } - if (comp->max_output_ptr != 0) - png_free(png_ptr, comp->output_ptr); - comp->output_ptr=NULL; - /* write anything left in zbuf */ - if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size) - png_write_chunk_data(png_ptr, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - - /* reset zlib for another zTXt/iTXt or image data */ - deflateReset(&png_ptr->zstream); - png_ptr->zstream.data_type = Z_BINARY; -} -#endif - -/* Write the IHDR chunk, and update the png_struct with the necessary - * information. Note that the rest of this code depends upon this - * information being correct. - */ -void /* PRIVATE */ -png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, - int bit_depth, int color_type, int compression_type, int filter_type, - int interlace_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IHDR; -#endif - png_byte buf[13]; /* buffer to store the IHDR info */ - - png_debug(1, "in png_write_IHDR\n"); - /* Check that we have valid input data from the application info */ - switch (color_type) - { - case PNG_COLOR_TYPE_GRAY: - switch (bit_depth) - { - case 1: - case 2: - case 4: - case 8: - case 16: png_ptr->channels = 1; break; - default: png_error(png_ptr,"Invalid bit depth for grayscale image"); - } - break; - case PNG_COLOR_TYPE_RGB: - if (bit_depth != 8 && bit_depth != 16) - png_error(png_ptr, "Invalid bit depth for RGB image"); - png_ptr->channels = 3; - break; - case PNG_COLOR_TYPE_PALETTE: - switch (bit_depth) - { - case 1: - case 2: - case 4: - case 8: png_ptr->channels = 1; break; - default: png_error(png_ptr, "Invalid bit depth for paletted image"); - } - break; - case PNG_COLOR_TYPE_GRAY_ALPHA: - if (bit_depth != 8 && bit_depth != 16) - png_error(png_ptr, "Invalid bit depth for grayscale+alpha image"); - png_ptr->channels = 2; - break; - case PNG_COLOR_TYPE_RGB_ALPHA: - if (bit_depth != 8 && bit_depth != 16) - png_error(png_ptr, "Invalid bit depth for RGBA image"); - png_ptr->channels = 4; - break; - default: - png_error(png_ptr, "Invalid image color type specified"); - } - - if (compression_type != PNG_COMPRESSION_TYPE_BASE) - { - png_warning(png_ptr, "Invalid compression type specified"); - compression_type = PNG_COMPRESSION_TYPE_BASE; - } - - /* Write filter_method 64 (intrapixel differencing) only if - * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and - * 2. Libpng did not write a PNG signature (this filter_method is only - * used in PNG datastreams that are embedded in MNG datastreams) and - * 3. The application called png_permit_mng_features with a mask that - * included PNG_FLAG_MNG_FILTER_64 and - * 4. The filter_method is 64 and - * 5. The color_type is RGB or RGBA - */ - if ( -#if defined(PNG_MNG_FEATURES_SUPPORTED) - !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && - (color_type == PNG_COLOR_TYPE_RGB || - color_type == PNG_COLOR_TYPE_RGB_ALPHA) && - (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) && -#endif - filter_type != PNG_FILTER_TYPE_BASE) - { - png_warning(png_ptr, "Invalid filter type specified"); - filter_type = PNG_FILTER_TYPE_BASE; - } - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - if (interlace_type != PNG_INTERLACE_NONE && - interlace_type != PNG_INTERLACE_ADAM7) - { - png_warning(png_ptr, "Invalid interlace type specified"); - interlace_type = PNG_INTERLACE_ADAM7; - } -#else - interlace_type=PNG_INTERLACE_NONE; -#endif - - /* save off the relevent information */ - png_ptr->bit_depth = (png_byte)bit_depth; - png_ptr->color_type = (png_byte)color_type; - png_ptr->interlaced = (png_byte)interlace_type; -#if defined(PNG_MNG_FEATURES_SUPPORTED) - png_ptr->filter_type = (png_byte)filter_type; -#endif - png_ptr->compression_type = (png_byte)compression_type; - png_ptr->width = width; - png_ptr->height = height; - - png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels); - png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); - /* set the usr info, so any transformations can modify it */ - png_ptr->usr_width = png_ptr->width; - png_ptr->usr_bit_depth = png_ptr->bit_depth; - png_ptr->usr_channels = png_ptr->channels; - - /* pack the header information into the buffer */ - png_save_uint_32(buf, width); - png_save_uint_32(buf + 4, height); - buf[8] = (png_byte)bit_depth; - buf[9] = (png_byte)color_type; - buf[10] = (png_byte)compression_type; - buf[11] = (png_byte)filter_type; - buf[12] = (png_byte)interlace_type; - - /* write the chunk */ - png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13); - - /* initialize zlib with PNG info */ - png_ptr->zstream.zalloc = png_zalloc; - png_ptr->zstream.zfree = png_zfree; - png_ptr->zstream.opaque = (voidpf)png_ptr; - if (!(png_ptr->do_filter)) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || - png_ptr->bit_depth < 8) - png_ptr->do_filter = PNG_FILTER_NONE; - else - png_ptr->do_filter = PNG_ALL_FILTERS; - } - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY)) - { - if (png_ptr->do_filter != PNG_FILTER_NONE) - png_ptr->zlib_strategy = Z_FILTERED; - else - png_ptr->zlib_strategy = Z_DEFAULT_STRATEGY; - } - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_LEVEL)) - png_ptr->zlib_level = Z_DEFAULT_COMPRESSION; - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL)) - png_ptr->zlib_mem_level = 8; - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS)) - png_ptr->zlib_window_bits = 15; - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD)) - png_ptr->zlib_method = 8; - deflateInit2(&png_ptr->zstream, png_ptr->zlib_level, - png_ptr->zlib_method, png_ptr->zlib_window_bits, - png_ptr->zlib_mem_level, png_ptr->zlib_strategy); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - /* libpng is not interested in zstream.data_type */ - /* set it to a predefined value, to avoid its evaluation inside zlib */ - png_ptr->zstream.data_type = Z_BINARY; - - png_ptr->mode = PNG_HAVE_IHDR; -} - -/* write the palette. We are careful not to trust png_color to be in the - * correct order for PNG, so people can redefine it to any convenient - * structure. - */ -void /* PRIVATE */ -png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_PLTE; -#endif - png_uint_32 i; - png_colorp pal_ptr; - png_byte buf[3]; - - png_debug(1, "in png_write_PLTE\n"); - if (( -#if defined(PNG_MNG_FEATURES_SUPPORTED) - !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && -#endif - num_pal == 0) || num_pal > 256) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - png_error(png_ptr, "Invalid number of colors in palette"); - } - else - { - png_warning(png_ptr, "Invalid number of colors in palette"); - return; - } - } - - if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) - { - png_warning(png_ptr, - "Ignoring request to write a PLTE chunk in grayscale PNG"); - return; - } - - png_ptr->num_palette = (png_uint_16)num_pal; - png_debug1(3, "num_palette = %d\n", png_ptr->num_palette); - - png_write_chunk_start(png_ptr, (png_bytep)png_PLTE, num_pal * 3); -#ifndef PNG_NO_POINTER_INDEXING - for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++) - { - buf[0] = pal_ptr->red; - buf[1] = pal_ptr->green; - buf[2] = pal_ptr->blue; - png_write_chunk_data(png_ptr, buf, (png_size_t)3); - } -#else - /* This is a little slower but some buggy compilers need to do this instead */ - pal_ptr=palette; - for (i = 0; i < num_pal; i++) - { - buf[0] = pal_ptr[i].red; - buf[1] = pal_ptr[i].green; - buf[2] = pal_ptr[i].blue; - png_write_chunk_data(png_ptr, buf, (png_size_t)3); - } -#endif - png_write_chunk_end(png_ptr); - png_ptr->mode |= PNG_HAVE_PLTE; -} - -/* write an IDAT chunk */ -void /* PRIVATE */ -png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IDAT; -#endif - png_debug(1, "in png_write_IDAT\n"); - - /* Optimize the CMF field in the zlib stream. */ - /* This hack of the zlib stream is compliant to the stream specification. */ - if (!(png_ptr->mode & PNG_HAVE_IDAT) && - png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) - { - unsigned int z_cmf = data[0]; /* zlib compression method and flags */ - if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70) - { - /* Avoid memory underflows and multiplication overflows. */ - /* The conditions below are practically always satisfied; - however, they still must be checked. */ - if (length >= 2 && - png_ptr->height < 16384 && png_ptr->width < 16384) - { - png_uint_32 uncompressed_idat_size = png_ptr->height * - ((png_ptr->width * - png_ptr->channels * png_ptr->bit_depth + 15) >> 3); - unsigned int z_cinfo = z_cmf >> 4; - unsigned int half_z_window_size = 1 << (z_cinfo + 7); - while (uncompressed_idat_size <= half_z_window_size && - half_z_window_size >= 256) - { - z_cinfo--; - half_z_window_size >>= 1; - } - z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4); - if (data[0] != (png_byte)z_cmf) - { - data[0] = (png_byte)z_cmf; - data[1] &= 0xe0; - data[1] += (png_byte)(0x1f - ((z_cmf << 8) + data[1]) % 0x1f); - } - } - } - else - png_error(png_ptr, - "Invalid zlib compression method or flags in IDAT"); - } - - png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length); - png_ptr->mode |= PNG_HAVE_IDAT; -} - -/* write an IEND chunk */ -void /* PRIVATE */ -png_write_IEND(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IEND; -#endif - png_debug(1, "in png_write_IEND\n"); - png_write_chunk(png_ptr, (png_bytep)png_IEND, png_bytep_NULL, - (png_size_t)0); - png_ptr->mode |= PNG_HAVE_IEND; -} - -#if defined(PNG_WRITE_gAMA_SUPPORTED) -/* write a gAMA chunk */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -void /* PRIVATE */ -png_write_gAMA(png_structp png_ptr, double file_gamma) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_gAMA; -#endif - png_uint_32 igamma; - png_byte buf[4]; - - png_debug(1, "in png_write_gAMA\n"); - /* file_gamma is saved in 1/100,000ths */ - igamma = (png_uint_32)(file_gamma * 100000.0 + 0.5); - png_save_uint_32(buf, igamma); - png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -void /* PRIVATE */ -png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_gAMA; -#endif - png_byte buf[4]; - - png_debug(1, "in png_write_gAMA\n"); - /* file_gamma is saved in 1/100,000ths */ - png_save_uint_32(buf, (png_uint_32)file_gamma); - png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4); -} -#endif -#endif - -#if defined(PNG_WRITE_sRGB_SUPPORTED) -/* write a sRGB chunk */ -void /* PRIVATE */ -png_write_sRGB(png_structp png_ptr, int srgb_intent) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sRGB; -#endif - png_byte buf[1]; - - png_debug(1, "in png_write_sRGB\n"); - if(srgb_intent >= PNG_sRGB_INTENT_LAST) - png_warning(png_ptr, - "Invalid sRGB rendering intent specified"); - buf[0]=(png_byte)srgb_intent; - png_write_chunk(png_ptr, (png_bytep)png_sRGB, buf, (png_size_t)1); -} -#endif - -#if defined(PNG_WRITE_iCCP_SUPPORTED) -/* write an iCCP chunk */ -void /* PRIVATE */ -png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, - png_charp profile, int profile_len) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_iCCP; -#endif - png_size_t name_len; - png_charp new_name; - compression_state comp; - - png_debug(1, "in png_write_iCCP\n"); - if (name == NULL || (name_len = png_check_keyword(png_ptr, name, - &new_name)) == 0) - { - png_warning(png_ptr, "Empty keyword in iCCP chunk"); - return; - } - - if (compression_type != PNG_COMPRESSION_TYPE_BASE) - png_warning(png_ptr, "Unknown compression type in iCCP chunk"); - - if (profile == NULL) - profile_len = 0; - - if (profile_len) - profile_len = png_text_compress(png_ptr, profile, (png_size_t)profile_len, - PNG_COMPRESSION_TYPE_BASE, &comp); - - /* make sure we include the NULL after the name and the compression type */ - png_write_chunk_start(png_ptr, (png_bytep)png_iCCP, - (png_uint_32)name_len+profile_len+2); - new_name[name_len+1]=0x00; - png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 2); - - if (profile_len) - png_write_compressed_data_out(png_ptr, &comp); - - png_write_chunk_end(png_ptr); - png_free(png_ptr, new_name); -} -#endif - -#if defined(PNG_WRITE_sPLT_SUPPORTED) -/* write a sPLT chunk */ -void /* PRIVATE */ -png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sPLT; -#endif - png_size_t name_len; - png_charp new_name; - png_byte entrybuf[10]; - int entry_size = (spalette->depth == 8 ? 6 : 10); - int palette_size = entry_size * spalette->nentries; - png_sPLT_entryp ep; -#ifdef PNG_NO_POINTER_INDEXING - int i; -#endif - - png_debug(1, "in png_write_sPLT\n"); - if (spalette->name == NULL || (name_len = png_check_keyword(png_ptr, - spalette->name, &new_name))==0) - { - png_warning(png_ptr, "Empty keyword in sPLT chunk"); - return; - } - - /* make sure we include the NULL after the name */ - png_write_chunk_start(png_ptr, (png_bytep)png_sPLT, - (png_uint_32)(name_len + 2 + palette_size)); - png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 1); - png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, 1); - - /* loop through each palette entry, writing appropriately */ -#ifndef PNG_NO_POINTER_INDEXING - for (ep = spalette->entries; epentries+spalette->nentries; ep++) - { - if (spalette->depth == 8) - { - entrybuf[0] = (png_byte)ep->red; - entrybuf[1] = (png_byte)ep->green; - entrybuf[2] = (png_byte)ep->blue; - entrybuf[3] = (png_byte)ep->alpha; - png_save_uint_16(entrybuf + 4, ep->frequency); - } - else - { - png_save_uint_16(entrybuf + 0, ep->red); - png_save_uint_16(entrybuf + 2, ep->green); - png_save_uint_16(entrybuf + 4, ep->blue); - png_save_uint_16(entrybuf + 6, ep->alpha); - png_save_uint_16(entrybuf + 8, ep->frequency); - } - png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size); - } -#else - ep=spalette->entries; - for (i=0; i>spalette->nentries; i++) - { - if (spalette->depth == 8) - { - entrybuf[0] = (png_byte)ep[i].red; - entrybuf[1] = (png_byte)ep[i].green; - entrybuf[2] = (png_byte)ep[i].blue; - entrybuf[3] = (png_byte)ep[i].alpha; - png_save_uint_16(entrybuf + 4, ep[i].frequency); - } - else - { - png_save_uint_16(entrybuf + 0, ep[i].red); - png_save_uint_16(entrybuf + 2, ep[i].green); - png_save_uint_16(entrybuf + 4, ep[i].blue); - png_save_uint_16(entrybuf + 6, ep[i].alpha); - png_save_uint_16(entrybuf + 8, ep[i].frequency); - } - png_write_chunk_data(png_ptr, entrybuf, entry_size); - } -#endif - - png_write_chunk_end(png_ptr); - png_free(png_ptr, new_name); -} -#endif - -#if defined(PNG_WRITE_sBIT_SUPPORTED) -/* write the sBIT chunk */ -void /* PRIVATE */ -png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sBIT; -#endif - png_byte buf[4]; - png_size_t size; - - png_debug(1, "in png_write_sBIT\n"); - /* make sure we don't depend upon the order of PNG_COLOR_8 */ - if (color_type & PNG_COLOR_MASK_COLOR) - { - png_byte maxbits; - - maxbits = (png_byte)(color_type==PNG_COLOR_TYPE_PALETTE ? 8 : - png_ptr->usr_bit_depth); - if (sbit->red == 0 || sbit->red > maxbits || - sbit->green == 0 || sbit->green > maxbits || - sbit->blue == 0 || sbit->blue > maxbits) - { - png_warning(png_ptr, "Invalid sBIT depth specified"); - return; - } - buf[0] = sbit->red; - buf[1] = sbit->green; - buf[2] = sbit->blue; - size = 3; - } - else - { - if (sbit->gray == 0 || sbit->gray > png_ptr->usr_bit_depth) - { - png_warning(png_ptr, "Invalid sBIT depth specified"); - return; - } - buf[0] = sbit->gray; - size = 1; - } - - if (color_type & PNG_COLOR_MASK_ALPHA) - { - if (sbit->alpha == 0 || sbit->alpha > png_ptr->usr_bit_depth) - { - png_warning(png_ptr, "Invalid sBIT depth specified"); - return; - } - buf[size++] = sbit->alpha; - } - - png_write_chunk(png_ptr, (png_bytep)png_sBIT, buf, size); -} -#endif - -#if defined(PNG_WRITE_cHRM_SUPPORTED) -/* write the cHRM chunk */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -void /* PRIVATE */ -png_write_cHRM(png_structp png_ptr, double white_x, double white_y, - double red_x, double red_y, double green_x, double green_y, - double blue_x, double blue_y) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_cHRM; -#endif - png_byte buf[32]; - png_uint_32 itemp; - - png_debug(1, "in png_write_cHRM\n"); - /* each value is saved in 1/100,000ths */ - if (white_x < 0 || white_x > 0.8 || white_y < 0 || white_y > 0.8 || - white_x + white_y > 1.0) - { - png_warning(png_ptr, "Invalid cHRM white point specified"); -#if !defined(PNG_NO_CONSOLE_IO) - fprintf(stderr,"white_x=%f, white_y=%f\n",white_x, white_y); -#endif - return; - } - itemp = (png_uint_32)(white_x * 100000.0 + 0.5); - png_save_uint_32(buf, itemp); - itemp = (png_uint_32)(white_y * 100000.0 + 0.5); - png_save_uint_32(buf + 4, itemp); - - if (red_x < 0 || red_x > 0.8 || red_y < 0 || red_y > 0.8 || - red_x + red_y > 1.0) - { - png_warning(png_ptr, "Invalid cHRM red point specified"); - return; - } - itemp = (png_uint_32)(red_x * 100000.0 + 0.5); - png_save_uint_32(buf + 8, itemp); - itemp = (png_uint_32)(red_y * 100000.0 + 0.5); - png_save_uint_32(buf + 12, itemp); - - if (green_x < 0 || green_x > 0.8 || green_y < 0 || green_y > 0.8 || - green_x + green_y > 1.0) - { - png_warning(png_ptr, "Invalid cHRM green point specified"); - return; - } - itemp = (png_uint_32)(green_x * 100000.0 + 0.5); - png_save_uint_32(buf + 16, itemp); - itemp = (png_uint_32)(green_y * 100000.0 + 0.5); - png_save_uint_32(buf + 20, itemp); - - if (blue_x < 0 || blue_x > 0.8 || blue_y < 0 || blue_y > 0.8 || - blue_x + blue_y > 1.0) - { - png_warning(png_ptr, "Invalid cHRM blue point specified"); - return; - } - itemp = (png_uint_32)(blue_x * 100000.0 + 0.5); - png_save_uint_32(buf + 24, itemp); - itemp = (png_uint_32)(blue_y * 100000.0 + 0.5); - png_save_uint_32(buf + 28, itemp); - - png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -void /* PRIVATE */ -png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x, - png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y, - png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x, - png_fixed_point blue_y) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_cHRM; -#endif - png_byte buf[32]; - - png_debug(1, "in png_write_cHRM\n"); - /* each value is saved in 1/100,000ths */ - if (white_x > 80000L || white_y > 80000L || white_x + white_y > 100000L) - { - png_warning(png_ptr, "Invalid fixed cHRM white point specified"); -#if !defined(PNG_NO_CONSOLE_IO) - fprintf(stderr,"white_x=%ld, white_y=%ld\n",white_x, white_y); -#endif - return; - } - png_save_uint_32(buf, (png_uint_32)white_x); - png_save_uint_32(buf + 4, (png_uint_32)white_y); - - if (red_x > 80000L || red_y > 80000L || red_x + red_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM fixed red point specified"); - return; - } - png_save_uint_32(buf + 8, (png_uint_32)red_x); - png_save_uint_32(buf + 12, (png_uint_32)red_y); - - if (green_x > 80000L || green_y > 80000L || green_x + green_y > 100000L) - { - png_warning(png_ptr, "Invalid fixed cHRM green point specified"); - return; - } - png_save_uint_32(buf + 16, (png_uint_32)green_x); - png_save_uint_32(buf + 20, (png_uint_32)green_y); - - if (blue_x > 80000L || blue_y > 80000L || blue_x + blue_y > 100000L) - { - png_warning(png_ptr, "Invalid fixed cHRM blue point specified"); - return; - } - png_save_uint_32(buf + 24, (png_uint_32)blue_x); - png_save_uint_32(buf + 28, (png_uint_32)blue_y); - - png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); -} -#endif -#endif - -#if defined(PNG_WRITE_tRNS_SUPPORTED) -/* write the tRNS chunk */ -void /* PRIVATE */ -png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran, - int num_trans, int color_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_tRNS; -#endif - png_byte buf[6]; - - png_debug(1, "in png_write_tRNS\n"); - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette) - { - png_warning(png_ptr,"Invalid number of transparent colors specified"); - return; - } - /* write the chunk out as it is */ - png_write_chunk(png_ptr, (png_bytep)png_tRNS, trans, (png_size_t)num_trans); - } - else if (color_type == PNG_COLOR_TYPE_GRAY) - { - /* one 16 bit value */ - if(tran->gray >= (1 << png_ptr->bit_depth)) - { - png_warning(png_ptr, - "Ignoring attempt to write tRNS chunk out-of-range for bit_depth"); - return; - } - png_save_uint_16(buf, tran->gray); - png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)2); - } - else if (color_type == PNG_COLOR_TYPE_RGB) - { - /* three 16 bit values */ - png_save_uint_16(buf, tran->red); - png_save_uint_16(buf + 2, tran->green); - png_save_uint_16(buf + 4, tran->blue); - if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) - { - png_warning(png_ptr, - "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8"); - return; - } - png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)6); - } - else - { - png_warning(png_ptr, "Can't write tRNS with an alpha channel"); - } -} -#endif - -#if defined(PNG_WRITE_bKGD_SUPPORTED) -/* write the background chunk */ -void /* PRIVATE */ -png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_bKGD; -#endif - png_byte buf[6]; - - png_debug(1, "in png_write_bKGD\n"); - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - if ( -#if defined(PNG_MNG_FEATURES_SUPPORTED) - (png_ptr->num_palette || - (!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) && -#endif - back->index > png_ptr->num_palette) - { - png_warning(png_ptr, "Invalid background palette index"); - return; - } - buf[0] = back->index; - png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)1); - } - else if (color_type & PNG_COLOR_MASK_COLOR) - { - png_save_uint_16(buf, back->red); - png_save_uint_16(buf + 2, back->green); - png_save_uint_16(buf + 4, back->blue); - if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) - { - png_warning(png_ptr, - "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); - return; - } - png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)6); - } - else - { - if(back->gray >= (1 << png_ptr->bit_depth)) - { - png_warning(png_ptr, - "Ignoring attempt to write bKGD chunk out-of-range for bit_depth"); - return; - } - png_save_uint_16(buf, back->gray); - png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)2); - } -} -#endif - -#if defined(PNG_WRITE_hIST_SUPPORTED) -/* write the histogram */ -void /* PRIVATE */ -png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_hIST; -#endif - int i; - png_byte buf[3]; - - png_debug(1, "in png_write_hIST\n"); - if (num_hist > (int)png_ptr->num_palette) - { - png_debug2(3, "num_hist = %d, num_palette = %d\n", num_hist, - png_ptr->num_palette); - png_warning(png_ptr, "Invalid number of histogram entries specified"); - return; - } - - png_write_chunk_start(png_ptr, (png_bytep)png_hIST, (png_uint_32)(num_hist * 2)); - for (i = 0; i < num_hist; i++) - { - png_save_uint_16(buf, hist[i]); - png_write_chunk_data(png_ptr, buf, (png_size_t)2); - } - png_write_chunk_end(png_ptr); -} -#endif - -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ - defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) -/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification, - * and if invalid, correct the keyword rather than discarding the entire - * chunk. The PNG 1.0 specification requires keywords 1-79 characters in - * length, forbids leading or trailing whitespace, multiple internal spaces, - * and the non-break space (0x80) from ISO 8859-1. Returns keyword length. - * - * The new_key is allocated to hold the corrected keyword and must be freed - * by the calling routine. This avoids problems with trying to write to - * static keywords without having to have duplicate copies of the strings. - */ -png_size_t /* PRIVATE */ -png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key) -{ - png_size_t key_len; - png_charp kp, dp; - int kflag; - int kwarn=0; - - png_debug(1, "in png_check_keyword\n"); - *new_key = NULL; - - if (key == NULL || (key_len = png_strlen(key)) == 0) - { - png_warning(png_ptr, "zero length keyword"); - return ((png_size_t)0); - } - - png_debug1(2, "Keyword to be checked is '%s'\n", key); - - *new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2)); - if (*new_key == NULL) - { - png_warning(png_ptr, "Out of memory while procesing keyword"); - return ((png_size_t)0); - } - - /* Replace non-printing characters with a blank and print a warning */ - for (kp = key, dp = *new_key; *kp != '\0'; kp++, dp++) - { - if (*kp < 0x20 || (*kp > 0x7E && (png_byte)*kp < 0xA1)) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[40]; - - sprintf(msg, "invalid keyword character 0x%02X", *kp); - png_warning(png_ptr, msg); -#else - png_warning(png_ptr, "invalid character in keyword"); -#endif - *dp = ' '; - } - else - { - *dp = *kp; - } - } - *dp = '\0'; - - /* Remove any trailing white space. */ - kp = *new_key + key_len - 1; - if (*kp == ' ') - { - png_warning(png_ptr, "trailing spaces removed from keyword"); - - while (*kp == ' ') - { - *(kp--) = '\0'; - key_len--; - } - } - - /* Remove any leading white space. */ - kp = *new_key; - if (*kp == ' ') - { - png_warning(png_ptr, "leading spaces removed from keyword"); - - while (*kp == ' ') - { - kp++; - key_len--; - } - } - - png_debug1(2, "Checking for multiple internal spaces in '%s'\n", kp); - - /* Remove multiple internal spaces. */ - for (kflag = 0, dp = *new_key; *kp != '\0'; kp++) - { - if (*kp == ' ' && kflag == 0) - { - *(dp++) = *kp; - kflag = 1; - } - else if (*kp == ' ') - { - key_len--; - kwarn=1; - } - else - { - *(dp++) = *kp; - kflag = 0; - } - } - *dp = '\0'; - if(kwarn) - png_warning(png_ptr, "extra interior spaces removed from keyword"); - - if (key_len == 0) - { - png_free(png_ptr, *new_key); - *new_key=NULL; - png_warning(png_ptr, "Zero length keyword"); - } - - if (key_len > 79) - { - png_warning(png_ptr, "keyword length must be 1 - 79 characters"); - new_key[79] = '\0'; - key_len = 79; - } - - return (key_len); -} -#endif - -#if defined(PNG_WRITE_tEXt_SUPPORTED) -/* write a tEXt chunk */ -void /* PRIVATE */ -png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text, - png_size_t text_len) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_tEXt; -#endif - png_size_t key_len; - png_charp new_key; - - png_debug(1, "in png_write_tEXt\n"); - if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) - { - png_warning(png_ptr, "Empty keyword in tEXt chunk"); - return; - } - - if (text == NULL || *text == '\0') - text_len = 0; - else - text_len = png_strlen(text); - - /* make sure we include the 0 after the key */ - png_write_chunk_start(png_ptr, (png_bytep)png_tEXt, (png_uint_32)key_len+text_len+1); - /* - * We leave it to the application to meet PNG-1.0 requirements on the - * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of - * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. - * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. - */ - png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1); - if (text_len) - png_write_chunk_data(png_ptr, (png_bytep)text, text_len); - - png_write_chunk_end(png_ptr); - png_free(png_ptr, new_key); -} -#endif - -#if defined(PNG_WRITE_zTXt_SUPPORTED) -/* write a compressed text chunk */ -void /* PRIVATE */ -png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text, - png_size_t text_len, int compression) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_zTXt; -#endif - png_size_t key_len; - char buf[1]; - png_charp new_key; - compression_state comp; - - png_debug(1, "in png_write_zTXt\n"); - - if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) - { - png_warning(png_ptr, "Empty keyword in zTXt chunk"); - return; - } - - if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE) - { - png_write_tEXt(png_ptr, new_key, text, (png_size_t)0); - png_free(png_ptr, new_key); - return; - } - - text_len = png_strlen(text); - - png_free(png_ptr, new_key); - - /* compute the compressed data; do it now for the length */ - text_len = png_text_compress(png_ptr, text, text_len, compression, - &comp); - - /* write start of chunk */ - png_write_chunk_start(png_ptr, (png_bytep)png_zTXt, (png_uint_32) - (key_len+text_len+2)); - /* write key */ - png_write_chunk_data(png_ptr, (png_bytep)key, key_len + 1); - buf[0] = (png_byte)compression; - /* write compression */ - png_write_chunk_data(png_ptr, (png_bytep)buf, (png_size_t)1); - /* write the compressed data */ - png_write_compressed_data_out(png_ptr, &comp); - - /* close the chunk */ - png_write_chunk_end(png_ptr); -} -#endif - -#if defined(PNG_WRITE_iTXt_SUPPORTED) -/* write an iTXt chunk */ -void /* PRIVATE */ -png_write_iTXt(png_structp png_ptr, int compression, png_charp key, - png_charp lang, png_charp lang_key, png_charp text) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_iTXt; -#endif - png_size_t lang_len, key_len, lang_key_len, text_len; - png_charp new_lang, new_key; - png_byte cbuf[2]; - compression_state comp; - - png_debug(1, "in png_write_iTXt\n"); - - if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) - { - png_warning(png_ptr, "Empty keyword in iTXt chunk"); - return; - } - if (lang == NULL || (lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0) - { - png_warning(png_ptr, "Empty language field in iTXt chunk"); - new_lang = NULL; - lang_len = 0; - } - - if (lang_key == NULL) - lang_key_len = 0; - else - lang_key_len = png_strlen(lang_key); - - if (text == NULL) - text_len = 0; - else - text_len = png_strlen(text); - - /* compute the compressed data; do it now for the length */ - text_len = png_text_compress(png_ptr, text, text_len, compression-2, - &comp); - - - /* make sure we include the compression flag, the compression byte, - * and the NULs after the key, lang, and lang_key parts */ - - png_write_chunk_start(png_ptr, (png_bytep)png_iTXt, - (png_uint_32)( - 5 /* comp byte, comp flag, terminators for key, lang and lang_key */ - + key_len - + lang_len - + lang_key_len - + text_len)); - - /* - * We leave it to the application to meet PNG-1.0 requirements on the - * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of - * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. - * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. - */ - png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1); - - /* set the compression flag */ - if (compression == PNG_ITXT_COMPRESSION_NONE || \ - compression == PNG_TEXT_COMPRESSION_NONE) - cbuf[0] = 0; - else /* compression == PNG_ITXT_COMPRESSION_zTXt */ - cbuf[0] = 1; - /* set the compression method */ - cbuf[1] = 0; - png_write_chunk_data(png_ptr, cbuf, 2); - - cbuf[0] = 0; - png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf), lang_len + 1); - png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf), lang_key_len + 1); - png_write_compressed_data_out(png_ptr, &comp); - - png_write_chunk_end(png_ptr); - png_free(png_ptr, new_key); - if (new_lang) - png_free(png_ptr, new_lang); -} -#endif - -#if defined(PNG_WRITE_oFFs_SUPPORTED) -/* write the oFFs chunk */ -void /* PRIVATE */ -png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, - int unit_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_oFFs; -#endif - png_byte buf[9]; - - png_debug(1, "in png_write_oFFs\n"); - if (unit_type >= PNG_OFFSET_LAST) - png_warning(png_ptr, "Unrecognized unit type for oFFs chunk"); - - png_save_int_32(buf, x_offset); - png_save_int_32(buf + 4, y_offset); - buf[8] = (png_byte)unit_type; - - png_write_chunk(png_ptr, (png_bytep)png_oFFs, buf, (png_size_t)9); -} -#endif - -#if defined(PNG_WRITE_pCAL_SUPPORTED) -/* write the pCAL chunk (described in the PNG extensions document) */ -void /* PRIVATE */ -png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, - png_int_32 X1, int type, int nparams, png_charp units, png_charpp params) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_pCAL; -#endif - png_size_t purpose_len, units_len, total_len; - png_uint_32p params_len; - png_byte buf[10]; - png_charp new_purpose; - int i; - - png_debug1(1, "in png_write_pCAL (%d parameters)\n", nparams); - if (type >= PNG_EQUATION_LAST) - png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); - - purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1; - png_debug1(3, "pCAL purpose length = %d\n", (int)purpose_len); - units_len = png_strlen(units) + (nparams == 0 ? 0 : 1); - png_debug1(3, "pCAL units length = %d\n", (int)units_len); - total_len = purpose_len + units_len + 10; - - params_len = (png_uint_32p)png_malloc(png_ptr, (png_uint_32)(nparams - *png_sizeof(png_uint_32))); - - /* Find the length of each parameter, making sure we don't count the - null terminator for the last parameter. */ - for (i = 0; i < nparams; i++) - { - params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1); - png_debug2(3, "pCAL parameter %d length = %lu\n", i, params_len[i]); - total_len += (png_size_t)params_len[i]; - } - - png_debug1(3, "pCAL total length = %d\n", (int)total_len); - png_write_chunk_start(png_ptr, (png_bytep)png_pCAL, (png_uint_32)total_len); - png_write_chunk_data(png_ptr, (png_bytep)new_purpose, purpose_len); - png_save_int_32(buf, X0); - png_save_int_32(buf + 4, X1); - buf[8] = (png_byte)type; - buf[9] = (png_byte)nparams; - png_write_chunk_data(png_ptr, buf, (png_size_t)10); - png_write_chunk_data(png_ptr, (png_bytep)units, (png_size_t)units_len); - - png_free(png_ptr, new_purpose); - - for (i = 0; i < nparams; i++) - { - png_write_chunk_data(png_ptr, (png_bytep)params[i], - (png_size_t)params_len[i]); - } - - png_free(png_ptr, params_len); - png_write_chunk_end(png_ptr); -} -#endif - -#if defined(PNG_WRITE_sCAL_SUPPORTED) -/* write the sCAL chunk */ -#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) -void /* PRIVATE */ -png_write_sCAL(png_structp png_ptr, int unit, double width,double height) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sCAL; -#endif - png_size_t total_len; - char wbuf[32], hbuf[32]; - png_byte bunit = unit; - - png_debug(1, "in png_write_sCAL\n"); - -#if defined(_WIN32_WCE) -/* sprintf() function is not supported on WindowsCE */ - { - wchar_t wc_buf[32]; - swprintf(wc_buf, TEXT("%12.12e"), width); - WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, wbuf, 32, NULL, NULL); - swprintf(wc_buf, TEXT("%12.12e"), height); - WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, hbuf, 32, NULL, NULL); - } -#else - sprintf(wbuf, "%12.12e", width); - sprintf(hbuf, "%12.12e", height); -#endif - total_len = 1 + png_strlen(wbuf)+1 + png_strlen(hbuf); - - png_debug1(3, "sCAL total length = %d\n", (int)total_len); - png_write_chunk_start(png_ptr, (png_bytep)png_sCAL, (png_uint_32)total_len); - png_write_chunk_data(png_ptr, (png_bytep)&bunit, 1); - png_write_chunk_data(png_ptr, (png_bytep)wbuf, png_strlen(wbuf)+1); - png_write_chunk_data(png_ptr, (png_bytep)hbuf, png_strlen(hbuf)); - - png_write_chunk_end(png_ptr); -} -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -void /* PRIVATE */ -png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width, - png_charp height) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sCAL; -#endif - png_size_t total_len; - char wbuf[32], hbuf[32]; - png_byte bunit = unit; - - png_debug(1, "in png_write_sCAL_s\n"); - - png_strcpy(wbuf,(const char *)width); - png_strcpy(hbuf,(const char *)height); - total_len = 1 + png_strlen(wbuf)+1 + png_strlen(hbuf); - - png_debug1(3, "sCAL total length = %d\n", total_len); - png_write_chunk_start(png_ptr, (png_bytep)png_sCAL, (png_uint_32)total_len); - png_write_chunk_data(png_ptr, (png_bytep)&bunit, 1); - png_write_chunk_data(png_ptr, (png_bytep)wbuf, png_strlen(wbuf)+1); - png_write_chunk_data(png_ptr, (png_bytep)hbuf, png_strlen(hbuf)); - - png_write_chunk_end(png_ptr); -} -#endif -#endif -#endif - -#if defined(PNG_WRITE_pHYs_SUPPORTED) -/* write the pHYs chunk */ -void /* PRIVATE */ -png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit, - png_uint_32 y_pixels_per_unit, - int unit_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_pHYs; -#endif - png_byte buf[9]; - - png_debug(1, "in png_write_pHYs\n"); - if (unit_type >= PNG_RESOLUTION_LAST) - png_warning(png_ptr, "Unrecognized unit type for pHYs chunk"); - - png_save_uint_32(buf, x_pixels_per_unit); - png_save_uint_32(buf + 4, y_pixels_per_unit); - buf[8] = (png_byte)unit_type; - - png_write_chunk(png_ptr, (png_bytep)png_pHYs, buf, (png_size_t)9); -} -#endif - -#if defined(PNG_WRITE_tIME_SUPPORTED) -/* Write the tIME chunk. Use either png_convert_from_struct_tm() - * or png_convert_from_time_t(), or fill in the structure yourself. - */ -void /* PRIVATE */ -png_write_tIME(png_structp png_ptr, png_timep mod_time) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_tIME; -#endif - png_byte buf[7]; - - png_debug(1, "in png_write_tIME\n"); - if (mod_time->month > 12 || mod_time->month < 1 || - mod_time->day > 31 || mod_time->day < 1 || - mod_time->hour > 23 || mod_time->second > 60) - { - png_warning(png_ptr, "Invalid time specified for tIME chunk"); - return; - } - - png_save_uint_16(buf, mod_time->year); - buf[2] = mod_time->month; - buf[3] = mod_time->day; - buf[4] = mod_time->hour; - buf[5] = mod_time->minute; - buf[6] = mod_time->second; - - png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7); -} -#endif - -/* initializes the row writing capability of libpng */ -void /* PRIVATE */ -png_write_start_row(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif - - png_size_t buf_size; - - png_debug(1, "in png_write_start_row\n"); - buf_size = (png_size_t)(PNG_ROWBYTES( - png_ptr->usr_channels*png_ptr->usr_bit_depth,png_ptr->width)+1); - - /* set up row buffer */ - png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size); - png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE; - - /* set up filtering buffer, if using this filter */ - if (png_ptr->do_filter & PNG_FILTER_SUB) - { - png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; - } - - /* We only need to keep the previous row if we are using one of these. */ - if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) - { - /* set up previous row buffer */ - png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size); - png_memset(png_ptr->prev_row, 0, buf_size); - - if (png_ptr->do_filter & PNG_FILTER_UP) - { - png_ptr->up_row = (png_bytep )png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; - } - - if (png_ptr->do_filter & PNG_FILTER_AVG) - { - png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; - } - - if (png_ptr->do_filter & PNG_FILTER_PAETH) - { - png_ptr->paeth_row = (png_bytep )png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; - } - } - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - /* if interlaced, we need to set up width and height of pass */ - if (png_ptr->interlaced) - { - if (!(png_ptr->transformations & PNG_INTERLACE)) - { - png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - - png_pass_ystart[0]) / png_pass_yinc[0]; - png_ptr->usr_width = (png_ptr->width + png_pass_inc[0] - 1 - - png_pass_start[0]) / png_pass_inc[0]; - } - else - { - png_ptr->num_rows = png_ptr->height; - png_ptr->usr_width = png_ptr->width; - } - } - else -#endif - { - png_ptr->num_rows = png_ptr->height; - png_ptr->usr_width = png_ptr->width; - } - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_out = png_ptr->zbuf; -} - -/* Internal use only. Called when finished processing a row of data. */ -void /* PRIVATE */ -png_write_finish_row(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif - - int ret; - - png_debug(1, "in png_write_finish_row\n"); - /* next row */ - png_ptr->row_number++; - - /* see if we are done */ - if (png_ptr->row_number < png_ptr->num_rows) - return; - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - /* if interlaced, go to next pass */ - if (png_ptr->interlaced) - { - png_ptr->row_number = 0; - if (png_ptr->transformations & PNG_INTERLACE) - { - png_ptr->pass++; - } - else - { - /* loop until we find a non-zero width or height pass */ - do - { - png_ptr->pass++; - if (png_ptr->pass >= 7) - break; - png_ptr->usr_width = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - png_ptr->num_rows = (png_ptr->height + - png_pass_yinc[png_ptr->pass] - 1 - - png_pass_ystart[png_ptr->pass]) / - png_pass_yinc[png_ptr->pass]; - if (png_ptr->transformations & PNG_INTERLACE) - break; - } while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0); - - } - - /* reset the row above the image for the next pass */ - if (png_ptr->pass < 7) - { - if (png_ptr->prev_row != NULL) - png_memset(png_ptr->prev_row, 0, - (png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels* - png_ptr->usr_bit_depth,png_ptr->width))+1); - return; - } - } -#endif - - /* if we get here, we've just written the last row, so we need - to flush the compressor */ - do - { - /* tell the compressor we are done */ - ret = deflate(&png_ptr->zstream, Z_FINISH); - /* check for an error */ - if (ret == Z_OK) - { - /* check to see if we need more room */ - if (!(png_ptr->zstream.avail_out)) - { - png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - } - else if (ret != Z_STREAM_END) - { - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - } while (ret != Z_STREAM_END); - - /* write any extra space */ - if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) - { - png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - - png_ptr->zstream.avail_out); - } - - deflateReset(&png_ptr->zstream); - png_ptr->zstream.data_type = Z_BINARY; -} - -#if defined(PNG_WRITE_INTERLACING_SUPPORTED) -/* Pick out the correct pixels for the interlace pass. - * The basic idea here is to go through the row with a source - * pointer and a destination pointer (sp and dp), and copy the - * correct pixels for the pass. As the row gets compacted, - * sp will always be >= dp, so we should never overwrite anything. - * See the default: case for the easiest code to understand. - */ -void /* PRIVATE */ -png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -#endif - - png_debug(1, "in png_do_write_interlace\n"); - /* we don't have to do anything on the last pass (6) */ -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL && pass < 6) -#else - if (pass < 6) -#endif - { - /* each pixel depth is handled separately */ - switch (row_info->pixel_depth) - { - case 1: - { - png_bytep sp; - png_bytep dp; - int shift; - int d; - int value; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - dp = row; - d = 0; - shift = 7; - for (i = png_pass_start[pass]; i < row_width; - i += png_pass_inc[pass]) - { - sp = row + (png_size_t)(i >> 3); - value = (int)(*sp >> (7 - (int)(i & 0x07))) & 0x01; - d |= (value << shift); - - if (shift == 0) - { - shift = 7; - *dp++ = (png_byte)d; - d = 0; - } - else - shift--; - - } - if (shift != 7) - *dp = (png_byte)d; - break; - } - case 2: - { - png_bytep sp; - png_bytep dp; - int shift; - int d; - int value; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - dp = row; - shift = 6; - d = 0; - for (i = png_pass_start[pass]; i < row_width; - i += png_pass_inc[pass]) - { - sp = row + (png_size_t)(i >> 2); - value = (*sp >> ((3 - (int)(i & 0x03)) << 1)) & 0x03; - d |= (value << shift); - - if (shift == 0) - { - shift = 6; - *dp++ = (png_byte)d; - d = 0; - } - else - shift -= 2; - } - if (shift != 6) - *dp = (png_byte)d; - break; - } - case 4: - { - png_bytep sp; - png_bytep dp; - int shift; - int d; - int value; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - dp = row; - shift = 4; - d = 0; - for (i = png_pass_start[pass]; i < row_width; - i += png_pass_inc[pass]) - { - sp = row + (png_size_t)(i >> 1); - value = (*sp >> ((1 - (int)(i & 0x01)) << 2)) & 0x0f; - d |= (value << shift); - - if (shift == 0) - { - shift = 4; - *dp++ = (png_byte)d; - d = 0; - } - else - shift -= 4; - } - if (shift != 4) - *dp = (png_byte)d; - break; - } - default: - { - png_bytep sp; - png_bytep dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - png_size_t pixel_bytes; - - /* start at the beginning */ - dp = row; - /* find out how many bytes each pixel takes up */ - pixel_bytes = (row_info->pixel_depth >> 3); - /* loop through the row, only looking at the pixels that - matter */ - for (i = png_pass_start[pass]; i < row_width; - i += png_pass_inc[pass]) - { - /* find out where the original pixel is */ - sp = row + (png_size_t)i * pixel_bytes; - /* move the pixel */ - if (dp != sp) - png_memcpy(dp, sp, pixel_bytes); - /* next pixel */ - dp += pixel_bytes; - } - break; - } - } - /* set new row width */ - row_info->width = (row_info->width + - png_pass_inc[pass] - 1 - - png_pass_start[pass]) / - png_pass_inc[pass]; - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, - row_info->width); - } -} -#endif - -/* This filters the row, chooses which filter to use, if it has not already - * been specified by the application, and then writes the row out with the - * chosen filter. - */ -#define PNG_MAXSUM (((png_uint_32)(-1)) >> 1) -#define PNG_HISHIFT 10 -#define PNG_LOMASK ((png_uint_32)0xffffL) -#define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT)) -void /* PRIVATE */ -png_write_find_filter(png_structp png_ptr, png_row_infop row_info) -{ - png_bytep prev_row, best_row, row_buf; - png_uint_32 mins, bpp; - png_byte filter_to_do = png_ptr->do_filter; - png_uint_32 row_bytes = row_info->rowbytes; -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - int num_p_filters = (int)png_ptr->num_prev_filters; -#endif - - png_debug(1, "in png_write_find_filter\n"); - /* find out how many bytes offset each pixel is */ - bpp = (row_info->pixel_depth + 7) >> 3; - - prev_row = png_ptr->prev_row; - best_row = row_buf = png_ptr->row_buf; - mins = PNG_MAXSUM; - - /* The prediction method we use is to find which method provides the - * smallest value when summing the absolute values of the distances - * from zero, using anything >= 128 as negative numbers. This is known - * as the "minimum sum of absolute differences" heuristic. Other - * heuristics are the "weighted minimum sum of absolute differences" - * (experimental and can in theory improve compression), and the "zlib - * predictive" method (not implemented yet), which does test compressions - * of lines using different filter methods, and then chooses the - * (series of) filter(s) that give minimum compressed data size (VERY - * computationally expensive). - * - * GRR 980525: consider also - * (1) minimum sum of absolute differences from running average (i.e., - * keep running sum of non-absolute differences & count of bytes) - * [track dispersion, too? restart average if dispersion too large?] - * (1b) minimum sum of absolute differences from sliding average, probably - * with window size <= deflate window (usually 32K) - * (2) minimum sum of squared differences from zero or running average - * (i.e., ~ root-mean-square approach) - */ - - - /* We don't need to test the 'no filter' case if this is the only filter - * that has been chosen, as it doesn't actually do anything to the data. - */ - if ((filter_to_do & PNG_FILTER_NONE) && - filter_to_do != PNG_FILTER_NONE) - { - png_bytep rp; - png_uint_32 sum = 0; - png_uint_32 i; - int v; - - for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++) - { - v = *rp; - sum += (v < 128) ? v : 256 - v; - } - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - png_uint_32 sumhi, sumlo; - int j; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */ - - /* Reduce the sum if we match any of the previous rows */ - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - /* Factor in the cost of this filter (this is here for completeness, - * but it makes no sense to have a "cost" for the NONE filter, as - * it has the minimum possible computational cost - none). - */ - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> - PNG_COST_SHIFT; - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - mins = sum; - } - - /* sub filter */ - if (filter_to_do == PNG_FILTER_SUB) - /* it's the only filter so no testing is needed */ - { - png_bytep rp, lp, dp; - png_uint_32 i; - for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; - i++, rp++, dp++) - { - *dp = *rp; - } - for (lp = row_buf + 1; i < row_bytes; - i++, rp++, lp++, dp++) - { - *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); - } - best_row = png_ptr->sub_row; - } - - else if (filter_to_do & PNG_FILTER_SUB) - { - png_bytep rp, dp, lp; - png_uint_32 sum = 0, lmins = mins; - png_uint_32 i; - int v; - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - /* We temporarily increase the "minimum sum" by the factor we - * would reduce the sum of this filter, so that we can do the - * early exit comparison without scaling the sum each time. - */ - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - - for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; - i++, rp++, dp++) - { - v = *dp = *rp; - - sum += (v < 128) ? v : 256 - v; - } - for (lp = row_buf + 1; i < row_bytes; - i++, rp++, lp++, dp++) - { - v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); - - sum += (v < 128) ? v : 256 - v; - - if (sum > lmins) /* We are already worse, don't continue. */ - break; - } - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) - { - sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - - if (sum < mins) - { - mins = sum; - best_row = png_ptr->sub_row; - } - } - - /* up filter */ - if (filter_to_do == PNG_FILTER_UP) - { - png_bytep rp, dp, pp; - png_uint_32 i; - - for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, - pp = prev_row + 1; i < row_bytes; - i++, rp++, pp++, dp++) - { - *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); - } - best_row = png_ptr->up_row; - } - - else if (filter_to_do & PNG_FILTER_UP) - { - png_bytep rp, dp, pp; - png_uint_32 sum = 0, lmins = mins; - png_uint_32 i; - int v; - - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - - for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, - pp = prev_row + 1; i < row_bytes; i++) - { - v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); - - sum += (v < 128) ? v : 256 - v; - - if (sum > lmins) /* We are already worse, don't continue. */ - break; - } - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - - if (sum < mins) - { - mins = sum; - best_row = png_ptr->up_row; - } - } - - /* avg filter */ - if (filter_to_do == PNG_FILTER_AVG) - { - png_bytep rp, dp, pp, lp; - png_uint_32 i; - for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, - pp = prev_row + 1; i < bpp; i++) - { - *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); - } - for (lp = row_buf + 1; i < row_bytes; i++) - { - *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) - & 0xff); - } - best_row = png_ptr->avg_row; - } - - else if (filter_to_do & PNG_FILTER_AVG) - { - png_bytep rp, dp, pp, lp; - png_uint_32 sum = 0, lmins = mins; - png_uint_32 i; - int v; - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - - for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, - pp = prev_row + 1; i < bpp; i++) - { - v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); - - sum += (v < 128) ? v : 256 - v; - } - for (lp = row_buf + 1; i < row_bytes; i++) - { - v = *dp++ = - (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); - - sum += (v < 128) ? v : 256 - v; - - if (sum > lmins) /* We are already worse, don't continue. */ - break; - } - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - - if (sum < mins) - { - mins = sum; - best_row = png_ptr->avg_row; - } - } - - /* Paeth filter */ - if (filter_to_do == PNG_FILTER_PAETH) - { - png_bytep rp, dp, pp, cp, lp; - png_uint_32 i; - for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, - pp = prev_row + 1; i < bpp; i++) - { - *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); - } - - for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) - { - int a, b, c, pa, pb, pc, p; - - b = *pp++; - c = *cp++; - a = *lp++; - - p = b - c; - pc = a - c; - -#ifdef PNG_USE_ABS - pa = abs(p); - pb = abs(pc); - pc = abs(p + pc); -#else - pa = p < 0 ? -p : p; - pb = pc < 0 ? -pc : pc; - pc = (p + pc) < 0 ? -(p + pc) : p + pc; -#endif - - p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; - - *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); - } - best_row = png_ptr->paeth_row; - } - - else if (filter_to_do & PNG_FILTER_PAETH) - { - png_bytep rp, dp, pp, cp, lp; - png_uint_32 sum = 0, lmins = mins; - png_uint_32 i; - int v; - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - - for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, - pp = prev_row + 1; i < bpp; i++) - { - v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); - - sum += (v < 128) ? v : 256 - v; - } - - for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) - { - int a, b, c, pa, pb, pc, p; - - b = *pp++; - c = *cp++; - a = *lp++; - -#ifndef PNG_SLOW_PAETH - p = b - c; - pc = a - c; -#ifdef PNG_USE_ABS - pa = abs(p); - pb = abs(pc); - pc = abs(p + pc); -#else - pa = p < 0 ? -p : p; - pb = pc < 0 ? -pc : pc; - pc = (p + pc) < 0 ? -(p + pc) : p + pc; -#endif - p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; -#else /* PNG_SLOW_PAETH */ - p = a + b - c; - pa = abs(p - a); - pb = abs(p - b); - pc = abs(p - c); - if (pa <= pb && pa <= pc) - p = a; - else if (pb <= pc) - p = b; - else - p = c; -#endif /* PNG_SLOW_PAETH */ - - v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); - - sum += (v < 128) ? v : 256 - v; - - if (sum > lmins) /* We are already worse, don't continue. */ - break; - } - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - - if (sum < mins) - { - best_row = png_ptr->paeth_row; - } - } - - /* Do the actual writing of the filtered row data from the chosen filter. */ - - png_write_filtered_row(png_ptr, best_row); - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - /* Save the type of filter we picked this time for future calculations */ - if (png_ptr->num_prev_filters > 0) - { - int j; - for (j = 1; j < num_p_filters; j++) - { - png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1]; - } - png_ptr->prev_filters[j] = best_row[0]; - } -#endif -} - - -/* Do the actual writing of a previously filtered row. */ -void /* PRIVATE */ -png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row) -{ - png_debug(1, "in png_write_filtered_row\n"); - png_debug1(2, "filter = %d\n", filtered_row[0]); - /* set up the zlib input buffer */ - - png_ptr->zstream.next_in = filtered_row; - png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1; - /* repeat until we have compressed all the data */ - do - { - int ret; /* return of zlib */ - - /* compress the data */ - ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); - /* check for compression errors */ - if (ret != Z_OK) - { - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - - /* see if it is time to write another IDAT */ - if (!(png_ptr->zstream.avail_out)) - { - /* write the IDAT and reset the zlib output buffer */ - png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - /* repeat until all data has been compressed */ - } while (png_ptr->zstream.avail_in); - - /* swap the current and previous rows */ - if (png_ptr->prev_row != NULL) - { - png_bytep tptr; - - tptr = png_ptr->prev_row; - png_ptr->prev_row = png_ptr->row_buf; - png_ptr->row_buf = tptr; - } - - /* finish row - updates counters and flushes zlib if last row */ - png_write_finish_row(png_ptr); - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) - png_ptr->flush_rows++; - - if (png_ptr->flush_dist > 0 && - png_ptr->flush_rows >= png_ptr->flush_dist) - { - png_write_flush(png_ptr); - } -#endif -} -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/SFML/Graphics/zlib/adler32.c b/src/SFML/Graphics/zlib/adler32.c deleted file mode 100644 index f201d670..00000000 --- a/src/SFML/Graphics/zlib/adler32.c +++ /dev/null @@ -1,149 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -#define BASE 65521UL /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* use NO_DIVIDE if your processor does not do division in hardware */ -#ifdef NO_DIVIDE -# define MOD(a) \ - do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -# define MOD4(a) \ - do { \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -# define MOD4(a) a %= BASE -#endif - -/* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ - unsigned long sum2; - unsigned n; - - /* split Adler-32 into component sums */ - sum2 = (adler >> 16) & 0xffff; - adler &= 0xffff; - - /* in case user likes doing a byte at a time, keep it fast */ - if (len == 1) { - adler += buf[0]; - if (adler >= BASE) - adler -= BASE; - sum2 += adler; - if (sum2 >= BASE) - sum2 -= BASE; - return adler | (sum2 << 16); - } - - /* initial Adler-32 value (deferred check for len == 1 speed) */ - if (buf == Z_NULL) - return 1L; - - /* in case short lengths are provided, keep it somewhat fast */ - if (len < 16) { - while (len--) { - adler += *buf++; - sum2 += adler; - } - if (adler >= BASE) - adler -= BASE; - MOD4(sum2); /* only added so many BASE's */ - return adler | (sum2 << 16); - } - - /* do length NMAX blocks -- requires just one modulo operation */ - while (len >= NMAX) { - len -= NMAX; - n = NMAX / 16; /* NMAX is divisible by 16 */ - do { - DO16(buf); /* 16 sums unrolled */ - buf += 16; - } while (--n); - MOD(adler); - MOD(sum2); - } - - /* do remaining bytes (less than NMAX, still just one modulo) */ - if (len) { /* avoid modulos if none remaining */ - while (len >= 16) { - len -= 16; - DO16(buf); - buf += 16; - } - while (len--) { - adler += *buf++; - sum2 += adler; - } - MOD(adler); - MOD(sum2); - } - - /* return recombined sums */ - return adler | (sum2 << 16); -} - -/* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off_t len2; -{ - unsigned long sum1; - unsigned long sum2; - unsigned rem; - - /* the derivation of this formula is left as an exercise for the reader */ - rem = (unsigned)(len2 % BASE); - sum1 = adler1 & 0xffff; - sum2 = rem * sum1; - MOD(sum2); - sum1 += (adler2 & 0xffff) + BASE - 1; - sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 > BASE) sum1 -= BASE; - if (sum1 > BASE) sum1 -= BASE; - if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); - if (sum2 > BASE) sum2 -= BASE; - return sum1 | (sum2 << 16); -} diff --git a/src/SFML/Graphics/zlib/compress.c b/src/SFML/Graphics/zlib/compress.c deleted file mode 100644 index d37e84f5..00000000 --- a/src/SFML/Graphics/zlib/compress.c +++ /dev/null @@ -1,79 +0,0 @@ -/* compress.c -- compress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -/* =========================================================================== - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ -int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; - int level; -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; -#ifdef MAXSEG_64K - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; -#endif - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - stream.opaque = (voidpf)0; - - err = deflateInit(&stream, level); - if (err != Z_OK) return err; - - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = deflateEnd(&stream); - return err; -} - -/* =========================================================================== - */ -int ZEXPORT compress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ - return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); -} - -/* =========================================================================== - If the default memLevel or windowBits for deflateInit() is changed, then - this function needs to be updated. - */ -uLong ZEXPORT compressBound (sourceLen) - uLong sourceLen; -{ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; -} diff --git a/src/SFML/Graphics/zlib/crc32.c b/src/SFML/Graphics/zlib/crc32.c deleted file mode 100644 index 32814c20..00000000 --- a/src/SFML/Graphics/zlib/crc32.c +++ /dev/null @@ -1,423 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id$ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "zutil.h" /* for STDC and FAR definitions */ - -#define local static - -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - -/* Definitions for doing the crc four data bytes at a time. */ -#ifdef BYFOUR -# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); -#endif /* MAKECRCH */ -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - unsigned long c; - int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (unsigned long)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = REV(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const unsigned long FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const unsigned long FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -#ifdef BYFOUR - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register u4 c; - register const u4 FAR *buf4; - - c = (u4)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register u4 c; - register const u4 FAR *buf4; - - c = REV((u4)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - buf4--; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf4++; - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(REV(c)); -} - -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ - -/* ========================================================================= */ -local unsigned long gf2_matrix_times(mat, vec) - unsigned long *mat; - unsigned long vec; -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* ========================================================================= */ -local void gf2_matrix_square(square, mat) - unsigned long *square; - unsigned long *mat; -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case */ - if (len2 == 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320L; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; -} diff --git a/src/SFML/Graphics/zlib/crc32.h b/src/SFML/Graphics/zlib/crc32.h deleted file mode 100644 index 5de49bc9..00000000 --- a/src/SFML/Graphics/zlib/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const unsigned long FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/src/SFML/Graphics/zlib/deflate.c b/src/SFML/Graphics/zlib/deflate.c deleted file mode 100644 index 529f716b..00000000 --- a/src/SFML/Graphics/zlib/deflate.c +++ /dev/null @@ -1,1736 +0,0 @@ -/* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://www.ietf.org/rfc/rfc1951.txt - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -/* @(#) $Id$ */ - -#include "deflate.h" - -const char deflate_copyright[] = - " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* =========================================================================== - * Function prototypes. - */ -typedef enum { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ -} block_state; - -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); -/* Compression function. Returns the block state after the call. */ - -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); -#ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifndef FASTEST -#ifdef ASMV - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif -#endif -local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); - -#ifdef DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); -#endif - -/* =========================================================================== - * Local data - */ - -#define NIL 0 -/* Tail of hash chains */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#endif -/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -typedef struct config_s { - ush good_length; /* reduce lazy search above this match length */ - ush max_lazy; /* do not perform lazy search above this match length */ - ush nice_length; /* quit search above this match length */ - ush max_chain; - compress_func func; -} config; - -#ifdef FASTEST -local const config configuration_table[2] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ -#else -local const config configuration_table[10] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ -/* 2 */ {4, 5, 16, 8, deflate_fast}, -/* 3 */ {4, 6, 32, 32, deflate_fast}, - -/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ -/* 5 */ {8, 16, 32, 32, deflate_slow}, -/* 6 */ {8, 16, 128, 128, deflate_slow}, -/* 7 */ {8, 32, 128, 256, deflate_slow}, -/* 8 */ {32, 128, 258, 1024, deflate_slow}, -/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ -#endif - -/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 - * For deflate_fast() (levels <= 3) good is ignored and lazy has a different - * meaning. - */ - -#define EQUAL 0 -/* result of memcmp for equal strings */ - -#ifndef NO_DUMMY_DECL -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ -#endif - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) - - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef FASTEST -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#else -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#endif - -/* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ -#define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); - -/* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ - return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ - deflate_state *s; - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } - if (strm == Z_NULL) return Z_STREAM_ERROR; - - strm->msg = Z_NULL; - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } -#ifdef GZIP - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } -#endif - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ - s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; - - s->wrap = wrap; - s->gzhead = Z_NULL; - s->w_bits = windowBits; - s->w_size = 1 << s->w_bits; - s->w_mask = s->w_size - 1; - - s->hash_bits = memLevel + 7; - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); - - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { - s->status = FINISH_STATE; - strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); - deflateEnd (strm); - return Z_MEM_ERROR; - } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - - s->level = level; - s->strategy = strategy; - s->method = (Byte)method; - - return deflateReset(strm); -} - -/* ========================================================================= */ -int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ - deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; - - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->wrap == 2 || - (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) - return Z_STREAM_ERROR; - - s = strm->state; - if (s->wrap) - strm->adler = adler32(strm->adler, dictionary, dictLength); - - if (length < MIN_MATCH) return Z_OK; - if (length > MAX_DIST(s)) { - length = MAX_DIST(s); - dictionary += dictLength - length; /* use the tail of the dictionary */ - } - zmemcpy(s->window, dictionary, length); - s->strstart = length; - s->block_start = (long)length; - - /* Insert all strings in the hash table (except for the last two bytes). - * s->lookahead stays null, so s->ins_h will be recomputed at the next - * call of fill_window. - */ - s->ins_h = s->window[0]; - UPDATE_HASH(s, s->ins_h, s->window[1]); - for (n = 0; n <= length - MIN_MATCH; n++) { - INSERT_STRING(s, n, hash_head); - } - if (hash_head) hash_head = 0; /* to make compiler happy */ - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateReset (strm) - z_streamp strm; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { - return Z_STREAM_ERROR; - } - - strm->total_in = strm->total_out = 0; - strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ - strm->data_type = Z_UNKNOWN; - - s = (deflate_state *)strm->state; - s->pending = 0; - s->pending_out = s->pending_buf; - - if (s->wrap < 0) { - s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ - } - s->status = s->wrap ? INIT_STATE : BUSY_STATE; - strm->adler = -#ifdef GZIP - s->wrap == 2 ? crc32(0L, Z_NULL, 0) : -#endif - adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; - - _tr_init(s); - lm_init(s); - - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateSetHeader (strm, head) - z_streamp strm; - gz_headerp head; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (strm->state->wrap != 2) return Z_STREAM_ERROR; - strm->state->gzhead = head; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePrime (strm, bits, value) - z_streamp strm; - int bits; - int value; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - strm->state->bi_valid = bits; - strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ - deflate_state *s; - compress_func func; - int err = Z_OK; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - func = configuration_table[s->level].func; - - if (func != configuration_table[level].func && strm->total_in != 0) { - /* Flush the last buffer: */ - err = deflate(strm, Z_PARTIAL_FLUSH); - } - if (s->level != level) { - s->level = level; - s->max_lazy_match = configuration_table[level].max_lazy; - s->good_match = configuration_table[level].good_length; - s->nice_match = configuration_table[level].nice_length; - s->max_chain_length = configuration_table[level].max_chain; - } - s->strategy = strategy; - return err; -} - -/* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) - z_streamp strm; - int good_length; - int max_lazy; - int nice_length; - int max_chain; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - s->good_match = good_length; - s->max_lazy_match = max_lazy; - s->nice_match = nice_length; - s->max_chain_length = max_chain; - return Z_OK; -} - -/* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. - * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. - * - * This function could be more sophisticated to provide closer upper bounds - * for every combination of windowBits and memLevel, as well as wrap. - * But even the conservative upper bound of about 14% expansion does not - * seem onerous for output buffer allocation. - */ -uLong ZEXPORT deflateBound(strm, sourceLen) - z_streamp strm; - uLong sourceLen; -{ - deflate_state *s; - uLong destLen; - - /* conservative upper bound */ - destLen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; - - /* if can't get parameters, return conservative bound */ - if (strm == Z_NULL || strm->state == Z_NULL) - return destLen; - - /* if not default parameters, return conservative bound */ - s = strm->state; - if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return destLen; - - /* default settings: return tight bound for that case */ - return compressBound(sourceLen); -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -local void putShortMSB (s, b) - deflate_state *s; - uInt b; -{ - put_byte(s, (Byte)(b >> 8)); - put_byte(s, (Byte)(b & 0xff)); -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). - */ -local void flush_pending(strm) - z_streamp strm; -{ - unsigned len = strm->state->pending; - - if (len > strm->avail_out) len = strm->avail_out; - if (len == 0) return; - - zmemcpy(strm->next_out, strm->state->pending_out, len); - strm->next_out += len; - strm->state->pending_out += len; - strm->total_out += len; - strm->avail_out -= len; - strm->state->pending -= len; - if (strm->state->pending == 0) { - strm->state->pending_out = strm->state->pending_buf; - } -} - -/* ========================================================================= */ -int ZEXPORT deflate (strm, flush) - z_streamp strm; - int flush; -{ - int old_flush; /* value of flush param for previous deflate call */ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_FINISH || flush < 0) { - return Z_STREAM_ERROR; - } - s = strm->state; - - if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { - ERR_RETURN(strm, Z_STREAM_ERROR); - } - if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - - s->strm = strm; /* just in case */ - old_flush = s->last_flush; - s->last_flush = flush; - - /* Write the header */ - if (s->status == INIT_STATE) { -#ifdef GZIP - if (s->wrap == 2) { - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - } - else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - else -#endif - { - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - } - } -#ifdef GZIP - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - - while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) - break; - } - put_byte(s, s->gzhead->extra[s->gzindex]); - s->gzindex++; - } - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (s->gzindex == s->gzhead->extra_len) { - s->gzindex = 0; - s->status = NAME_STATE; - } - } - else - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) { - s->gzindex = 0; - s->status = COMMENT_STATE; - } - } - else - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) - s->status = HCRC_STATE; - } - else - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) - flush_pending(strm); - if (s->pending + 2 <= s->pending_buf_size) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - } - } - else - s->status = BUSY_STATE; - } -#endif - - /* Flush as much pending output as possible */ - if (s->pending != 0) { - flush_pending(strm); - if (strm->avail_out == 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s->last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm->avail_in == 0 && flush <= old_flush && - flush != Z_FINISH) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - - bstate = (*(configuration_table[s->level].func))(s, flush); - - if (bstate == finish_started || bstate == finish_done) { - s->status = FINISH_STATE; - } - if (bstate == need_more || bstate == finish_started) { - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate == block_done) { - if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); - } else { /* FULL_FLUSH or SYNC_FLUSH */ - _tr_stored_block(s, (char*)0, 0L, 0); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush == Z_FULL_FLUSH) { - CLEAR_HASH(s); /* forget history */ - } - } - flush_pending(strm); - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - Assert(strm->avail_out > 0, "bug2"); - - if (flush != Z_FINISH) return Z_OK; - if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ -#ifdef GZIP - if (s->wrap == 2) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); - put_byte(s, (Byte)(strm->total_in & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); - } - else -#endif - { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; -} - -/* ========================================================================= */ -int ZEXPORT deflateEnd (strm) - z_streamp strm; -{ - int status; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - - status = strm->state->status; - if (status != INIT_STATE && - status != EXTRA_STATE && - status != NAME_STATE && - status != COMMENT_STATE && - status != HCRC_STATE && - status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } - - /* Deallocate in reverse order of allocations: */ - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); - TRY_FREE(strm, strm->state->window); - - ZFREE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state. - * To simplify the source, this is not supported for 16-bit MSDOS (which - * doesn't have enough memory anyway to duplicate compression states). - */ -int ZEXPORT deflateCopy (dest, source) - z_streamp dest; - z_streamp source; -{ -#ifdef MAXSEG_64K - return Z_STREAM_ERROR; -#else - deflate_state *ds; - deflate_state *ss; - ushf *overlay; - - - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { - return Z_STREAM_ERROR; - } - - ss = source->state; - - zmemcpy(dest, source, sizeof(z_stream)); - - ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; - zmemcpy(ds, ss, sizeof(deflate_state)); - ds->strm = dest; - - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { - deflateEnd (dest); - return Z_MEM_ERROR; - } - /* following zmemcpy do not work for 16-bit MSDOS */ - zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; - ds->bl_desc.dyn_tree = ds->bl_tree; - - return Z_OK; -#endif /* MAXSEG_64K */ -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local int read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, strm->next_in, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, strm->next_in, len); - } -#endif - zmemcpy(buf, strm->next_in, len); - strm->next_in += len; - strm->total_in += len; - - return (int)len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - -#ifndef FASTEST -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Posf *prev = s->prev; - uInt wmask = s->w_mask; - -#ifdef UNALIGNED_OK - /* Compare two bytes at a time. Note: this is not always beneficial. - * Try with and without -DUNALIGNED_OK to check. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); -#else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; - register Byte scan_end = scan[best_len]; -#endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - Assert(cur_match < s->strstart, "no future"); - match = s->window + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - /* This code assumes sizeof(unsigned short) == 2. Do not use - * UNALIGNED_OK if your compiler uses a different size. - */ - if (*(ushf*)(match+best_len-1) != scan_end || - *(ushf*)match != scan_start) continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++, match++; - do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - scan < strend); - /* The funny "do {}" generates better code on most compilers */ - - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - if (*scan == *match) scan++; - - len = (MAX_MATCH - 1) - (int)(strend-scan); - scan = strend - (MAX_MATCH-1); - -#else /* UNALIGNED_OK */ - - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - -#endif /* UNALIGNED_OK */ - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) break; -#ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); -#else - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; -#endif - } - } while ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if ((uInt)best_len <= s->lookahead) return (uInt)best_len; - return s->lookahead; -} -#endif /* ASMV */ -#endif /* FASTEST */ - -/* --------------------------------------------------------------------------- - * Optimized version for level == 1 or strategy == Z_RLE only - */ -local uInt longest_match_fast(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - Assert(cur_match < s->strstart, "no future"); - - match = s->window + cur_match; - - /* Return failure if the match length is less than 2: - */ - if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match += 2; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - - if (len < MIN_MATCH) return MIN_MATCH - 1; - - s->match_start = cur_match; - return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; -} - -#ifdef DEBUG -/* =========================================================================== - * Check that the match at match_start is indeed a match. - */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ - /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); - do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); - z_error("invalid match"); - } - if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); - do { putc(s->window[start++], stderr); } while (--length != 0); - } -} -#else -# define check_match(s, start, match, length) -#endif /* DEBUG */ - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) - deflate_state *s; -{ - register unsigned n, m; - register Posf *p; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - /* %%% avoid this when Z_RLE */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif - more += wsize; - } - if (s->strm->avail_in == 0) return; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); -} - -/* =========================================================================== - * Flush the current block, with given end-of-file flag. - * IN assertion: strstart is set to the end of the current match. - */ -#define FLUSH_BLOCK_ONLY(s, eof) { \ - _tr_flush_block(s, (s->block_start >= 0L ? \ - (charf *)&s->window[(unsigned)s->block_start] : \ - (charf *)Z_NULL), \ - (ulg)((long)s->strstart - s->block_start), \ - (eof)); \ - s->block_start = s->strstart; \ - flush_pending(s->strm); \ - Tracev((stderr,"[FLUSH]")); \ -} - -/* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, eof) { \ - FLUSH_BLOCK_ONLY(s, eof); \ - if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - ulg max_block_size = 0xffff; - ulg max_start; - - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); - } - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head = NIL; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ -#ifdef FASTEST - if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || - (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { - s->match_length = longest_match_fast (s, hash_head); - } -#else - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } -#endif - /* longest_match() or longest_match_fast() sets match_start */ - } - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->match_start, s->match_length); - - _tr_tally_dist(s, s->strstart - s->match_start, - s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ -#ifndef FASTEST - if (s->match_length <= s->max_insert_length && - s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in table */ - do { - s->strstart++; - INSERT_STRING(s, s->strstart, hash_head); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); - s->strstart++; - } else -#endif - { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -#ifndef FASTEST -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head = NIL; /* head of hash chain */ - int bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH-1; - - if (hash_head != NIL && s->prev_length < s->max_lazy_match && - s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } - /* longest_match() or longest_match_fast() sets match_start */ - - if (s->match_length <= 5 && (s->strategy == Z_FILTERED -#if TOO_FAR <= 32767 - || (s->match_length == MIN_MATCH && - s->strstart - s->match_start > TOO_FAR) -#endif - )) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s->match_length = MIN_MATCH-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { - uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - check_match(s, s->strstart-1, s->prev_match, s->prev_length); - - _tr_tally_dist(s, s->strstart -1 - s->prev_match, - s->prev_length - MIN_MATCH, bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s->lookahead -= s->prev_length-1; - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - INSERT_STRING(s, s->strstart, hash_head); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart++; - - if (bflush) FLUSH_BLOCK(s, 0); - - } else if (s->match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - if (bflush) { - FLUSH_BLOCK_ONLY(s, 0); - } - s->strstart++; - s->lookahead--; - if (s->strm->avail_out == 0) return need_more; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s->match_available = 1; - s->strstart++; - s->lookahead--; - } - } - Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - s->match_available = 0; - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} -#endif /* FASTEST */ - -#if 0 -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - uInt run; /* length of run */ - uInt max; /* maximum length of run */ - uInt prev; /* byte at distance one to match */ - Bytef *scan; /* scan for end of run */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest encodable run. - */ - if (s->lookahead < MAX_MATCH) { - fill_window(s); - if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - run = 0; - if (s->strstart > 0) { /* if there is a previous byte, that is */ - max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; - scan = s->window + s->strstart - 1; - prev = *scan++; - do { - if (*scan++ != prev) - break; - } while (++run < max); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (run >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, run); - _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); - s->lookahead -= run; - s->strstart += run; - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} -#endif diff --git a/src/SFML/Graphics/zlib/deflate.h b/src/SFML/Graphics/zlib/deflate.h deleted file mode 100644 index 222c53e0..00000000 --- a/src/SFML/Graphics/zlib/deflate.h +++ /dev/null @@ -1,331 +0,0 @@ -/* deflate.h -- internal compression state - * Copyright (C) 1995-2004 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef DEFLATE_H -#define DEFLATE_H - -#include "zutil.h" - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer creation by deflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip encoding - should be left enabled. */ -#ifndef NO_GZIP -# define GZIP -#endif - -/* =========================================================================== - * Internal compression state. - */ - -#define LENGTH_CODES 29 -/* number of length codes, not counting the special END_BLOCK code */ - -#define LITERALS 256 -/* number of literal bytes 0..255 */ - -#define L_CODES (LITERALS+1+LENGTH_CODES) -/* number of Literal or Length codes, including the END_BLOCK code */ - -#define D_CODES 30 -/* number of distance codes */ - -#define BL_CODES 19 -/* number of codes used to transfer the bit lengths */ - -#define HEAP_SIZE (2*L_CODES+1) -/* maximum heap size */ - -#define MAX_BITS 15 -/* All codes must not exceed MAX_BITS bits */ - -#define INIT_STATE 42 -#define EXTRA_STATE 69 -#define NAME_STATE 73 -#define COMMENT_STATE 91 -#define HCRC_STATE 103 -#define BUSY_STATE 113 -#define FINISH_STATE 666 -/* Stream status */ - - -/* Data structure describing a single value and its code string. */ -typedef struct ct_data_s { - union { - ush freq; /* frequency count */ - ush code; /* bit string */ - } fc; - union { - ush dad; /* father node in Huffman tree */ - ush len; /* length of bit string */ - } dl; -} FAR ct_data; - -#define Freq fc.freq -#define Code fc.code -#define Dad dl.dad -#define Len dl.len - -typedef struct static_tree_desc_s static_tree_desc; - -typedef struct tree_desc_s { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ -} FAR tree_desc; - -typedef ush Pos; -typedef Pos FAR Posf; -typedef unsigned IPos; - -/* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - -typedef struct internal_state { - z_streamp strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ - Bytef *pending_buf; /* output still pending */ - ulg pending_buf_size; /* size of pending_buf */ - Bytef *pending_out; /* next pending byte to output to the stream */ - uInt pending; /* nb of bytes in the pending buffer */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - gz_headerp gzhead; /* gzip header information to write */ - uInt gzindex; /* where in extra, name, or comment */ - Byte method; /* STORED (for zip only) or DEFLATED */ - int last_flush; /* value of flush param for previous deflate call */ - - /* used by deflate.c: */ - - uInt w_size; /* LZ77 window size (32K by default) */ - uInt w_bits; /* log2(w_size) (8..16) */ - uInt w_mask; /* w_size - 1 */ - - Bytef *window; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. Also, it limits - * the window size to 64K, which is quite useful on MSDOS. - * To do: use the user input buffer as sliding window. - */ - - ulg window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - Posf *prev; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - Posf *head; /* Heads of the hash chains or NIL. */ - - uInt ins_h; /* hash index of string to be inserted */ - uInt hash_size; /* number of elements in hash table */ - uInt hash_bits; /* log2(hash_size) */ - uInt hash_mask; /* hash_size-1 */ - - uInt hash_shift; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - uInt match_length; /* length of best match */ - IPos prev_match; /* previous match */ - int match_available; /* set if previous match exists */ - uInt strstart; /* start of string to insert */ - uInt match_start; /* start of matching string */ - uInt lookahead; /* number of valid bytes ahead in window */ - - uInt prev_length; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - uInt max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - uInt max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ -# define max_insert_length max_lazy_match - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - int level; /* compression level (1..9) */ - int strategy; /* favor or force Huffman coding*/ - - uInt good_match; - /* Use a faster search when the previous match is longer than this */ - - int nice_match; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - /* Didn't use ct_data typedef below to supress compiler warning */ - struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - struct tree_desc_s l_desc; /* desc. for literal tree */ - struct tree_desc_s d_desc; /* desc. for distance tree */ - struct tree_desc_s bl_desc; /* desc. for bit length tree */ - - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - int heap_len; /* number of elements in the heap */ - int heap_max; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - uch depth[2*L_CODES+1]; - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - uchf *l_buf; /* buffer for literals or lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ - uInt matches; /* number of string matches in current block */ - int last_eob_len; /* bit length of EOB code for last block */ - -#ifdef DEBUG - ulg compressed_len; /* total bit length of compressed file mod 2^32 */ - ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - - ush bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - -} FAR deflate_state; - -/* Output a byte on the stream. - * IN assertion: there is enough room in pending_buf. - */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} - - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) -/* In order to simplify the code, particularly on 16 bit machines, match - * distances are limited to MAX_DIST instead of WSIZE. - */ - - /* in trees.c */ -void _tr_init OF((deflate_state *s)); -int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); -void _tr_align OF((deflate_state *s)); -void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); - -#define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never - * used. - */ - -#ifndef DEBUG -/* Inline versions of _tr_tally for speed: */ - -#if defined(GEN_TREES_H) || !defined(STDC) - extern uch _length_code[]; - extern uch _dist_code[]; -#else - extern const uch _length_code[]; - extern const uch _dist_code[]; -#endif - -# define _tr_tally_lit(s, c, flush) \ - { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (length); \ - ush dist = (distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, distance, length) -#endif - -#endif /* DEFLATE_H */ diff --git a/src/SFML/Graphics/zlib/inffast.c b/src/SFML/Graphics/zlib/inffast.c deleted file mode 100644 index fa31cad9..00000000 --- a/src/SFML/Graphics/zlib/inffast.c +++ /dev/null @@ -1,318 +0,0 @@ -/* inffast.c -- fast decoding - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifndef ASMINF - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ -#else -# define OFF 1 -# define PUP(a) *++(a) -#endif - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ -#ifdef INFLATE_STRICT - unsigned dmax; /* maximum distance from zlib header */ -#endif - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - code this; /* retrieved table entry */ - unsigned op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned char FAR *from; /* where to copy match from */ - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; - last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; - beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); -#ifdef INFLATE_STRICT - dmax = state->dmax; -#endif - wsize = state->wsize; - whave = state->whave; - write = state->write; - window = state->window; - hold = state->hold; - bits = state->bits; - lcode = state->lencode; - dcode = state->distcode; - lmask = (1U << state->lenbits) - 1; - dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do { - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - this = lcode[hold & lmask]; - dolen: - op = (unsigned)(this.bits); - hold >>= op; - bits -= op; - op = (unsigned)(this.op); - if (op == 0) { /* literal */ - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); - PUP(out) = (unsigned char)(this.val); - } - else if (op & 16) { /* length base */ - len = (unsigned)(this.val); - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - len += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - } - Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - this = dcode[hold & dmask]; - dodist: - op = (unsigned)(this.bits); - hold >>= op; - bits -= op; - op = (unsigned)(this.op); - if (op & 16) { /* distance base */ - dist = (unsigned)(this.val); - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - } - dist += (unsigned)hold & ((1U << op) - 1); -#ifdef INFLATE_STRICT - if (dist > dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - hold >>= op; - bits -= op; - Tracevv((stderr, "inflate: distance %u\n", dist)); - op = (unsigned)(out - beg); /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - from = window - OFF; - if (write == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - else if (write < op) { /* wrap around window */ - from += wsize + write - op; - op -= write; - if (op < len) { /* some from end of window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = window - OFF; - if (write < len) { /* some from start of window */ - op = write; - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - } - else { /* contiguous in window */ - from += write - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - else { - from = out - dist; /* copy direct from output */ - do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } while (len > 2); - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - } - else if ((op & 64) == 0) { /* 2nd level distance code */ - this = dcode[this.val + (hold & ((1U << op) - 1))]; - goto dodist; - } - else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - } - else if ((op & 64) == 0) { /* 2nd level length code */ - this = lcode[this.val + (hold & ((1U << op) - 1))]; - goto dolen; - } - else if (op & 32) { /* end-of-block */ - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - } while (in < last && out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - in -= len; - bits -= len << 3; - hold &= (1U << bits) - 1; - - /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); - strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); - state->hold = hold; - state->bits = bits; - return; -} - -/* - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and write == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ - -#endif /* !ASMINF */ diff --git a/src/SFML/Graphics/zlib/inffast.h b/src/SFML/Graphics/zlib/inffast.h deleted file mode 100644 index 614fa787..00000000 --- a/src/SFML/Graphics/zlib/inffast.h +++ /dev/null @@ -1,11 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/src/SFML/Graphics/zlib/inffixed.h b/src/SFML/Graphics/zlib/inffixed.h deleted file mode 100644 index 423d5c5b..00000000 --- a/src/SFML/Graphics/zlib/inffixed.h +++ /dev/null @@ -1,94 +0,0 @@ - /* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. - */ - - static const code lenfix[512] = { - {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, - {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, - {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, - {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, - {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, - {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, - {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, - {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, - {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, - {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, - {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, - {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, - {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, - {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, - {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, - {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, - {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, - {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, - {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, - {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, - {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, - {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, - {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, - {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, - {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, - {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, - {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, - {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, - {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, - {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, - {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, - {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, - {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, - {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, - {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, - {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, - {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, - {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, - {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, - {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, - {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, - {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, - {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, - {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, - {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, - {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, - {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, - {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, - {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, - {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, - {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, - {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, - {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, - {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, - {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, - {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, - {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, - {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, - {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, - {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, - {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, - {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, - {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, - {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, - {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, - {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, - {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, - {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, - {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, - {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, - {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, - {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, - {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, - {0,9,255} - }; - - static const code distfix[32] = { - {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, - {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, - {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, - {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, - {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, - {22,5,193},{64,5,0} - }; diff --git a/src/SFML/Graphics/zlib/inflate.c b/src/SFML/Graphics/zlib/inflate.c deleted file mode 100644 index 33ea9029..00000000 --- a/src/SFML/Graphics/zlib/inflate.c +++ /dev/null @@ -1,1368 +0,0 @@ -/* inflate.c -- zlib decompression - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common write == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif -#endif - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, unsigned out)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, - unsigned len)); - -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; - state->wsize = 0; - state->whave = 0; - state->write = 0; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; - value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; - return Z_OK; -} - -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - if (windowBits < 0) { - state->wrap = 0; - windowBits = -windowBits; - } - else { - state->wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) windowBits &= 15; -#endif - } - if (windowBits < 8 || windowBits > 15) { - ZFREE(strm, state); - strm->state = Z_NULL; - return Z_STREAM_ERROR; - } - state->wbits = (unsigned)windowBits; - state->window = Z_NULL; - return inflateReset(strm); -} - -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -#ifdef MAKEFIXED -#include - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed() -{ - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, - state.distcode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -local int updatewindow(strm, out) -z_streamp strm; -unsigned out; -{ - struct inflate_state FAR *state; - unsigned copy, dist; - - state = (struct inflate_state FAR *)strm->state; - - /* if it hasn't been done already, allocate space for the window */ - if (state->window == Z_NULL) { - state->window = (unsigned char FAR *) - ZALLOC(strm, 1U << state->wbits, - sizeof(unsigned char)); - if (state->window == Z_NULL) return 1; - } - - /* if window not in use yet, initialize */ - if (state->wsize == 0) { - state->wsize = 1U << state->wbits; - state->write = 0; - state->whave = 0; - } - - /* copy state->wsize or less output bytes into the circular window */ - copy = out - strm->avail_out; - if (copy >= state->wsize) { - zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->write = 0; - state->whave = state->wsize; - } - else { - dist = state->wsize - state->write; - if (dist > copy) dist = copy; - zmemcpy(state->window + state->write, strm->next_out - copy, dist); - copy -= dist; - if (copy) { - zmemcpy(state->window, strm->next_out - copy, copy); - state->write = copy; - state->whave = state->wsize; - } - else { - state->write += dist; - if (state->write == state->wsize) state->write = 0; - if (state->whave < state->wsize) state->whave += dist; - } - } - return 0; -} - -/* Macros for inflate(): */ - -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) adler32(check, buf, len) -#endif - -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = crc32(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = crc32(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ -#define PULLBYTE() \ - do { \ - if (have == 0) goto inf_leave; \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - -/* - inflate() uses a state machine to process as much input data and generate as - much output data as possible before returning. The state machine is - structured roughly as follows: - - for (;;) switch (state) { - ... - case STATEn: - if (not enough input data or output space to make progress) - return; - ... make progress ... - state = STATEm; - break; - ... - } - - so when inflate() is called again, the same case is attempted again, and - if the appropriate resources are provided, the machine proceeds to the - next state. The NEEDBITS() macro is usually the way the state evaluates - whether it can proceed or should return. NEEDBITS() does the return if - the requested bits are not available. The typical use of the BITS macros - is: - - NEEDBITS(n); - ... do something with BITS(n) ... - DROPBITS(n); - - where NEEDBITS(n) either returns from inflate() if there isn't enough - input left to load n bits into the accumulator, or it continues. BITS(n) - gives the low n bits in the accumulator. When done, DROPBITS(n) drops - the low n bits off the accumulator. INITBITS() clears the accumulator - and sets the number of available bits to zero. BYTEBITS() discards just - enough bits to put the accumulator on a byte boundary. After BYTEBITS() - and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. - - NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return - if there is no input available. The decoding of variable length codes uses - PULLBYTE() directly in order to pull just enough bytes to decode the next - code, and no more. - - Some states loop until they get enough input, making sure that enough - state information is maintained to continue the loop where it left off - if NEEDBITS() returns in the loop. For example, want, need, and keep - would all have to actually be part of the saved state in case NEEDBITS() - returns: - - case STATEw: - while (want < need) { - NEEDBITS(n); - keep[want++] = BITS(n); - DROPBITS(n); - } - state = STATEx; - case STATEx: - - As shown above, if the next state is also the next case, then the break - is omitted. - - A state may also return if there is not enough output space available to - complete that state. Those states are copying stored data, writing a - literal byte, and copying a matching string. - - When returning, a "goto inf_leave" is used to update the total counters, - update the check value, and determine whether any progress has been made - during that inflate() call in order to return the proper return code. - Progress is defined as a change in either strm->avail_in or strm->avail_out. - When there is a window, goto inf_leave will update the window with the last - output written. If a goto inf_leave occurs in the middle of decompression - and there is no window currently, goto inf_leave will create one and copy - output to the window for the next call of inflate(). - - In this implementation, the flush parameter of inflate() only affects the - return code (per zlib.h). inflate() always writes as much as possible to - strm->next_out, given the space available and the provided input--the effect - documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers - the allocation of and copying into a sliding window until necessary, which - provides the effect documented in zlib.h for Z_FINISH when the entire input - stream available. So the only thing the flush parameter actually does is: - when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it - will return Z_BUF_ERROR if it has not reached the end of the stream. - */ - -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned in, out; /* save starting available input and output */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code this; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ -#ifdef GUNZIP - unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ -#endif - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0)) - return Z_STREAM_ERROR; - - state = (struct inflate_state FAR *)strm->state; - if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ - LOAD(); - in = have; - out = left; - ret = Z_OK; - for (;;) - switch (state->mode) { - case HEAD: - if (state->wrap == 0) { - state->mode = TYPEDO; - break; - } - NEEDBITS(16); -#ifdef GUNZIP - if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ - state->check = crc32(0L, Z_NULL, 0); - CRC2(state->check, hold); - INITBITS(); - state->mode = FLAGS; - break; - } - state->flags = 0; /* expect zlib header */ - if (state->head != Z_NULL) - state->head->done = -1; - if (!(state->wrap & 1) || /* check if zlib header allowed */ -#else - if ( -#endif - ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; - break; - } - if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - DROPBITS(4); - len = BITS(4) + 8; - if (len > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; - break; - } - state->dmax = 1U << len; - Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = hold & 0x200 ? DICTID : TYPE; - INITBITS(); - break; -#ifdef GUNZIP - case FLAGS: - NEEDBITS(16); - state->flags = (int)(hold); - if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; - break; - } - if (state->head != Z_NULL) - state->head->text = (int)((hold >> 8) & 1); - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = TIME; - case TIME: - NEEDBITS(32); - if (state->head != Z_NULL) - state->head->time = hold; - if (state->flags & 0x0200) CRC4(state->check, hold); - INITBITS(); - state->mode = OS; - case OS: - NEEDBITS(16); - if (state->head != Z_NULL) { - state->head->xflags = (int)(hold & 0xff); - state->head->os = (int)(hold >> 8); - } - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = EXLEN; - case EXLEN: - if (state->flags & 0x0400) { - NEEDBITS(16); - state->length = (unsigned)(hold); - if (state->head != Z_NULL) - state->head->extra_len = (unsigned)hold; - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - } - else if (state->head != Z_NULL) - state->head->extra = Z_NULL; - state->mode = EXTRA; - case EXTRA: - if (state->flags & 0x0400) { - copy = state->length; - if (copy > have) copy = have; - if (copy) { - if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); - } - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - state->length -= copy; - } - if (state->length) goto inf_leave; - } - state->length = 0; - state->mode = NAME; - case NAME: - if (state->flags & 0x0800) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->name != Z_NULL && - state->length < state->head->name_max) - state->head->name[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->name = Z_NULL; - state->length = 0; - state->mode = COMMENT; - case COMMENT: - if (state->flags & 0x1000) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->comment != Z_NULL && - state->length < state->head->comm_max) - state->head->comment[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->comment = Z_NULL; - state->mode = HCRC; - case HCRC: - if (state->flags & 0x0200) { - NEEDBITS(16); - if (hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; - break; - } - INITBITS(); - } - if (state->head != Z_NULL) { - state->head->hcrc = (int)((state->flags >> 9) & 1); - state->head->done = 1; - } - strm->adler = state->check = crc32(0L, Z_NULL, 0); - state->mode = TYPE; - break; -#endif - case DICTID: - NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); - INITBITS(); - state->mode = DICT; - case DICT: - if (state->havedict == 0) { - RESTORE(); - return Z_NEED_DICT; - } - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = TYPE; - case TYPE: - if (flush == Z_BLOCK) goto inf_leave; - case TYPEDO: - if (state->last) { - BYTEBITS(); - state->mode = CHECK; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - case STORED: - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - state->mode = COPY; - case COPY: - copy = state->length; - if (copy) { - if (copy > have) copy = have; - if (copy > left) copy = left; - if (copy == 0) goto inf_leave; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - break; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - case TABLE: - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - state->have = 0; - state->mode = LENLENS; - case LENLENS: - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - state->have = 0; - state->mode = CODELENS; - case CODELENS: - while (state->have < state->nlen + state->ndist) { - for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; - PULLBYTE(); - } - if (this.val < 16) { - NEEDBITS(this.bits); - DROPBITS(this.bits); - state->lens[state->have++] = this.val; - } - else { - if (this.val == 16) { - NEEDBITS(this.bits + 2); - DROPBITS(this.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = state->lens[state->have - 1]; - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (this.val == 17) { - NEEDBITS(this.bits + 3); - DROPBITS(this.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(this.bits + 7); - DROPBITS(this.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* build code tables */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - case LEN: - if (have >= 6 && left >= 258) { - RESTORE(); - inflate_fast(strm, out); - LOAD(); - break; - } - for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; - PULLBYTE(); - } - if (this.op && (this.op & 0xf0) == 0) { - last = this; - for (;;) { - this = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(this.bits); - state->length = (unsigned)this.val; - if ((int)(this.op) == 0) { - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); - state->mode = LIT; - break; - } - if (this.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - if (this.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - state->extra = (unsigned)(this.op) & 15; - state->mode = LENEXT; - case LENEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - state->mode = DIST; - case DIST: - for (;;) { - this = state->distcode[BITS(state->distbits)]; - if ((unsigned)(this.bits) <= bits) break; - PULLBYTE(); - } - if ((this.op & 0xf0) == 0) { - last = this; - for (;;) { - this = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(this.bits); - if (this.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)this.val; - state->extra = (unsigned)(this.op) & 15; - state->mode = DISTEXT; - case DISTEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } -#ifdef INFLATE_STRICT - if (state->offset > state->dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - if (state->offset > state->whave + out - left) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - state->mode = MATCH; - case MATCH: - if (left == 0) goto inf_leave; - copy = out - left; - if (state->offset > copy) { /* copy from window */ - copy = state->offset - copy; - if (copy > state->write) { - copy -= state->write; - from = state->window + (state->wsize - copy); - } - else - from = state->window + (state->write - copy); - if (copy > state->length) copy = state->length; - } - else { /* copy from output */ - from = put - state->offset; - copy = state->length; - } - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = *from++; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; - case LIT: - if (left == 0) goto inf_leave; - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - case CHECK: - if (state->wrap) { - NEEDBITS(32); - out -= left; - strm->total_out += out; - state->total += out; - if (out) - strm->adler = state->check = - UPDATE(state->check, put - out, out); - out = left; - if (( -#ifdef GUNZIP - state->flags ? hold : -#endif - REVERSE(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: check matches trailer\n")); - } -#ifdef GUNZIP - state->mode = LENGTH; - case LENGTH: - if (state->wrap && state->flags) { - NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: length matches trailer\n")); - } -#endif - state->mode = DONE; - case DONE: - ret = Z_STREAM_END; - goto inf_leave; - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - default: - return Z_STREAM_ERROR; - } - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - inf_leave: - RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) - if (updatewindow(strm, out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - in -= strm->avail_in; - out -= strm->avail_out; - strm->total_in += in; - strm->total_out += out; - state->total += out; - if (state->wrap && out) - strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0); - if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) - ret = Z_BUF_ERROR; - return ret; -} - -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->window != Z_NULL) ZFREE(strm, state->window); - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ - struct inflate_state FAR *state; - unsigned long id; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->wrap != 0 && state->mode != DICT) - return Z_STREAM_ERROR; - - /* check for correct dictionary id */ - if (state->mode == DICT) { - id = adler32(0L, Z_NULL, 0); - id = adler32(id, dictionary, dictLength); - if (id != state->check) - return Z_DATA_ERROR; - } - - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } - state->havedict = 1; - Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ - struct inflate_state FAR *state; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; - - /* save header structure */ - state->head = head; - head->done = 0; - return Z_OK; -} - -/* - Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found - or when out of input. When called, *have is the number of pattern bytes - found in order so far, in 0..3. On return *have is updated to the new - state. If on return *have equals four, then the pattern was found and the - return value is how many bytes were read including the last byte of the - pattern. If *have is less than four, then the pattern has not been found - yet and the return value is len. In the latter case, syncsearch() can be - called again with more data and the *have state. *have is initialized to - zero for the first call. - */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -unsigned char FAR *buf; -unsigned len; -{ - unsigned got; - unsigned next; - - got = *have; - next = 0; - while (next < len && got < 4) { - if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) - got++; - else if (buf[next]) - got = 0; - else - got = 4 - got; - next++; - } - *have = got; - return next; -} - -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ - unsigned len; /* number of bytes to look at or looked at */ - unsigned long in, out; /* temporary to save total_in and total_out */ - unsigned char buf[4]; /* to restore bit buffer to byte string */ - struct inflate_state FAR *state; - - /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; - - /* if first time, start search in bit buffer */ - if (state->mode != SYNC) { - state->mode = SYNC; - state->hold <<= state->bits & 7; - state->bits -= state->bits & 7; - len = 0; - while (state->bits >= 8) { - buf[len++] = (unsigned char)(state->hold); - state->hold >>= 8; - state->bits -= 8; - } - state->have = 0; - syncsearch(&(state->have), buf, len); - } - - /* search available input */ - len = syncsearch(&(state->have), strm->next_in, strm->avail_in); - strm->avail_in -= len; - strm->next_in += len; - strm->total_in += len; - - /* return no joy or set up to restart inflate() on a new block */ - if (state->have != 4) return Z_DATA_ERROR; - in = strm->total_in; out = strm->total_out; - inflateReset(strm); - strm->total_in = in; strm->total_out = out; - state->mode = TYPE; - return Z_OK; -} - -/* - Returns true if inflate is currently at the end of a block generated by - Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - implementation to provide an additional safety check. PPP uses - Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored - block. When decompressing, PPP checks that at the end of input packet, - inflate is waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; -} - -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ - struct inflate_state FAR *state; - struct inflate_state FAR *copy; - unsigned char FAR *window; - unsigned wsize; - - /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)source->state; - - /* allocate space */ - copy = (struct inflate_state FAR *) - ZALLOC(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); - if (window == Z_NULL) { - ZFREE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - zmemcpy(dest, source, sizeof(z_stream)); - zmemcpy(copy, state, sizeof(struct inflate_state)); - if (state->lencode >= state->codes && - state->lencode <= state->codes + ENOUGH - 1) { - copy->lencode = copy->codes + (state->lencode - state->codes); - copy->distcode = copy->codes + (state->distcode - state->codes); - } - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) { - wsize = 1U << state->wbits; - zmemcpy(window, state->window, wsize); - } - copy->window = window; - dest->state = (struct internal_state FAR *)copy; - return Z_OK; -} diff --git a/src/SFML/Graphics/zlib/inflate.h b/src/SFML/Graphics/zlib/inflate.h deleted file mode 100644 index fbbc8714..00000000 --- a/src/SFML/Graphics/zlib/inflate.h +++ /dev/null @@ -1,115 +0,0 @@ -/* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ -#ifndef NO_GZIP -# define GUNZIP -#endif - -/* Possible inflate modes between inflate() calls */ -typedef enum { - HEAD, /* i: waiting for magic header */ - FLAGS, /* i: waiting for method and flags (gzip) */ - TIME, /* i: waiting for modification time (gzip) */ - OS, /* i: waiting for extra flags and operating system (gzip) */ - EXLEN, /* i: waiting for extra length (gzip) */ - EXTRA, /* i: waiting for extra bytes (gzip) */ - NAME, /* i: waiting for end of file name (gzip) */ - COMMENT, /* i: waiting for end of comment (gzip) */ - HCRC, /* i: waiting for header crc (gzip) */ - DICTID, /* i: waiting for dictionary check value */ - DICT, /* waiting for inflateSetDictionary() call */ - TYPE, /* i: waiting for type bits, including last-flag bit */ - TYPEDO, /* i: same, but skip check to exit inflate on new block */ - STORED, /* i: waiting for stored size (length and complement) */ - COPY, /* i/o: waiting for input or output to copy stored block */ - TABLE, /* i: waiting for dynamic block table lengths */ - LENLENS, /* i: waiting for code length code lengths */ - CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN, /* i: waiting for length/lit code */ - LENEXT, /* i: waiting for length extra bits */ - DIST, /* i: waiting for distance code */ - DISTEXT, /* i: waiting for distance extra bits */ - MATCH, /* o: waiting for output space to copy string */ - LIT, /* o: waiting for output space to write literal */ - CHECK, /* i: waiting for 32-bit check value */ - LENGTH, /* i: waiting for 32-bit length (gzip) */ - DONE, /* finished check, done -- remain here until reset */ - BAD, /* got a data error -- remain here until reset */ - MEM, /* got an inflate() memory error -- remain here until reset */ - SYNC /* looking for synchronization bytes to restart inflate() */ -} inflate_mode; - -/* - State transitions between above modes - - - (most modes can go to the BAD or MEM mode -- not shown for clarity) - - Process header: - HEAD -> (gzip) or (zlib) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME - NAME -> COMMENT -> HCRC -> TYPE - (zlib) -> DICTID or TYPE - DICTID -> DICT -> TYPE - Read deflate blocks: - TYPE -> STORED or TABLE or LEN or CHECK - STORED -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN - Read deflate codes: - LEN -> LENEXT or LIT or TYPE - LENEXT -> DIST -> DISTEXT -> MATCH -> LEN - LIT -> LEN - Process trailer: - CHECK -> LENGTH -> DONE - */ - -/* state maintained between inflate() calls. Approximately 7K bytes. */ -struct inflate_state { - inflate_mode mode; /* current inflate mode */ - int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ - unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ - unsigned long check; /* protected copy of check value */ - unsigned long total; /* protected copy of output count */ - gz_headerp head; /* where to save gzip header information */ - /* sliding window */ - unsigned wbits; /* log base 2 of requested window size */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if needed */ - /* bit accumulator */ - unsigned long hold; /* input bit accumulator */ - unsigned bits; /* number of bits in "in" */ - /* for string and stored block copying */ - unsigned length; /* literal or length of data to copy */ - unsigned offset; /* distance back to copy string from */ - /* for table and code decoding */ - unsigned extra; /* extra bits needed */ - /* fixed and dynamic code tables */ - code const FAR *lencode; /* starting table for length/literal codes */ - code const FAR *distcode; /* starting table for distance codes */ - unsigned lenbits; /* index bits for lencode */ - unsigned distbits; /* index bits for distcode */ - /* dynamic table building */ - unsigned ncode; /* number of code length code lengths */ - unsigned nlen; /* number of length code lengths */ - unsigned ndist; /* number of distance code lengths */ - unsigned have; /* number of code lengths in lens[] */ - code FAR *next; /* next available space in codes[] */ - unsigned short lens[320]; /* temporary storage for code lengths */ - unsigned short work[288]; /* work area for code table building */ - code codes[ENOUGH]; /* space for code tables */ -}; diff --git a/src/SFML/Graphics/zlib/inftrees.c b/src/SFML/Graphics/zlib/inftrees.c deleted file mode 100644 index 38ded81c..00000000 --- a/src/SFML/Graphics/zlib/inftrees.c +++ /dev/null @@ -1,329 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#define MAXBITS 15 - -const char inflate_copyright[] = - " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* - Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, CODES, LENS, or DISTS. On return, zero is success, - -1 is an invalid code, and +1 means that ENOUGH isn't enough. table - on return points to the next available entry's address. bits is the - requested root table index bits, and on return it is the actual root - table index bits. It will differ if the request is greater than the - longest code or if it is less than the shortest code. - */ -int inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ - unsigned len; /* a code's length in bits */ - unsigned sym; /* index of code symbols */ - unsigned min, max; /* minimum and maximum code lengths */ - unsigned root; /* number of index bits for root table */ - unsigned curr; /* number of index bits for current table */ - unsigned drop; /* code bits to drop for sub-table */ - int left; /* number of prefix codes available */ - unsigned used; /* code entries in table used */ - unsigned huff; /* Huffman code */ - unsigned incr; /* for incrementing code, index */ - unsigned fill; /* index for replicating entries */ - unsigned low; /* low bits for current root entry */ - unsigned mask; /* mask for low root bits */ - code this; /* table entry for duplication */ - code FAR *next; /* next available space in table */ - const unsigned short FAR *base; /* base value table to use */ - const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ - unsigned short count[MAXBITS+1]; /* number of codes of each length */ - unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ - static const unsigned short lbase[31] = { /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - static const unsigned short lext[31] = { /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; - static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0}; - static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64}; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = MAXBITS; max >= 1; max--) - if (count[max] != 0) break; - if (root > max) root = max; - if (max == 0) { /* no symbols to code at all */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)1; - this.val = (unsigned short)0; - *(*table)++ = this; /* make a table to force an error */ - *(*table)++ = this; - *bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min <= MAXBITS; min++) - if (count[min] != 0) break; - if (root < min) root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) return -1; /* over-subscribed */ - } - if (left > 0 && (type == CODES || max != 1)) - return -1; /* incomplete set */ - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked when a LENS table is being made - against the space in *table, ENOUGH, minus the maximum space needed by - the worst case distance code, MAXD. This should never happen, but the - sufficiency of ENOUGH has not been proven exhaustively, hence the check. - This assumes that when type == LENS, bits == 9. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) { - case CODES: - base = extra = work; /* dummy value--not used */ - end = 19; - break; - case LENS: - base = lbase; - base -= 257; - extra = lext; - extra -= 257; - end = 256; - break; - default: /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - this.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { - this.op = (unsigned char)0; - this.val = work[sym]; - } - else if ((int)(work[sym]) > end) { - this.op = (unsigned char)(extra[work[sym]]); - this.val = base[work[sym]]; - } - else { - this.op = (unsigned char)(32 + 64); /* end of block */ - this.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - next[(huff >> drop) + fill] = this; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (unsigned char)curr; - (*table)[low].bits = (unsigned char)root; - (*table)[low].val = (unsigned short)(next - *table); - } - } - - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)(len - drop); - this.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - this.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = this; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - } - - /* set return parameters */ - *table += used; - *bits = root; - return 0; -} diff --git a/src/SFML/Graphics/zlib/inftrees.h b/src/SFML/Graphics/zlib/inftrees.h deleted file mode 100644 index dc0fd567..00000000 --- a/src/SFML/Graphics/zlib/inftrees.h +++ /dev/null @@ -1,55 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. */ -typedef struct { - unsigned char op; /* operation, extra bits, table bits */ - unsigned char bits; /* bits in this part of the code */ - unsigned short val; /* offset in table or code value */ -} code; - -/* op values as set by inflate_table(): - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1444 code structures (852 for length/literals - and 592 for distances, the latter actually the result of an - exhaustive search). The true maximum is not known, but the value - below is more than safe. */ -#define ENOUGH 2048 -#define MAXD 592 - -/* Type of code to build for inftable() */ -typedef enum { - CODES, - LENS, - DISTS -} codetype; - -extern int inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); diff --git a/src/SFML/Graphics/zlib/trees.c b/src/SFML/Graphics/zlib/trees.c deleted file mode 100644 index 7a048028..00000000 --- a/src/SFML/Graphics/zlib/trees.c +++ /dev/null @@ -1,1219 +0,0 @@ -/* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2005 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process uses several Huffman trees. The more - * common source values are represented by shorter bit sequences. - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * REFERENCES - * - * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". - * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc - * - * Storer, James A. - * Data Compression: Methods and Theory, pp. 49-50. - * Computer Science Press, 1988. ISBN 0-7167-8156-5. - * - * Sedgewick, R. - * Algorithms, p290. - * Addison-Wesley, 1983. ISBN 0-201-06672-6. - */ - -/* @(#) $Id$ */ - -/* #define GEN_TREES_H */ - -#include "deflate.h" - -#ifdef DEBUG -# include -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define END_BLOCK 256 -/* end of block literal code */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; - -local const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ - = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -local const uch bl_order[BL_CODES] - = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -#define Buf_size (8 * 2*sizeof(char)) -/* Number of bits used within bi_buf. (bi_buf might be implemented on - * more than 16 bits on some systems.) - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) || !defined(STDC) -/* non ANSI compilers may not accept trees.h */ - -local ct_data static_ltree[L_CODES+2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -local ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -uch _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -uch _length_code[MAX_MATCH-MIN_MATCH+1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -local int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -local int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - -struct static_tree_desc_s { - const ct_data *static_tree; /* static tree or NULL */ - const intf *extra_bits; /* extra bits for each code or NULL */ - int extra_base; /* base index for extra_bits */ - int elems; /* max number of elements in the tree */ - int max_length; /* max bit length for the codes */ -}; - -local static_tree_desc static_l_desc = -{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; - -local static_tree_desc static_d_desc = -{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; - -local static_tree_desc static_bl_desc = -{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; - -/* =========================================================================== - * Local (static) routines in this file. - */ - -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, ct_data *ltree, - ct_data *dtree)); -local void set_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); - -#ifdef GEN_TREES_H -local void gen_trees_header OF((void)); -#endif - -#ifndef DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) - /* Send a code of the given tree. c and tree must not have side effects */ - -#else /* DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ - send_bits(s, tree[c].Code, tree[c].Len); } -#endif - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -#ifdef DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ - Tracevv((stderr," l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (ulg)length; - - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (value << s->bi_valid); - put_short(s, s->bi_buf); - s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); - s->bi_valid += length - Buf_size; - } else { - s->bi_buf |= value << s->bi_valid; - s->bi_valid += length; - } -} -#else /* !DEBUG */ - -#define send_bits(s, value, length) \ -{ int len = length;\ - if (s->bi_valid > (int)Buf_size - len) {\ - int val = value;\ - s->bi_buf |= (val << s->bi_valid);\ - put_short(s, s->bi_buf);\ - s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ - s->bi_valid += len - Buf_size;\ - } else {\ - s->bi_buf |= (value) << s->bi_valid;\ - s->bi_valid += len;\ - }\ -} -#endif /* DEBUG */ - - -/* the arguments must not have side effects */ - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -local void tr_static_init() -{ -#if defined(GEN_TREES_H) || !defined(STDC) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = (uch)code; - } - } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) || !defined(STDC) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef DEBUG -# include -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() -{ - FILE *header = fopen("trees.h", "w"); - int i; - - Assert (header != NULL, "Can't open trees.h"); - fprintf(header, - "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES+2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, - static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); - } - - fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, - static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); - } - - fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); - for (i = 0; i < DIST_CODE_LEN; i++) { - fprintf(header, "%2u%s", _dist_code[i], - SEPARATOR(i, DIST_CODE_LEN-1, 20)); - } - - fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); - for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { - fprintf(header, "%2u%s", _length_code[i], - SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); - } - - fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%1u%s", base_length[i], - SEPARATOR(i, LENGTH_CODES-1, 20)); - } - - fprintf(header, "local const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5u%s", base_dist[i], - SEPARATOR(i, D_CODES-1, 10)); - } - - fclose(header); -} -#endif /* GEN_TREES_H */ - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -void _tr_init(s) - deflate_state *s; -{ - tr_static_init(); - - s->l_desc.dyn_tree = s->dyn_ltree; - s->l_desc.stat_desc = &static_l_desc; - - s->d_desc.dyn_tree = s->dyn_dtree; - s->d_desc.stat_desc = &static_d_desc; - - s->bl_desc.dyn_tree = s->bl_tree; - s->bl_desc.stat_desc = &static_bl_desc; - - s->bi_buf = 0; - s->bi_valid = 0; - s->last_eob_len = 8; /* enough lookahead for inflate */ -#ifdef DEBUG - s->compressed_len = 0L; - s->bits_sent = 0L; -#endif - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - -#define SMALLEST 1 -/* Index within the heap array of least frequent node in the Huffman tree */ - - -/* =========================================================================== - * Remove the smallest element from the heap and recreate the heap with - * one less element. Updates heap and heap_len. - */ -#define pqremove(s, tree, top) \ -{\ - top = s->heap[SMALLEST]; \ - s->heap[SMALLEST] = s->heap[s->heap_len--]; \ - pqdownheap(s, tree, SMALLEST); \ -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -#define smaller(tree, n, m, depth) \ - (tree[n].Freq < tree[m].Freq || \ - (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ - int v = s->heap[k]; - int j = k << 1; /* left son of k */ - while (j <= s->heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s->heap[j], s->depth)) break; - - /* Exchange v with the smallest son */ - s->heap[k] = s->heap[j]; k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s->heap[k] = v; -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - const ct_data *stree = desc->stat_desc->static_tree; - const intf *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; /* heap index */ - int n, m; /* iterate over the tree elements */ - int bits; /* bit length */ - int xbits; /* extra bits */ - ush f; /* frequency */ - int overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { - n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) bits = max_length, overflow++; - tree[n].Len = (ush)bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) continue; /* not a leaf node */ - - s->bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n-base]; - f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); - } - if (overflow == 0) return; - - Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length-1; - while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ - s->bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits != 0; bits--) { - n = s->bl_count[bits]; - while (n != 0) { - m = s->heap[--h]; - if (m > max_code) continue; - if ((unsigned) tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; - tree[m].Len = (ush)bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; - const ct_data *stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; /* iterate over heap elements */ - int max_code = -1; /* largest code with non zero frequency */ - int node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n].Freq != 0) { - s->heap[++(s->heap_len)] = max_code = n; - s->depth[n] = 0; - } else { - tree[n].Len = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s->heap_len < 2) { - node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); - tree[node].Freq = 1; - s->depth[node] = 0; - s->opt_len--; if (stree) s->static_len -= stree[node].Len; - /* node is 0 or 1 so it does not have extra bits */ - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - pqremove(s, tree, n); /* n = node of least frequency */ - m = s->heap[SMALLEST]; /* m = node of next least frequency */ - - s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ - s->heap[--(s->heap_max)] = m; - - /* Create a new node father of n and m */ - tree[node].Freq = tree[n].Freq + tree[m].Freq; - s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? - s->depth[n] : s->depth[m]) + 1); - tree[n].Dad = tree[m].Dad = (ush)node; -#ifdef DUMP_BL_TREE - if (tree == s->bl_tree) { - fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", - node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); - } -#endif - /* and insert the new node in the heap */ - s->heap[SMALLEST] = node++; - pqdownheap(s, tree, SMALLEST); - - } while (s->heap_len >= 2); - - s->heap[--(s->heap_max)] = s->heap[SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, (tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes ((ct_data *)tree, max_code, s->bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -local void scan_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - s->bl_tree[curlen].Freq += count; - } else if (curlen != 0) { - if (curlen != prevlen) s->bl_tree[curlen].Freq++; - s->bl_tree[REP_3_6].Freq++; - } else if (count <= 10) { - s->bl_tree[REPZ_3_10].Freq++; - } else { - s->bl_tree[REPZ_11_138].Freq++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -local void send_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen == 0) max_count = 138, min_count = 3; - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - do { send_code(s, curlen, s->bl_tree); } while (--count != 0); - - } else if (curlen != 0) { - if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); count--; - } - Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); - - } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -local int build_bl_tree(s) - deflate_state *s; -{ - int max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); - scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; - Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - int rank; /* index in bl_order */ - - Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - "too many codes"); - Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); - } - Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ - Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ - Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Send a stored block - */ -void _tr_stored_block(s, buf, stored_len, eof) - deflate_state *s; - charf *buf; /* input block */ - ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ -#ifdef DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; - s->compressed_len += (stored_len + 4) << 3; -#endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - * The current inflate code requires 9 bits of lookahead. If the - * last two codes for the previous block (real code plus EOB) were coded - * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - * the last real code. In this case we send two empty static blocks instead - * of one. (There are no problems if the previous block is stored or fixed.) - * To simplify the code, we assume the worst case of last real code encoded - * on one bit only. - */ -void _tr_align(s) - deflate_state *s; -{ - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ -#endif - bi_flush(s); - /* Of the 10 bits for the empty block, we have already sent - * (10 - bi_valid) bits. The lookahead for the last real code (before - * the EOB of the previous block) was thus at least one plus the length - * of the EOB plus what we have just sent of the empty static block. - */ - if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; -#endif - bi_flush(s); - } - s->last_eob_len = 7; -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -void _tr_flush_block(s, buf, stored_len, eof) - deflate_state *s; - charf *buf; /* input block, or NULL if too old */ - ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ -{ - ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - int max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { - - /* Check if the file is binary or text */ - if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) - set_data_type(s); - - /* Construct the literal and distance trees */ - build_tree(s, (tree_desc *)(&(s->l_desc))); - Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - - build_tree(s, (tree_desc *)(&(s->d_desc))); - Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - - } else { - Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - -#ifdef FORCE_STORED - if (buf != (char*)0) { /* force stored block */ -#else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, eof); - -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+eof, 3); - compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->static_len; -#endif - } else { - send_bits(s, (DYN_TREES<<1)+eof, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); - compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->opt_len; -#endif - } - Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (eof) { - bi_windup(s); -#ifdef DEBUG - s->compressed_len += 7; /* align on byte boundary */ -#endif - } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*eof)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int _tr_tally (s, dist, lc) - deflate_state *s; - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((ush)dist < (ush)MAX_DIST(s) && - (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - ct_data *ltree; /* literal tree */ - ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; -} - -/* =========================================================================== - * Set the data type to BINARY or TEXT, using a crude approximation: - * set it to Z_TEXT if all symbols are either printable characters (33 to 255) - * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local void set_data_type(s) - deflate_state *s; -{ - int n; - - for (n = 0; n < 9; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - if (n == 9) - for (n = 14; n < 32; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(s, buf, len, header) - deflate_state *s; - charf *buf; /* the input data */ - unsigned len; /* its length */ - int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - s->last_eob_len = 8; /* enough lookahead for inflate */ - - if (header) { - put_short(s, (ush)len); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/src/SFML/Graphics/zlib/trees.h b/src/SFML/Graphics/zlib/trees.h deleted file mode 100644 index 1ca868b8..00000000 --- a/src/SFML/Graphics/zlib/trees.h +++ /dev/null @@ -1,128 +0,0 @@ -/* header created automatically with -DGEN_TREES_H */ - -local const ct_data static_ltree[L_CODES+2] = { -{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, -{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, -{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, -{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, -{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, -{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, -{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, -{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, -{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, -{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, -{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, -{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, -{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, -{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, -{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, -{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, -{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, -{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, -{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, -{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, -{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, -{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, -{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, -{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, -{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, -{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, -{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, -{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, -{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, -{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, -{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, -{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, -{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, -{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, -{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, -{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, -{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, -{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, -{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, -{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, -{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, -{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, -{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, -{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, -{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, -{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, -{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, -{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, -{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, -{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, -{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, -{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, -{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, -{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, -{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, -{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, -{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, -{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} -}; - -local const ct_data static_dtree[D_CODES] = { -{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, -{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, -{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, -{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, -{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, -{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} -}; - -const uch _dist_code[DIST_CODE_LEN] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, -10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, -11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, -12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, -18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; - -const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, -13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, -17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, -19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, -22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; - -local const int base_length[LENGTH_CODES] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, -64, 80, 96, 112, 128, 160, 192, 224, 0 -}; - -local const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; - diff --git a/src/SFML/Graphics/zlib/uncompr.c b/src/SFML/Graphics/zlib/uncompr.c deleted file mode 100644 index ad6db0a6..00000000 --- a/src/SFML/Graphics/zlib/uncompr.c +++ /dev/null @@ -1,61 +0,0 @@ -/* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -/* =========================================================================== - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted. -*/ -int ZEXPORT uncompress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; - - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - - err = inflateInit(&stream); - if (err != Z_OK) return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) - return Z_DATA_ERROR; - return err; - } - *destLen = stream.total_out; - - err = inflateEnd(&stream); - return err; -} diff --git a/src/SFML/Graphics/zlib/zutil.c b/src/SFML/Graphics/zlib/zutil.c deleted file mode 100644 index 0f4bd787..00000000 --- a/src/SFML/Graphics/zlib/zutil.c +++ /dev/null @@ -1,318 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; - - -const char * ZEXPORT zlibVersion() -{ - return ZLIB_VERSION; -} - -uLong ZEXPORT zlibCompileFlags() -{ - uLong flags; - - flags = 0; - switch (sizeof(uInt)) { - case 2: break; - case 4: flags += 1; break; - case 8: flags += 2; break; - default: flags += 3; - } - switch (sizeof(uLong)) { - case 2: break; - case 4: flags += 1 << 2; break; - case 8: flags += 2 << 2; break; - default: flags += 3 << 2; - } - switch (sizeof(voidpf)) { - case 2: break; - case 4: flags += 1 << 4; break; - case 8: flags += 2 << 4; break; - default: flags += 3 << 4; - } - switch (sizeof(z_off_t)) { - case 2: break; - case 4: flags += 1 << 6; break; - case 8: flags += 2 << 6; break; - default: flags += 3 << 6; - } -#ifdef DEBUG - flags += 1 << 8; -#endif -#if defined(ASMV) || defined(ASMINF) - flags += 1 << 9; -#endif -#ifdef ZLIB_WINAPI - flags += 1 << 10; -#endif -#ifdef BUILDFIXED - flags += 1 << 12; -#endif -#ifdef DYNAMIC_CRC_TABLE - flags += 1 << 13; -#endif -#ifdef NO_GZCOMPRESS - flags += 1L << 16; -#endif -#ifdef NO_GZIP - flags += 1L << 17; -#endif -#ifdef PKZIP_BUG_WORKAROUND - flags += 1L << 20; -#endif -#ifdef FASTEST - flags += 1L << 21; -#endif -#ifdef STDC -# ifdef NO_vsnprintf - flags += 1L << 25; -# ifdef HAS_vsprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_vsnprintf_void - flags += 1L << 26; -# endif -# endif -#else - flags += 1L << 24; -# ifdef NO_snprintf - flags += 1L << 25; -# ifdef HAS_sprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_snprintf_void - flags += 1L << 26; -# endif -# endif -#endif - return flags; -} - -#ifdef DEBUG - -# ifndef verbose -# define verbose 0 -# endif -int z_verbose = verbose; - -void z_error (m) - char *m; -{ - fprintf(stderr, "%s\n", m); - exit(1); -} -#endif - -/* exported to allow conversion of error code to string for compress() and - * uncompress() - */ -const char * ZEXPORT zError(err) - int err; -{ - return ERR_MSG(err); -} - -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. - */ - int errno = 0; -#endif - -#ifndef HAVE_MEMCPY - -void zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; - } - return 0; -} - -void zmemzero(dest, len) - Bytef* dest; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - - -#ifdef SYS16BIT - -#ifdef __TURBOC__ -/* Turbo C in 16-bit mode */ - -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - voidpf buf = opaque; /* just to make some compilers happy */ - ulg bsize = (ulg)items*size; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush*)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; - *(ush*)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - int n; - if (*(ush*)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n-1] = table[n]; - } - next_ptr--; - return; - } - ptr = opaque; /* just to make some compilers happy */ - Assert(0, "zcfree: ptr not found"); -} - -#endif /* __TURBOC__ */ - - -#ifdef M_I86 -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - return _halloc((long)items, size); -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - _hfree(ptr); -} - -#endif /* M_I86 */ - -#endif /* SYS16BIT */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); -#endif - -voidpf zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ - if (opaque) items += size - size; /* make compiler happy */ - return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : - (voidpf)calloc(items, size); -} - -void zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ - free(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ diff --git a/src/SFML/Graphics/zlib/zutil.h b/src/SFML/Graphics/zlib/zutil.h deleted file mode 100644 index 0ba6e020..00000000 --- a/src/SFML/Graphics/zlib/zutil.h +++ /dev/null @@ -1,269 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef ZUTIL_H -#define ZUTIL_H - -#define ZLIB_INTERNAL -#include "zlib.h" - -#ifdef STDC -# ifndef _WIN32_WCE -# include -# endif -# include -# include -#endif -#ifdef NO_ERRNO_H -# ifdef _WIN32_WCE - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. We rename it to - * avoid conflict with other libraries that use the same workaround. - */ -# define errno z_errno -# endif - extern int errno; -#else -# ifndef _WIN32_WCE -# include -# endif -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -# define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include -# endif -# else /* MSC or DJGPP */ -# include -# endif -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -# ifdef M_I86 - #include -# endif -#endif - -#if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - - /* common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - - /* functions */ - -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# define vsnprintf _vsnprintf -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#if defined(pyr) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# define zmemzero(dest, len) memset(dest, 0, len) -# endif -#else - extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - extern void zmemzero OF((Bytef* dest, uInt len)); -#endif - -/* Diagnostic functions */ -#ifdef DEBUG -# include - extern int z_verbose; - extern void z_error OF((char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -#endif - - -voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -void zcfree OF((voidpf opaque, voidpf ptr)); - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -#endif /* ZUTIL_H */